Docker volume 具名挂载与匿名挂载、容器数据卷

在使用 docker run 命令的时候,我们就可能需要用到将容器中的路径挂载到宿主机上面来,方便与修改配置文件,或者是用来上传一些文件。

我们这里提前总结一下

# 如何确定是具名挂载还是匿名挂载,还是指定路径挂载!
-v  容器内路径                   # 匿名挂载
-v  卷名:容器内路径               # 具名挂载
-v /主机路径:容器内路径            # 指定路径挂载

匿名挂载

这个最简单的理解就是不设置宿主机上面的挂载路径。

下面在执行 docker run -v 的时候,只指定了容器里面的地址

# 匿名挂载
# -v 容器内路径
# -P 随机指定端口
docker run -d -P --name nginx01 -v /etc/nginx nginx     
 
# 查看所有volume的情况
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
 
# 这里发现,这种情况就是匿名挂载,我们在-v 后面只写了容器内的路径,没有写容器外的路径

具名挂载

这里和匿名挂载相反,这里是需要执行宿主机上面的地址。可以通过 docker volume inspect 容器ID 可以查看到具体的信息

# 具名挂载
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker run -d -P --name nginx02 -v juming-nginx:/etc/nginx nginx
26da1ec7d4994c76e80134d24d82403a254a4e1d84ec65d5f286000105c3da17
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                   NAMES
26da1ec7d499        nginx               "/docker-entrypoint.…"   3 seconds ago       Up 2 seconds        0.0.0.0:32769->80/tcp   nginx02
486de1da03cb        nginx               "/docker-entrypoint.…"   3 minutes ago       Up 3 minutes        0.0.0.0:32768->80/tcp   nginx01
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume ls
DRIVER              VOLUME NAME
local               561b81a03506f31d45ada3f9fb7bd8d7c9b5e0f826c877221a17e45d4c80e096
local               36083fb6ca083005094cbd49572a0bffeec6daadfbc5ce772909bb00be760882
local               juming-nginx
 
# 通过-v 卷名:容器内的路径
# 查看一下这个卷
# docker volume inspect juming-nginx
 
[root@iZ2zeg4ytp0whqtmxbsqiiZ ~]# docker volume inspect juming-nginx
[
  {
      "CreatedAt": "2020-08-12T18:15:21+08:00",
      "Driver": "local",
      "Labels": null,
      "Mountpoint": "/var/lib/docker/volumes/juming-nginx/_data",
      "Name": "juming-nginx",
      "Options": null,
      "Scope": "local"
  }
]

挂载卷对应宿主机上面的路径

所有容器中的卷,在没指定目录的情况下都是在 /var/lib/docker/volumes/xxxx/_data 下面:

如果有安装过 portainer 的话,可以通过 portainer 访问 volumes 也可以看到

修改容器挂载卷的读写权限

 ro:只要看到 ro 就说明这个路径只能通过宿主机来操作,容器内容无法操作。

# 通过 -v 容器内容路径 ro rw 改变读写权限
ro  readonly    # 只读
rw  readwrite   # 可读可写
 
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
 

容器数据卷

容器数据卷指的是建立数据卷,来同步多个容器间的数据,实现容器间的数据同步。

首先启动容器1,正常挂载相关路径

docker run --name mynginx -d -p 8080:80 \
-v /apps/nginx/html:/usr/share/nginx/html \
-v /apps/nginx/nginx.conf:/etc/nginx/nginx.conf \
-v /apps/nginx/conf.d:/etc/nginx/conf.d \
-v /apps/nginx/logs:/var/log/nginx nginx 

然后启动容器2,通过参数 --volumes-from, 设置容器2 和容器1 建立数据卷挂载关系。

 docker run --name nginx01 -d -p 8080:80 --volumes-from  mynginx

在 容器2 的volume01 中添加文件,那么在容器1 中的 volume 也可以看到

/**  容器2 的操作 **/
// 进入容器
docker exec -it nginx01 /bin/bash

cd /usr/share/nginx/html

touch test.txt

exit

在宿主机上面就可有看到有了个文件,由于是挂载的,所以容器内的操作就相当于是在宿主机上面操作

 进入 容器1 中发现对应的文件也存在

附录

下面同步两个MySQL的数据库和配置文件,与上面的操作相同,首先建立数据卷,然后给另一个MySQL容器建立容器数据卷挂载,示例:

[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6603:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456 --name mysql01 mysql:5.7
[root@iZwz99sm8v95sckz8bd2c4Z home]# docker run -d -p 6604:3306 -e MYSQL_ROOT_PASSWORD=123456 --name mysql02 --volumes-from mysql01 mysql:5.7
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值