为何要为容器进行文件挂载
为了持久化docker容器产生的数据(数据文件/配置文件/日志文件), 通常会挂载(映射)产生数据的容器内路径到主机路径上.
用处:
- 不用进入容器内就能访问配置容器内数据
- 删除容器时能保留数据
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是空的
通过查看容器信息, 我们可以看到一条挂载记录
[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]$
证明了挂载点有效的.
我们再查看下数据卷列表
[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是空的
这时我们查看下这个容器的挂载信息
[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#
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 被创建, 而且名字是一堆无意义的字符
挂载点同样也是很冗长,
所以一般情况不建议用匿名挂载