卷技术:目录挂载,将容器的目录挂载到虚拟机或者Linux上。
用于
容器的持久化和同步操作。
方式1:docker run -it -v 主机目录:容器目录
挂载例1
# 终端1
root@localhost testdocker]# cd /home/
[root@localhost home]# ls
fancy
# 以交互的方式启动centos镜像,主机的/home/test 目录挂载到容器的/home目录
[root@localhost home]# docker run -it -v /home/test:/home centos /bin/bash
[root@e33a865fb14b /]# cd /home/
[root@e33a865fb14b home]# ls
[root@e33a865fb14b home]# [root@localhost home]#
# 退出在容器,
[root@e33a865fb14b home]# [root@localhost home]#
[root@localhost home]# docker inspect e33a865fb14b
# 可以找到如下信息:
"Mounts": [
{
"Type": "bind",
"Source": "/home/test",
"Destination": "/home",
"Mode": "",
"RW": true,
"Propagation": "rprivate"
}
],
两个目录的数据是关联的。
案例2:启动mysql容器
参考官网说明:
https://hub.docker.com/_/mysql
# 获取镜像
# 运行容器并挂载
# 安装启动mysql需要配置密码!
[root@localhost home]# docker run -d -p 3310: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
-d 后台运行
-p 端口映射
-v 卷挂载
-e 环境配置
--name 容器名
-v, --volume list Bind mount a volume
--volume-driver string Optional volume driver for the container
--volumes-from list Mount volumes from the specified container(s)
[root@localhost home]# docker run -d -p 3310: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
648c6059388c766f98e3bc1263cf89c887dc2671e546332605d44627c6648d89
[root@localhost home]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
648c6059388c mysql:5.7 "docker-entrypoint.s…" 12 seconds ago Up 7 seconds 33060/tcp, 0.0.0.0:3310->3306/tcp mysql01
e33a865fb14b centos "/bin/bash" 12 hours ago Up 12 hours cranky_curie
fad98b763f87 portainer/portainer "/portainer" 14 hours ago Up 14 hours 0.0.0.0:8088->9000/tcp epic_hodgkin
c372a55412cb elasticsearch:7.10.1 "/tini -- /usr/local…" 14 hours ago Up 14 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch02
63f607c6c6ba tomcat:9.0 "catalina.sh run" 15 hours ago Up 15 hours 0.0.0.0:3355->8080/tcp tomcat01
e22746833eea nginx "/docker-entrypoint.…" 16 hours ago Up 16 hours 0.0.0.0:8000->80/tcp nginx01
[root@localhost home]#
# 此时可以看到,刚才启动的mysql容器运行起来了,此时通过navicat,填入对应主机和端口,以及刚才设置的mysql账户密码就可以链接容器。
启动后,主机的home目录下多出一个mysql目录,这就是从刚才设置的容器挂载映射的。
[root@localhost home]# ls
fancy mysql test
[root@localhost home]# cd mysql/
[root@localhost mysql]# ls
conf data
[root@localhost mysql]# cd data/
# 此时,data文件夹下内容如下:
[root@localhost data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mysql private_key.pem server-cert.pem sys
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 performance_schema public_key.pem server-key.pem
在gui界面下添加一个名为mydemo的数据库
再次查看data文件夹下的内容,多出来一个mydemo目录:
[root@localhost data]# ls
auto.cnf ca.pem client-key.pem ibdata1 ib_logfile1 mydemo performance_schema public_key.pem server-key.pem
ca-key.pem client-cert.pem ib_buffer_pool ib_logfile0 ibtmp1 mysql private_key.pem server-cert.pem sys
[root@localhost data]#
删除容器不影响挂载的主机数据,数据不会丢失!
# 查看运行中的容器
[root@localhost data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
648c6059388c mysql:5.7 "docker-entrypoint.s…" 49 minutes ago Up 49 minutes 33060/tcp, 0.0.0.0:3310->3306/tcp mysql01
e33a865fb14b centos "/bin/bash" 13 hours ago Up 13 hours cranky_curie
fad98b763f87 portainer/portainer "/portainer" 14 hours ago Up 14 hours 0.0.0.0:8088->9000/tcp epic_hodgkin
c372a55412cb elasticsearch:7.10.1 "/tini -- /usr/local…" 15 hours ago Up 15 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch02
63f607c6c6ba tomcat:9.0 "catalina.sh run" 16 hours ago Up 16 hours 0.0.0.0:3355->8080/tcp tomcat01
e22746833eea nginx "/docker-entrypoint.…" 16 hours ago Up 16 hours 0.0.0.0:8000->80/tcp nginx01
# 删除mysql01容器
[root@localhost data]# docker rm -f mysql01
mysql01
# 查看,容器确实被干掉了
[root@localhost data]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
e33a865fb14b centos "/bin/bash" 13 hours ago Up 13 hours cranky_curie
5813036629c5 tomcat "catalina.sh run" 14 hours ago Exited (130) 13 hours ago tomcat02
fad98b763f87 portainer/portainer "/portainer" 14 hours ago Up 14 hours 0.0.0.0:8088->9000/tcp epic_hodgkin
c372a55412cb elasticsearch:7.10.1 "/tini -- /usr/local…" 15 hours ago Up 15 hours 0.0.0.0:9200->9200/tcp, 0.0.0.0:9300->9300/tcp elasticsearch02
14b32a1562dc elasticsearch:7.10.1 "/tini -- /usr/local…" 15 hours ago Exited (143) 15 hours ago elasticsearch
63f607c6c6ba tomcat:9.0 "catalina.sh run" 16 hours ago Up 16 hours 0.0.0.0:3355->8080/tcp tomcat01
e22746833eea nginx "/docker-entrypoint.…" 16 hours ago Up 16 hours 0.0.0.0:8000->80/tcp nginx01
e7a7549e34f3 centos "/bin/bash" 17 hours ago Exited (0) 17 hours ago priceless_golick
# 再次在主机查看数据库数据,仍然在
[root@localhost data]# ls
auto.cnf ca-key.pem ca.pem client-cert.pem client-key.pem ib_buffer_pool ibdata1 ib_logfile0 ib_logfile1 ibtmp1 mydemo mysql performance_schema private_key.pem public_key.pem server-cert.pem server-key.pem sys
[root@localhost data]#
具名挂载和匿名挂载
匿名挂载(不建议使用)
# -v 容器内路径
[root@localhost data]# docker run -d -P --name nginx01 -v /etc/nginx nginx
f15ebee747b686995ff8ab691915331e4acd566b0abdcc8379f519014afd6444
[root@localhost data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f15ebee747b6 nginx "/docker-entrypoint.…" 8 seconds ago Up 6 seconds 0.0.0.0:49154->80/tcp nginx01
[root@localhost data]# docker volume --help
Usage: docker volume COMMAND
Manage volumes
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused local volumes
rm Remove one or more volumes
Run 'docker volume COMMAND --help' for more information on a command.
# 查看所有volume的情况
# 这就是匿名挂载,只写了容器内路径,没写容器外路径
[root@localhost data]# docker volume ls
DRIVER VOLUME NAME
local 2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809
local 0288a199540a4b5ae81ff6cabf95722adfa86da6c89cc03d7c92879ddcf089aa
local clsn
local f8ab0be1b0b4abeafda994ad4b1378bc361aa40de69cc0d04ff94166f76e7617
[root@localhost data]#
# 查看目录地址
# 挂载到主机的位置是:/var/lib/docker/volumes/2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809/_data
[root@localhost data]# docker volume inspect 2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809
[
{
"CreatedAt": "2021-02-26T16:09:02+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809/_data",
"Name": "2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809",
"Options": null,
"Scope": "local"
}
]
[root@localhost data]#
所有匿名挂载的位置都在:/var/lib/docker/volumes目录下
[root@localhost volumes]# pwd
/var/lib/docker/volumes
[root@localhost volumes]# ls
0288a199540a4b5ae81ff6cabf95722adfa86da6c89cc03d7c92879ddcf089aa 2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809 backingFsBlockDev clsn f8ab0be1b0b4abeafda994ad4b1378bc361aa40de69cc0d04ff94166f76e7617 jumingguazai metadata.db
[root@localhost volumes]#
具名挂载(推荐)
# -v 卷名:容器内路径
[root@localhost data]# docker run -d -P --name nginx02 -v jumingguazai:/etc/nginx nginx
368c649239cbfc011f0ee494193f1e3579e0b118de1b933c50ed5f0b4f5b8993
[root@localhost data]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
368c649239cb nginx "/docker-entrypoint.…" 10 seconds ago Up 8 seconds 0.0.0.0:49155->80/tcp nginx02
f15ebee747b6 nginx "/docker-entrypoint.…" 8 minutes ago Up 8 minutes 0.0.0.0:49154->80/tcp nginx01
[root@localhost data]# docker volume ls
DRIVER VOLUME NAME
local 2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809
local 0288a199540a4b5ae81ff6cabf95722adfa86da6c89cc03d7c92879ddcf089aa
local clsn
local f8ab0be1b0b4abeafda994ad4b1378bc361aa40de69cc0d04ff94166f76e7617
local jumingguazai
[root@localhost data]#
# 查看目录地址
# 挂载到主机的位置是:/var/lib/docker/volumes/jumingguazai/_data
[root@localhost data]# docker volume inspect jumingguazai
[
{
"CreatedAt": "2021-02-26T16:17:27+08:00",
"Driver": "local",
"Labels": null,
"Mountpoint": "/var/lib/docker/volumes/jumingguazai/_data",
"Name": "jumingguazai",
"Options": null,
"Scope": "local"
}
]
[root@localhost data]#
总结:
# 匿名挂载
-v 容器内路径
# 具名挂载
-v 卷名:容器内路径
# 指定路径挂载
-v /宿主机路径:容器内路径
通过 -v 容器内路径, ro rw 改变读写权限
# ro read only(这个路径只能通过宿主机操作,容器内无法操作!)
# rw read write
# 一旦设定了容器权限,容器对我们挂载出来的内容就有限定了
docker run -d -P --name nginx01 nginx-01:/etc/nginx:ro nginx
docker run -d -P --name nginx01 nginx-01:/etc/nginx:rw nginx
挂载方式2:dockerfile
dockerfile用来构建docker镜像的构建文件,是一种命令脚本。
镜像是一层一层的,每个命令是一层
创建一个dockerfile文件
文件中的内容,指令大写
[root@localhost testdocker]# vi Dockerfile
[root@localhost testdocker]# cat Dockerfile
FROM centos
VOLUME ["volume01","volume02"]
CMD echo "----------done-----------"
CMD /bin/bash
[root@localhost testdocker]#
[root@localhost testdocker]# pwd
/home/fancy/Desktop/Test_demo/testdocker
[root@localhost testdocker]# docker build -f /home/fancy/Desktop/Test_demo/testdocker/Dockerfile -t fancyos:1.0 .
Sending build context to Docker daemon 3.072kB
Step 1/4 : FROM centos
---> 300e315adb2f
Step 2/4 : VOLUME ["volume01","volume02"]
---> Running in dfd65c02804c
Removing intermediate container dfd65c02804c
---> 6a7a06df33c6
Step 3/4 : CMD echo "----------done-----------"
---> Running in 3d9defa67632
Removing intermediate container 3d9defa67632
---> 2fbcb5939edb
Step 4/4 : CMD /bin/bash
---> Running in f67795fcd7cc
Removing intermediate container f67795fcd7cc
---> 912cef2f7a9a
Successfully built 912cef2f7a9a
Successfully tagged fancyos:1.0
[root@localhost testdocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fancyos 1.0 912cef2f7a9a 12 seconds ago 209MB
tomcat02 1.0 e7c9683ae525 15 hours ago 672MB
nginx latest 35c43ace9216 8 days ago 133MB
tomcat 9.0 bf4709e77b18 2 weeks ago 667MB
tomcat latest bf4709e77b18 2 weeks ago 667MB
mysql 5.7 5f47254ca581 2 weeks ago 449MB
centos latest 300e315adb2f 2 months ago 209MB
elasticsearch 7.10.1 558380375f1a 2 months ago 774MB
portainer/portainer latest 62771b0b9b09 7 months ago 79.1MB
[root@localhost testdocker]# docker run -it 912cef2f7a9a /bin/bash
[root@6070138582f1 /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@6070138582f1 /]# ls -l
total 0
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 bin -> usr/bin
drwxr-xr-x. 5 root root 360 Feb 26 09:16 dev
drwxr-xr-x. 1 root root 66 Feb 26 09:16 etc
drwxr-xr-x. 2 root root 6 Nov 3 15:22 home
lrwxrwxrwx. 1 root root 7 Nov 3 15:22 lib -> usr/lib
lrwxrwxrwx. 1 root root 9 Nov 3 15:22 lib64 -> usr/lib64
drwx------. 2 root root 6 Dec 4 17:37 lost+found
drwxr-xr-x. 2 root root 6 Nov 3 15:22 media
drwxr-xr-x. 2 root root 6 Nov 3 15:22 mnt
drwxr-xr-x. 2 root root 6 Nov 3 15:22 opt
dr-xr-xr-x. 360 root root 0 Feb 26 09:16 proc
dr-xr-x---. 2 root root 162 Dec 4 17:37 root
drwxr-xr-x. 11 root root 163 Dec 4 17:37 run
lrwxrwxrwx. 1 root root 8 Nov 3 15:22 sbin -> usr/sbin
drwxr-xr-x. 2 root root 6 Nov 3 15:22 srv
dr-xr-xr-x. 13 root root 0 Feb 22 10:39 sys
drwxrwxrwt. 7 root root 145 Dec 4 17:37 tmp
drwxr-xr-x. 12 root root 144 Dec 4 17:37 usr
drwxr-xr-x. 20 root root 262 Dec 4 17:37 var
drwxr-xr-x. 2 root root 6 Feb 26 09:16 volume01
drwxr-xr-x. 2 root root 6 Feb 26 09:16 volume02
[root@6070138582f1 /]#
# 观察上面的文件目录,发现有两个出现在写的Dockerfile中,它们被挂载到了容器的文件系统。
# 进入并创建一个文件
[root@6070138582f1 /]# cd volume01/
[root@6070138582f1 volume01]# touch container.txt
打开另一终端:
# 查看运行的容器
[root@localhost volumes]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
6070138582f1 912cef2f7a9a "/bin/bash" 9 minutes ago Up 9 minutes sharp_black
368c649239cb nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:49155->80/tcp nginx02
f15ebee747b6 nginx "/docker-entrypoint.…" About an hour ago Up About an hour 0.0.0.0:49154->80/tcp nginx01
[root@localhost volumes]# docker inspect --help
Usage: docker inspect [OPTIONS] NAME|ID [NAME|ID...]
Return low-level information on Docker objects
Options:
-f, --format string Format the output using the given Go template
-s, --size Display total file sizes if the type is container
--type string Return JSON for specified type
# 查看容器信息
[root@localhost volumes]# docker inspect 6070138582f1
[
。。。
"Mounts": [
{
"Type": "volume",
"Name": "7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e",
"Source": "/var/lib/docker/volumes/7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e/_data",
"Destination": "volume01",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "57361775b609b9c825814059059ffd082d076dd7b93d073de10107bbd8d16db5",
"Source": "/var/lib/docker/volumes/57361775b609b9c825814059059ffd082d076dd7b93d073de10107bbd8d16db5/_data",
"Destination": "volume02",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
}
],
。。。
[root@localhost volumes]#
# 找到文件在宿主机的位置
[root@localhost volumes]# cd /var/lib/docker/volumes
[root@localhost volumes]# ls
0288a199540a4b5ae81ff6cabf95722adfa86da6c89cc03d7c92879ddcf089aa clsn
2bf7b8b20c492f412e85232d0aea0ecfae26a5aadbce1743843b3f5d92ae7809 f8ab0be1b0b4abeafda994ad4b1378bc361aa40de69cc0d04ff94166f76e7617
57361775b609b9c825814059059ffd082d076dd7b93d073de10107bbd8d16db5 jumingguazai
7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e metadata.db
backingFsBlockDev
[root@localhost volumes]# cd 7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e
[root@localhost 7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e]# ls
_data
[root@localhost 7aaeb684389f6099d6300509e7b281903a94086e84d9ef719b736a781690041e]# cd _data/
# 发现这里的数据也多了一个container.txt文件
[root@localhost _data]# ls
container.txt
[root@localhost _data]#
数据卷容器
# 查看镜像fancyos,是我们上面写的那个dockerfile生成的
[root@localhost testdocker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
fancyos 1.0 912cef2f7a9a 2 hours ago 209MB
tomcat02 1.0 e7c9683ae525 17 hours ago 672MB
nginx latest 35c43ace9216 8 days ago 133MB
tomcat 9.0 bf4709e77b18 2 weeks ago 667MB
tomcat latest bf4709e77b18 2 weeks ago 667MB
mysql 5.7 5f47254ca581 2 weeks ago 449MB
centos latest 300e315adb2f 2 months ago 209MB
elasticsearch 7.10.1 558380375f1a 2 months ago 774MB
portainer/portainer latest 62771b0b9b09 7 months ago 79.1MB
[root@localhost testdocker]#
# 启动一个名为fancy01的容器,
[root@localhost testdocker]# docker run -it --name fancy01 fancyos:1.0
[root@d73011ed82bc /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
[root@d73011ed82bc /]# cd volume01/
[root@d73011ed82bc volume01]# ls
# 在volume01目录下创建一个文件 test.txt
[root@d73011ed82bc volume01]# touch test.txt
# 退出上面的容器, 重新启动一个容器,从fancy01处挂载
# --volumes-from list Mount volumes from the specified container(s)
[root@d73011ed82bc volume01]# [root@localhost testdocker]# docker run -it --name fancy02 --volumes-from fancy01 fancyos:1.0
[root@b8cc2867093b /]# ls
bin dev etc home lib lib64 lost+found media mnt opt proc root run sbin srv sys tmp usr var volume01 volume02
# 进入并查看,发现在fancy02的,volume01/目录也有 test.txt,说明两个容器关联了起来(数据共享)
[root@b8cc2867093b /]# cd volume01/
[root@b8cc2867093b volume01]# ls
test.txt
[root@b8cc2867093b volume01]#
数据共享中,删除被关联的容器,其他容器间数据共享不会受影响
容器之间配置信息的传递,数据卷容器的生命周期一直持续到没有容器为止
但是持久到了本地,本地的数据是不会被删除的!