为何要为容器进行文件挂载

为了持久化docker容器产生的数据(数据文件/配置文件/日志文件), 通常会挂载(映射)产生数据的容器内路径到主机路径上.

用处:

  1. 不用进入容器内就能访问配置容器内数据
  2. 删除容器时能保留数据

3种挂载方式

  1. 指定路径挂载
  2. 具名挂载
  3. 匿名挂载

1.指定路径挂载

首先查看当前的数据卷和容器列表
当前只有1个运行中的容器和1个数据卷(volume)

[gateman@i-93f6y1io docker]$ docker ps -a
CONTAINER ID   IMAGE                 COMMAND                  CREATED       STATUS                  PORTS                    NAMES
5b82adf8f3f5   mysql:latest          "docker-entrypoint.s…"   7 days ago    Exited (0) 7 days ago                            mysql01
5d1736f42fd3   portainer/portainer   "/portainer"             13 days ago   Up 12 days              0.0.0.0:3346->9000/tcp   condescending_cartwright
[gateman@i-93f6y1io docker]$ 
[gateman@i-93f6y1io docker]$ docker volume ls
DRIVER    VOLUME NAME
local     ad53aaa75e87f4e8c176f7f6d6eaa6819bcf5f88e70bc7b690fe70dad44ba261
[gateman@i-93f6y1io docker]$

语法:

-v /主机路径:/容器内路径

例子 我们创建1个tomcat容器

docker run -d -p 3348:8080 -v /home/gateman/docker/webapps:/usr/local/tomcat/webapps --name tomcat_spe_mount tomcat

[gateman@i-93f6y1io docker]$ pwd
/home/gateman/docker
[gateman@i-93f6y1io docker]$ mkdir -p webapps
[gateman@i-93f6y1io docker]$ ls
run_portainer.sh  scripts  webapps
[gateman@i-93f6y1io docker]$ docker run -d -p 3348:8080 -v /home/gateman/docker/webapps:/usr/local/tomcat/webapps --name tomcat_spe_mount tomcat
052e6104aeaf65f56e53535d249d5417701560ce6332dbcc764dfb4cc6435bae
[gateman@i-93f6y1io docker]$

这是我们访问 tomcat主页,见到tomcat启动了, 但是什么也没有, 因为容器内的webapps是空的

docker-compose挂载文件 docker -v 挂载文件_docker

通过查看容器信息, 我们可以看到一条挂载记录

[gateman@i-93f6y1io docker]$ docker inspect --format="{{.Mounts}}" tomcat_spe_mount
[{bind  /home/gateman/docker/webapps /usr/local/tomcat/webapps   true rprivate}]
[gateman@i-93f6y1io docker]$

这时我们把一些东西webapps初始的管理项目copy 到挂载点 /home/gateman/docker/webapps 上
然后刷新tomcat主页, 能正常显示了

[gateman@i-93f6y1io docker]$ cp -a ~/docker/scripts/mount/webapps/* /home/gateman/docker/webapps/
[gateman@i-93f6y1io docker]$ docker exec -it tomcat_spe_mount /bin/bash
root@052e6104aeaf:/usr/local/tomcat# ls /usr/local/tomcat/webapps
ROOT  docs  examples  host-manager  manager
root@052e6104aeaf:/usr/local/tomcat# exit
exit
[gateman@i-93f6y1io docker]$

docker-compose挂载文件 docker -v 挂载文件_bc_02


证明了挂载点有效的.

我们再查看下数据卷列表

[gateman@i-93f6y1io docker]$ docker volume ls
DRIVER    VOLUME NAME
local     ad53aaa75e87f4e8c176f7f6d6eaa6819bcf5f88e70bc7b690fe70dad44ba261
[gateman@i-93f6y1io docker]$

数据卷并没有增加
说明 指定路径挂载并不会创建数据卷(volume)

2.具名挂载

可以讲具名挂载和匿名挂载都不用指定主机的挂载路径, 由docker自己管理(通常在/var/lib/docker/volumn/ 下), 只需要指定容器里需要映射出来的路径。 而且会增加1个数据卷。

具名就是会给这个新增的数据卷添加1个名字。
匿名就是给这个数据卷产生1个随机token作为数据卷名字

语法

-v 数据卷名:/容器内路径

例子

我们创建多个tomcat 容器

[gateman@i-93f6y1io docker]$ docker run -d -p 3349:8080 -v vol_has_name_tomcat:/usr/local/tomcat/webapps --name tomcat_has_name_mount tomcat
d0bc64be6bdc9aedaec4bf22777eeea8a47106df90e05c929e31f540541f79df
[gateman@i-93f6y1io docker]$ docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED          STATUS          PORTS                    NAMES
d0bc64be6bdc   tomcat                "catalina.sh run"   5 seconds ago    Up 4 seconds    0.0.0.0:3349->8080/tcp   tomcat_has_name_mount
052e6104aeaf   tomcat                "catalina.sh run"   15 minutes ago   Up 15 minutes   0.0.0.0:3348->8080/tcp   tomcat_spe_mount
5d1736f42fd3   portainer/portainer   "/portainer"        13 days ago      Up 13 days      0.0.0.0:3346->9000/tcp   condescending_cartwright
[gateman@i-93f6y1io docker]$ docker exec -it tomcat_has_name_mount /bin/bash
root@d0bc64be6bdc:/usr/local/tomcat# ls /usr/local/tomcat/webapps
root@d0bc64be6bdc:/usr/local/tomcat# exit
exit

可以见到1个新创建的容器。 这时访问这个tomcat, 也是没有主页的, 因为容器内webapps是空的

docker-compose挂载文件 docker -v 挂载文件_tomcat_03


这时我们查看下这个容器的挂载信息

[gateman@i-93f6y1io docker]$ docker inspect --format="{{.Mounts}}" tomcat_has_name_mount
[{volume vol_has_name_tomcat /var/lib/docker/volumes/vol_has_name_tomcat/_data /usr/local/tomcat/webapps local z true }]
[gateman@i-93f6y1io docker]$

可以很清晰见到, 1个volume被指定了, 名字就是我们命令中定义的。
挂载点是/var/lib/docker/volumes/vol_has_name_tomcat/_data

我们再查看下数据卷列表

[gateman@i-93f6y1io docker]$ docker volume ls
DRIVER    VOLUME NAME
local     ad53aaa75e87f4e8c176f7f6d6eaa6819bcf5f88e70bc7b690fe70dad44ba261
local     vol_has_name_tomcat
[gateman@i-93f6y1io docker]$

1个新的数据卷被创建

我们把一些default东西copy到挂载点(要加sodu), 主页就出来了

[gateman@i-93f6y1io docker]$ sudo cp -a ~/docker/scripts/mount/webapps/* /var/lib/docker/volumes/vol_has_name_tomcat/_data/
[sudo] gateman 的密码:
[gateman@i-93f6y1io docker]$ docker exec -it tomcat_has_name_mount /bin/bash
root@d0bc64be6bdc:/usr/local/tomcat# ls /usr/local/tomcat/webapps
ROOT  docs  examples  host-manager  manager
root@d0bc64be6bdc:/usr/local/tomcat#

docker-compose挂载文件 docker -v 挂载文件_bc_04

3.匿名挂载

语法

-v /容器内路径

不用指定数据卷名

例子
[gateman@i-93f6y1io docker]$ docker run -d -p 3350:8080 -v /usr/local/tomcat/webapps --name tomcat_ano_mount tomcat
132f575e0345ef5808e250c3b18741b294d4bb3e61a1ac88d8b6a9b4d2a76a79
[gateman@i-93f6y1io docker]$ docker ps
CONTAINER ID   IMAGE                 COMMAND             CREATED          STATUS          PORTS                    NAMES
132f575e0345   tomcat                "catalina.sh run"   3 seconds ago    Up 3 seconds    0.0.0.0:3350->8080/tcp   tomcat_ano_mount
d0bc64be6bdc   tomcat                "catalina.sh run"   38 minutes ago   Up 38 minutes   0.0.0.0:3349->8080/tcp   tomcat_has_name_mount
052e6104aeaf   tomcat                "catalina.sh run"   53 minutes ago   Up 53 minutes   0.0.0.0:3348->8080/tcp   tomcat_spe_mount
5d1736f42fd3   portainer/portainer   "/portainer"        13 days ago      Up 13 days      0.0.0.0:3346->9000/tcp   condescending_cartwright
[gateman@i-93f6y1io docker]$ docker volume ls
DRIVER    VOLUME NAME
local     5889eed1cc2a05c3f54d69db7c95178b14a3821b6b02a341f3ac717d63ea2beb
local     ad53aaa75e87f4e8c176f7f6d6eaa6819bcf5f88e70bc7b690fe70dad44ba261
local     vol_has_name_tomcat
[gateman@i-93f6y1io docker]$ docker inspect --format="{{.Mounts}}" tomcat_ano_mount
[{volume 5889eed1cc2a05c3f54d69db7c95178b14a3821b6b02a341f3ac717d63ea2beb /var/lib/docker/volumes/5889eed1cc2a05c3f54d69db7c95178b14a3821b6b02a341f3ac717d63ea2beb/_data /usr/local/tomcat/webapps local  true }]
[gateman@i-93f6y1io docker]$

可以见到 1个新的volume 被创建, 而且名字是一堆无意义的字符

挂载点同样也是很冗长,

所以一般情况不建议用匿名挂载