docker镜像及容器的使用
Posted 徐中祥
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了docker镜像及容器的使用相关的知识,希望对你有一定的参考价值。
docker镜像及容器的使用
一.Docker三大概念
docker 中有三个核心概念:镜像,容器,仓库。
因此准确把握这三大概念对于掌握docker技术尤为重要。
1.镜像
Docker镜像就相当于是一个root文件系统.比如官方镜像ubuntu:16:04就包含了完整的一套Ubuntu16.04最小系统的root文件系统。
镜像就是启动一个容器的模板。
2.容器
镜像和容器的关系就像是面向对象程序设计中的类和实例一样.镜像是静态的定义容器是镜像运行时的实体.容器可以被创建,启动,停止,删除,暂停等。
容器就是对外提供服务的进程。或者容器就是镜像启动起来的一个实例。
3.仓库
仓库用来保存镜像的仓库.当我们构建好自己的镜像之后需要存放在创库中.当我们需要启动一个镜像时可以在仓库中下载下来。
仓库是用来存放镜像的地方。
二.帮助命令
docker version # 显示docker的版本信息
docker info # 显示docker的系统信息,包括镜像和容器的的数量
docker 命令 --help
官网地址:https://www.docker.com/
文档地址:https://docs.docker.com/
官网仓库地址:https://hub.docker.com/
命令的帮助文档:https://docs.docker.com/reference/
三.Docker的使用
1.Docker镜像
docker镜像是docker中三大概念之一,其主要作用是作为启动容器的模板。
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
yourredis latest 621ceef7494a 2 months ago 104MB
# 解释
REPOSITORY 镜像的仓库源
TAG 镜像的标签
IMAGE ID 镜像的ID
CREATED 镜像的创建时间
SIZE 镜像的大小
# 可选项
docker images --help
-a, --all # 列出所有镜像
-q, --quiet # 只显示镜像的ID
# 镜像标签的构成
docker.io/library/redis:latest
docker.io : 镜像仓库的URL
library :镜像仓库命名空间
redis : 镜像名称
latest : 镜像版本号
# 格式:
docker tag [镜像ID] 镜像标签
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat latest 9b256e80cf11 12 hours ago 697MB
# docker tag 9b256e80cf11 mytomcat:1.0
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
mytomcat 1.0 9b256e80cf11 12 hours ago 697MB
# 使用镜像名字查看
[root@docker ~]# docker inspect mynginx
# 使用镜像ID查看
[root@docker ~]# docker inspect f6d0b4767a6c
# 参数: -f 格式化输出
[root@docker ~]# docker inspect -f '{{.Id}}' f6d0b4767a6c
[root@docker ~]# docker inspect -f '{{.Id}}' mynginx
[root@docker ~]# docker search mysql
NAME DESCRIPTION STARS OFFICIAL AUTOMATED
mysql MySQL is a widely used, open-source relation… 10670 [OK]
# 解释
NAME 镜像名字
DESCRIPTION 镜像的描述信息
STARS 镜像收藏数量
OFFICIAL 是否是官方发布的镜像
AUTOMATED 自动构建
# 可选项
[root@docker ~]# docker search --help
-f, --filter # 过滤输出内容
--limit # 限制输出结果
--no-trunc # 不截断输出结果
# 案例
[root@docker ~]# docker search -f is-official=true mysql
[root@docker ~]# docker search -f stars=8000 mysql
[root@docker ~]# docker search -f stars=8 --limit 3 mysql
[root@docker ~]# docker search -f stars=8 --limit 3 --no-trunc mysql
[root@docker ~]# docker pull mysql[镜像名:tag]
Using default tag: latest # 如果不写版本tag 默认就是最新版latest
latest: Pulling from library/mysql
a076a628af6f: Already exists # 分层下载 docker镜像的核心 联合文件系统
f6c208f3f991: Pull complete
88a9455a9165: Pull complete
406c9b8427c6: Pull complete
7c88599c0b25: Pull complete
25b5c6debdaf: Pull complete
43a5816f1617: Pull complete
1a8c919e89bf: Pull complete
9f3cf4bd1a07: Pull complete
80539cea118d: Pull complete
201b3cad54ce: Pull complete
944ba37e1c06: Pull complete
# 镜像ID号(镜像ID号是全球唯一)
Digest: sha256:feada149cb8ff54eade1336da7c1d080c4a1c7ed82b5e320efb5beebed85ae8c
# 镜像下载状态
Status: Downloaded newer image for mysql:latest
# 真实下载地址
docker.io/library/mysql:latest
# 等价的下载方式
docker pull mysql
docker.io/library/mysql:latest
# 指定版本下载
[root@docker ~]# docker pull mysql:5.7
5.7: Pulling from library/mysql
a076a628af6f: Already exists
f6c208f3f991: Already exists
88a9455a9165: Already exists
406c9b8427c6: Already exists
7c88599c0b25: Already exists
25b5c6debdaf: Already exists
43a5816f1617: Already exists
1831ac1245f4: Pull complete
37677b8c1f79: Pull complete
27e4ac3b0f6e: Pull complete
7227baa8c445: Pull complete
Digest: sha256:b3d1eff023f698cd433695c9506171f0d08a8f92a0c8063c1a4d9db9a55808df
Status: Downloaded newer image for mysql:5.7
docker.io/library/mysql:5.7
[root@docker ~]# docker rmi c8562eaf9d81
[root@docker ~]# docker image rm mynginx
[root@docker ~]# docker rmi -f a70d36bc331a
[root@docker ~]# docker rmi -f $(docker images -a -q) 删除所有镜像
镜像使用一段时间之后docker会产生很多临时文件,以及一些没有被使用的镜像。
[root@docker ~]# docker image prune -a -f
# 使用镜像名称
[root@docker ~]# docker history nginx
# 使用镜像ID
[root@docker ~]# docker history f6d0b4767a6c
注: 默认情况下,docker login登录的是官方仓库,如果登录其他镜像仓库则需要指定镜像仓库的URL连接。
[root@docker ~]# docker login --help
# 参数
--username|-u : 指定用户名
--password|-p : 指定密码
# 登录阿里云docker registry
[root@docker ~]# docker login --username=xu中祥 registry.cn-hangzhou.aliyuncs.com
# 登录dockerhub官方仓库
[root@docker ~]# docker login -u xuzhongxiang
Password:
注:要想上传镜像,首先得登录镜像仓库,其次设置对应镜像仓库的tag
# 对镜像打标签
[root@docker ~]# docker tag f6d0b4767a6c registry.cn-hangzhou.aliyuncs.com/xuzhongxiang/steven:latest
# 上传镜像
[root@docker ~]# docker push registry.cn-hangzhou.aliyuncs.com/xuzhongxiang/steven:latest
-
保存镜像
构建镜像一般有三种情况:
基于容器导入
基于本地模板导入
基于Dockerfile创建
1.主要参数
-a 作者信息 -m 提交信息 -p 提交时.暂停容器运行 2.基于容器保存镜像
主要格式:docker commit [容器ID|容器名称]
# 保存正在运行的容器直接为镜像
[root@docker ~]# docker run -d -it centos /bin/bash
[root@docker ~]# docker exec 5a84db79dce0 touch test
[root@docker ~]# docker commit -m "add a file" -a "xuzhongxiang" 5a84db79dce0 centos:v1
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v1 bc62a57d071c 6 seconds ago 209MB
centos latest 300e315adb2f 3 months ago 209MB
3.(import/export)
export 和 import 的针对点是容器.将本机的容器导出为镜像包。
使用 export 保存容器为镜像包
# 格式:
docker export [容器的ID] > [包名称]
# 案例:
[root@docker ~]# docker export 5a84db79dce0 >centos.tar
使用 import 导入镜像包为镜像
# 格式:
docker import [包名称] [自定义镜像名称]
# 案例:
[root@docker ~]# docker import centos.tar test:v1
4.(save/load)
save 和 load 针对的点是镜像.是将本机的镜像导出/导入为镜像包。
使用 save 保存镜像
# 格式:
docker save [镜像名称|镜像ID] > [包名称]
# 案例:
[root@docker ~]# docker save 300e315adb2f > xiaoxu.tar
使用 save 保存多个镜像
[root@docker ~]# docker save -o xiaoxu-two.tar e3c0b8b5d262
使用 load 导入镜像
# 格式:
docker load < [包名称]
# 案例:
[root@docker ~]# docker load < xiaoxu.tar
# 注:save/load保存镜像无法自定义镜像名称,save保存镜像时如果使用ID保存则load导入镜像无名称,使用名称导入时才有名称。
[root@Centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest b97242f89c8a 2 months ago 1.23MB
[root@Centos7 ~]# docker save busybox:latest > busybox.tar
[root@Centos7 ~]# ll
total 150120
-rw-r--r--. 1 root root 1459200 Mar 18 17:43 busybox.tar
[root@Centos7 ~]# docker rmi b97242f89c8a
Untagged: busybox:latest
Untagged: busybox@sha256:c5439d7db88ab5423999530349d327b04279ad3161d7596d2126dfb5b02bfd1f
Deleted: sha256:b97242f89c8a29d13aea12843a08441a4bbfc33528f55b60366c1d8f6923d0d4
Deleted: sha256:0064d0478d0060343cb2888ff3e91e718f0bffe9994162e8a4b310adb2a5ff74
[root@Centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@Centos7 ~]# docker load < busybox.tar
0064d0478d00: Loading layer [==================================================>] 1.45MB/1.45MB
Loaded image: busybox:latest
[root@Centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest b97242f89c8a 2 months ago 1.23MB
1、export保存的镜像体积要小于save(save保存更完全,export保存会丢掉一些不必要的数据)
2、export可以重命名镜像名称而save则不行
3、save可以同时保存多个镜像而export则不行
2.Docker容器
在Docker中 真正对外提供服务的还是容器.容器就是对外提供服务的一个实例。
容器启动的必要条件:容器内至少有一个进程运行在前台。
docker pull centos
-d : 以守护进程的方式运行一个容器
docker run -d [镜像名称] [cmd]
-p : 指定端口映射
docker run -d -p 宿主主机端口:容器内端口 [镜像名称] [cmd]
-P : 随机端口映射
docker run -d -P [镜像名称] [cmd]
-i : 打开标准输入
-t : 分配一个伪终端
docker run -it [镜像名称] [cmd]
-v : 挂载目录到容器中
docker run -v 宿主主机目录:容器内目录 [镜像名称] [cmd]
-e : 在容器中设置环境变量
docker run -e NAME=Centos -d [镜像名称] [cmd]
-h : 设置容器主机名
docker run -h "主机名" [镜像名称] [cmd]
--rm : 容器生命周期结束时立即删除
docker run --rm [镜像名称] [cmd]
--name : 为启动的容器设置名字
docker run -d --name [容器名称] [镜像的名称] [cmd]
--link : 连接上一个容器实现网络互通.只能单向连接
docker run --link 被连接的容器的名称:连接别名 [镜像名称] [cmd]
--network : 指定使用哪个网络
# docker run 运行流程
1、检查本地是否用指定镜像,如果没有则去对应的仓库下载镜像
2、启动容器,如果指定了命令则使用指定的命令,如果没有则使用默认的命令
3、返回容器ID
docker run -it centos /bin/bash
# 查看容器内的centos基础版本很多命令都是不完善的
[root@63cebd387668 /]# ls
bin etc lib lost+found mnt proc run srv tmp var
dev home lib64 media opt root sbin sys usr
2.以守护进程的方式运行一个容器
# 格式
docker run -d [镜像名]
# 案例
docker run -d centos
问题 : # docker ps 发现centos 停止了
原因 : # docker容器使用后台运行.就必须要有一个前台进程.docker发现没有运行在前台的进程.就会自动停止。
3.挂载目录到容器中
# 格式
docker run -v 宿主主机目录:容器内目录 [镜像名称] [cmd]
# 案例
# 运行并挂载目录
docker run -d -it -v /home/ceshi:/home centos /bin/bash
# 进入容器
docker exec -it c52da1f38334 /bin/bash
# 在容器挂载目录生成数据
touch /home/steven
# 查看数据
ll /home/ceshi/
steven
4.指定端口映射
# 格式
docker run -d -p 宿主主机端口:容器内端口 [镜像名称] [cmd]
# 案例
docker run -d -it -p 1314:80 nginx /bin/bash
5.在容器中设置环境变量
# 格式
docker run -e NAME=Centos -d [镜像名称] [cmd]
# 案例
docker run -e NAME=Centos -d -it centos /bin/bash
6.随机端口映射
# 格式
docker run -d -P [镜像名称] [cmd]
# 案例
docker run -d -it -P nginx /bin/bash
7.设置容器主机名
# 格式
docker run -h "主机名" [镜像名称] [cmd]
# 案例
docker run -d -it -h "steven" redis /bin/bash
# 进入容器验证
docker exec -it f390e62a0917 /bin/bash
root@steven:/data#
8.容器生命周期结束时立即删除
# 格式
docker run --rm [镜像名称] [cmd]
# 案例
docker run -d --rm centos /bin/bash
9.为启动的容器设置名字
# 格式
docker run -d --name [容器名称] [镜像的名称] [cmd]
# 案例
docker run -d -it --name nginx01 nginx /bin/bash
10.连接上一个容器,实现网络互通
# 格式
docker run --link 被连接的容器的名称:连接别名 [镜像名称] [cmd]
# 案例
# 创建一个容器
docker run -d -it -P f6d0b4767a6c /bin/bash
# 连接上一个创建的容器
docker run -d -it --link nervous_allen:test nginx /bin/bash
[root@docker ~]# docker ps # 列出当前正在运行的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
# 解释
CONTAINER ID # 容器ID
IMAGE # 镜像名字
COMMAND # 执行的命令
CREATED # 创建时间
STATUS # 容器状态
PORTS # 容器端口
NAMES # 容器名字
# 参数
-a # 查看系统中所有的容器。
-q # 只显示容器的ID
-n=? # 显示最近创建的容器
# 案例
docker ps -a
docker ps -aq
docker ps -n=2
# 格式
docker rm [容器名称|ID] # 不能删除正在运行的容器
# 参数
-f : 强制删除
docker rm -f [容器名称|ID]
# 清空所有容器
docker rm $(docker ps -a -q)
# 清空所有容器
docker ps -aq | xargs docker rm -f
docker start 容器ID # 启动容器
docker restart 容器ID # 重启容器
docker stop 容器ID # 停止容器
docker kill 容器ID # 强制停止当前容器
[root@docker ~]# docker logs --help
# 格式:
docker logs [选项] 容器ID
# 选项:
--details
-f, --follow
--since string
-n, --tail string
-t, --timestamps
# 案例:
docker logs -tf 129931df491c
docker logs -tf --tail 10 129931df491c
# 格式:
docker top [容器ID | 容器名字]
# 容器ID查看
docker top 129931df491c
# 容器名字查看
docker top crazy_solomon
# 格式
docker inspect [容器名称|ID]
# 案例:
# 使用容器ID查看
docker inspect 129931df491c
# 使用容器名字查看
docker inspect crazy_solomon
# 怎么监控docker运行状态?
docker inspect -f '{{.State.Running}}' nginx
在使用容器的过程中难免需要进入容器经行排查问题。
# 进入容器一般有四种
1、exec : 在容器外向容器内执行一个命令(官方推荐)
# 格式
docker exec [参数] [容器的名称|ID] [cmd]
# 案例
docker exec -it 2d81b39ab517 /bin/bash
2、attach : 在早期docker提供的进入容器的命令(缺点:当其结束时,容器也跟着结束了)
# 格式
docker attach [容器ID|名称]
# 案例
docker attach 2d81b39ab517
3、nsenter : 建立一个管道连接上容器主ID
# 案例
nsenter --target $(docker inspect -f {{.State.Pid}} 2d81b39ab517) --mount --uts --ipc --net --pid
4、ssh : 通过ssh连接
5. 总结
nsenter 和 exec 之间的区别。exec是自带的命令.nsenter是linux提供的命令。
exec 相当于在容器内执行了一个命令.而nsenter是仅仅进入容器之中而已。
复制命令类似于linux系统中的scp命令.是将宿主机上的内容上传到容器中。
也可以将容器中的内容下载到宿主机中。
@ 将宿主机中的文件复制到容器中
# 格式
docker cp [宿主主机文件路径] 容器ID:容器内路径
# 案例
docker cp /root/a.txt a7a92612dbe6:/
@ 将容器中的文件复制到宿主机中
# 格式
docker cp 容器ID:容器内路径 [宿主主机文件路径]
# 案例
docker cp a7a92612dbe6:/a.txt /root/
四.Docker练习
1.Docker安装Nginx
docker search nginx
docker pull nginx
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest f6d0b4767a6c 2 months ago 133MB
# docker run -d --name nginx01 -p 1314:80 f6d0b4767a6c
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
7fd375ad19f7 f6d0b4767a6c "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:1314->80/tcp nginx01
# docker exec -it nginx01 /bin/bash
# whereis nginx
nginx: /usr/sbin/nginx /usr/lib/nginx /etc/nginx /usr/share/nginx
# cd /etc/nginx/
# ls
conf.d koi-utf mime.types nginx.conf uwsgi_params
fastcgi_params koi-win modules scgi_params win-utf
2.Docker安装tomcat
# docker pull tomcat
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
tomcat latest 040bdb29ab37 2 months ago 649MB
# docker run -d --name tomcat01 -P 040bdb29ab37
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
b57d16928848 040bdb29ab37 "catalina.sh run" 9 seconds ago Up 8 seconds 0.0.0.0:49153->8080/tcp tomcat01
访问出现问题:
1.linux命令少了 2.没有webapps网站页面
原因:镜像的原因默认是最小的镜像,所有不必要的都剔除掉保证最小运行环境
# docker exec -it b57d16928848 /bin/bash
# ls
BUILDING.txt NOTICE RUNNING.txt lib temp work
CONTRIBUTING.md README.md bin logs webapps
LICENSE RELEASE-NOTES conf native-jni-lib webapps.dist
# cp -r webapps.dist/* webapps
3.Docker安装es
es 暴露的端口很多
es 十分的耗内存
es 的数据一般需要放置到安全目录 挂载
–net somenetwork 网络配置
docker run -d --name elasticsearch -p 9200:9200 -p 9300:9300 -e "discovery.type=single-node" elasticsearch:7.6.2
[root@docker ~]# curl localhost:9200
{
"name" : "60e16857abca",
"cluster_name" : "docker-cluster",
"cluster_uuid" : "qzue7kOARtiGf4KhvfVhGw",
"version" : {
"number" : "7.6.2",
"build_flavor" : "default",
"build_type" : "docker",
"build_hash" : "ef48eb35cf30adf4db14086e8aabd07ef6fb113f",
"build_date" : "2020-03-26T06:34:37.794943Z",
"build_snapshot" : false,
"lucene_version" : "8.4.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
docker stats # 查看当前容器的存活状态
docker stats 60e16857abca
五.容器数据卷
1.什么是容器数据卷
将应用和环境打包成一个镜像.数据如果都在容器中那么我们容器删除.数据就会丢失
# 需求 : 数据可以持久化
MySQL把容器删了.删库跑路!
# 需求 : MySQL数据可以存储在本地
容器之间可以有一个数据共享的技术!Docker 容器中产生的数据,同步到本地。
# 卷技术 : 简单来说就是将容器内的目录挂载到Linux中
容器的持久化同步操纵.容器也是可以数据共享的。
2.使用数据卷
# 格式
docker run -v 宿主主机目录:容器内目录 [镜像名称] [cmd]
# 案例
# 运行并挂载目录
docker run -d -it -v /home/ceshi:/home centos /bin/bash
# 进入容器
docker exec -it c52da1f38334 /bin/bash
# 在容器挂载目录生成数据
touch /home/steven
# 查看数据
ll /home/ceshi/
steven
3.Docker装MySQL
思考:MySQL的数据持久化的问题
docker search mysql
docker pull mysql:5.7
安装启动mysql需要配置密码。
docker run -d -p3310:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql --name mysql01 -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7
[root@docker ~]# docker rm -f 489208bc5dca
489208bc5dca
[root@docker ~]# ll /home/mysql/data/
-rw-r----- 1 polkitd input 56 3月 31 03:57 auto.cnf
-rw------- 1 polkitd input 1676 3月 31 03:57 ca-key.pem
# 删除容器后数据依然存在
4.匿名/具名挂载
# 格式
-v [容器内路径]
# 不跟主机内的目录直接跟容器内的目录它会默认生成一个目录。
# 匿名挂载案例
docker run -d -P --name nginx01 -v /etc/nginx nginx
# 数据卷管理命令
[root@docker ~]# docker volume --help
# 命令
create
inspect
ls
prune
rm
# 查看所有卷的情况
[root@docker ~]# docker volume ls
local 2f8f86a38bb8d8b888d7c070dc10ff64ab4c413edfedfd1ccc5a971fb9821159
# 这种就是匿名挂载,因为在-v的时候只写了容器内的路径,没有写容器外的路径。
# 格式
-v 卷名:容器内路径
# 具名挂载案例
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
# 查看数据卷
[root@docker ~]# docker volume ls
DRIVER VOLUME NAME
local juming-nginx
# 查看这个卷
[root@docker ~]# docker volume inspect juming-nginx
[
{
"CreatedAt": "2021-03-31T14:23:38+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
"Name": "juming-nginx",
"Options": null,
"Scope": "local"
}
]
所有的docker容器内的卷,没有指定目录的情况下都是在 /var/lib/docker/volumes/
通过具名挂载可以方便的找到数据卷,大多数情况使用*具名挂载*
-v 容器内路径 # 匿名挂载
-v 卷名:容器内路径 # 具名挂载
-v /宿主机路径:容器内路径 # 指定路径挂载
通过 -v 容器内路径:ro rw 改变读写权限
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:ro nginx
docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx:rw nginx
ro readonly # 只读
rw readwrite # 可读可写
设置了容器的权限.容器挂载出来的内容就有限定了。
只要看到ro就说明这个路径只能通过宿主机来操作.容器内部是无法操作。
5.初识Dockerfile
Dockerfile就是用来构建 docker镜像的构建文件.相当于命令脚本。
通过这个脚本可以生成镜像.镜像是一层一层的.脚本就是一个个的命令,每个命令都是一层。
创建一个dockerfile文件.名字可以随机.建议使用Dockerfile
文件中的指令(大写)
# mkdir /home/docker-test-volume
# cd /home/docker-test-volume/
# vim dockerfile1
FROM centos
VOLUME ["volume01","volume02"] # 匿名挂载
CMD echo "---end---"
CMD /bin/bash
@ 这里的每个命令就是镜像的一层。
# docker build -f /home/docker-test-volume/dockerfile1 -t xuzhongxiang/centos:1.0 .
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
xuzhongxiang/centos 1.0 009461769781 6 seconds ago 209MB
# docker run -it 009461769781 /bin/bash
[root@abacac44b227 /]# ls -l
drwxr-xr-x 2 root root 6 Mar 31 08:04 volume01
drwxr-xr-x 2 root root 6 Mar 31 08:04 volume02
# 上面两个目录就是我们生成镜像的时候自动挂载的数据卷目录,这个卷和外部一定有个同步的目录
# 挂载目录生成数据
[root@fba99e6b2129 /]# cd volume01
[root@fba99e6b2129 volume01]# touch container.txt
[root@docker ~]# docker inspect fba99e6b2129
"Mounts": [
{
"Type": "volume",
"Name": "18dfa7f11ac50b0b206c3965bcdd574e7c0cf3ecdaa1c79cf470288598441cf4",
"Source": "/var/lib/docker/volumes/18dfa7f11ac50b0b206c3965bcdd574e7c0cf3ecdaa1c79cf470288598441cf4/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "3fa4cd27a52a2b4b373d705db3edd313133c51962fa93918ffbee9cede3c5a6e",
"Source": "/var/lib/docker/volumes/3fa4cd27a52a2b4b373d705db3edd313133c51962fa93918ffbee9cede3c5a6e/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
# 匿名挂载
# ll /var/lib/docker/volumes/18dfa7f11ac50b0b206c3965bcdd574e7c0cf3ecdaa1c79cf470288598441cf4/_data
-rw-r--r-- 1 root root 0 3月 31 16:13 container.txt
# 同步成功
这种方式会使用的特别多因为我们同常会构建自己的镜像。
假设构建镜像的时候没有挂载卷.就要手动镜像挂载. -v 卷名:容器内路径
6.容器共享数据卷
多个容器之间同步数据
docker run -d -it --name docker01 xuzhongxiang/centos:1.0 /bin/bash
docker run -d -it --name docker02 --volumes-from docker01 xuzhongxiang/centos:1.0
[root@docker ~]# docker exec -it docker01 /bin/bash
[root@344c19924ee0 /]# cd volume01
[root@344c19924ee0 volume01]# touch a.txt
[root@docker ~]# docker exec -it docker02 /bin/bash
[root@5460de82bb00 /]# ls /volume01
a.txt
docker run -d -it --name docker03 --volumes-from docker01 xuzhongxiang/centos:1.0
# 生成数据
[root@docker ~]# docker exec -it docker03 /bin/bash
[root@99fef21f5aad /]# cd volume01
[root@99fef21f5aad volume01]# touch b.txt
[root@docker ~]# docker exec -it docker01 /bin/bash
以上是关于docker镜像及容器的使用的主要内容,如果未能解决你的问题,请参考以下文章
Docker删除报错:Error response from daemon: conflict: unable to delete 08b152afcfae (must be forced)(代码片段