正常情况下,删除容器,容器中所有的文件也会被删除。所以需要能持久化容器中数据的方法,也就是数据卷 数据卷(Data Volume)的作用:
在集群环境下,数据卷分为:
容器互联大体有以下三种方式:
其中基于网络的互连会在网络部分单独写,基于volume的互连和基于link的互连会在本节详细说明
数据卷[Data Volume]就是将宿主机中的一个文件或目录挂载到容器中,供容器使用,分为绑定卷[bind mount]和容器管理卷[docker managed volume],区别是
区别点 | bind mount | docker managed volume |
---|---|---|
volume 位置 | 可任意指定 | /var/lib/docker/volumes/... |
对已有mount point 影响 | 隐藏并替换为 volume | 原有数据复制到 volume |
是否支持单个文件 | 支持 | 不支持,只能是目录 |
权限控制 | 可设置为只读,默认为读写权限 | 无控制,均为读写权限 |
移植性 | 移植性弱,与 host path 绑定 | 移植性强,无需指定 host 目录 |
docker volume create xxx
docker volume ls
docker volume rm
docker volume inspect
-v
参数挂载数据卷的语法-v 挂载源:挂载目的[:其他选项]
docker run -d -p 80:80 -v /data/test/:/usr/share/nginx/html nginx
其他选项一般只有一个ro
只读选项常用,不举例了
-v参数所跟选项 | 举例 | 导致的结果 |
---|---|---|
A:不跟任何选项 | -v | 根据创建镜像的dockerfiled的配置进行挂载 |
B:只写一个目录 | -v /data | 表示只有挂载目的,会自动创建挂载源 |
C:源目都有[四种] | -v xxx:/test | 又如下分四种情况 |
C1:源目都是目录 | -v /data/:/test | 将主机的data目录挂载到容器的test目录 |
C2:源目都是文件 | -v ~/f.txt:/test/b.txt | 用主机文件f.txt文件替代容器b.txt文件 |
C3:源是容器管理卷[已建] | -v noah:/test | 挂载容器管理卷noah为容器目录/test |
C4:源是容器管理卷[未建] | -v noah:/test | 创建并挂载容器管理卷,并用容器目录中的数据初始化容器管理卷 |
先创建好一个目录和里面的测试文件,然后创建实例的时候,直接加参数挂载到相应的目录即可
bind mount
的容器docker run -d -p 80:80 -v /data/test/:/usr/share/nginx/html nginxinspect
查看镜像信息[root@docker01 ~]# docker container inspect 9c5e35343873|grep -A 4 Mounts "Mounts": [ { "Type": "bind", "Source": "/data/test", "Destination": "/usr/share/nginx/html",volume container 是专门为其他容器提供 volume 的容器。它提供的卷可以是 bind mount,也可以是 docker managed volume。
创建一个名为vc_data
的容器, mount 了1个docker managed volume
,其他容器可以通过--volumes-from
使用vc_data
这个 volume container:
注意这里执行的是
docker create
命令,这是因为 volume container 的作用只是提供数据,它本身不需要处于运行状态。
docker inspect
可以查看到信息[root@docker01 ~]# docker inspect vc_data |grep -A 4 Mounts "Mounts": [ { "Type": "volume", "Name": "noah-v2", "Source": "/var/lib/docker/volumes/noah-v2/_data",vc_data
docker run -d -p 801:80 --volumes-from vc_data nginx docker run -d -p 802:80 --volumes-from vc_data nginxvolume 实际上是 host 文件系统中的目录和文件,而我们所有的本地镜像都存在 host 指定目录的
/var/lib/docker/volumes/
目录我们要做的就是定期备份这个目录,如果数据损坏了,直接用之前备份的数据拷贝到 对应目录就可以了。
如果我们想使用更新版本的 Registry,这就涉及到数据迁移,步骤是:
docker run -d -p 5000:5000 -v /myregistry:/var/lib/registry registry:latest
当然,在启用新容器前要确保新版本的默认数据路径是否发生变化。docker 不会销毁 bind mount,删除数据的工作只能由 host 负责。 对于 docker managed volume,在删除容器时可以带上 -v 参数,会将容器使用到的 volume 一并删除(前提是没有其他容器 mount 该 volume) 如果删除容器时没有带 -v ,就会产生孤儿 volume,对于孤儿volume:
docker managed volume
进行维护。docker volume rm
.docker volume rm $(docker volume ls -q)
--link
参数格式为--link name:alias
,其中name是要链接的容器名称,alias是这个连接的别名。
Docker通过环境变量和更新/etc/hosts文件两种方式为容器公开连接信息
通过用容器方式快速部署zabbix的案例,来说明link在实际使用中的应用
docker run --name mysql-server -t \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-d mysql:5.7 \
--character-set-server=utf8 --collation-server=utf8_bin
docker run --name zabbix-java-gateway -t \
-d zabbix/zabbix-java-gateway:latest
docker run --name zabbix-server-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
-e ZBX_JAVAGATEWAY="zabbix-java-gateway" \
--link mysql-server:mysql \
--link zabbix-java-gateway:zabbix-java-gateway \
-p 10051:10051 \
-d zabbix/zabbix-server-mysql:latest
docker run --name zabbix-web-nginx-mysql -t \
-e DB_SERVER_HOST="mysql-server" \
-e MYSQL_DATABASE="zabbix" \
-e MYSQL_USER="zabbix" \
-e MYSQL_PASSWORD="zabbix_pwd" \
-e MYSQL_ROOT_PASSWORD="root_pwd" \
--link mysql-server:mysql \
--link zabbix-server-mysql:zabbix-server \
-p 80:80 \
-d zabbix/zabbix-web-nginx-mysql:latest
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。