③. 容器如何挂载 volume、bindmount、temfsmount
①. 每一个容器里面的内容,支持三种挂载方式
①. docker自动在外部创建文件夹自动挂载容器内部指定的文件夹内容(Dockerfile VOLUME指令的作用)
②. 自己在外部创建文件夹,手动挂载(以/开头的)
③. 可以把数据挂载到内存中(基本不用)
④. Volumes(卷):存储在主机文件系统的一部分中,该文件系统由Docker管理(在Linux上的根目录是"/var/lib/docker/volumes/"(非Docker进程不应修改文件系统的这一部分,卷是在Docker中持久存储数据的最佳方法
Bind mounts(绑定挂载) 可以在任何地方存储在主机系统上。它们甚至可能是重要的系统
文件或目录。Docker主机或Docker容器上的非Docker进程可以随时对其进行修改
tmpfs mounts(临时挂载) 仅存储在主机系统的内存中,并且永远不会写入主机系统的文件系统
⑤. 管理卷(容器卷是用来做持久化处理的,有点类似我们Redis里面的rdb和aof文件)
docker volume create xxx:创建卷名
docker volume inspect xxx:查询卷详情
docker volume ls: 列出所有卷
docker volume prune: 移除无用卷
②. 直接挂载 volume(卷)
①. 具名卷使用 不以/开头的路径,Docker容器内部绝对路径:叫绑定(docker会自动管理,docker不会把他当前目录,而把它当前卷)
docker run -d --name mynginxvolume -p 30001:80 -v nginxhtml:/usr/share/nginx/html nginx
-v不以绝对路径方式: (1). 先在docker底层创建一个你指定名字的卷(具名卷)nginxhtml (2). 把这个卷和容器内部目录绑定 (3). 容器启动以后,目录里面的内容就在卷里面存着 [root@i-id8g0yu9 nginx]# docker run -d --name mynginxvolume -p 30001:80 -v nginxhtml:/usr/share/nginx/html nginx 2d1e2fadafbd81474234defd42e058c7b817796f91ad3e5de03b50a6d4ca2e16 [root@i-id8g0yu9 nginx]# docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 2d1e2fadafbd nginx "/docker-entrypoint.…" 4 seconds ago Up 3 seconds 0.0.0.0:30001->80/tcp, :::30001->80/tcp mynginxvolume [root@i-id8g0yu9 ~]# 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. [root@i-id8g0yu9 ~]# docker volume ls DRIVER VOLUME NAME local nginxhtml [root@i-id8g0yu9 ~]# docker volume inspect nginxhtml [ { "CreatedAt": "2021-04-17T15:39:42+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/nginxhtml/_data", "Name": "nginxhtml", "Options": null, "Scope": "local" } ] [root@i-id8g0yu9 ~]# cd /var/lib/docker/volumes/nginxhtml/_data [root@i-id8g0yu9 _data]# ls 50x.html index.html
②. -v /usr/share/nginx/html 效果:匿名卷 (什么都不写也不要加冒号,直接写容器内的目录)
[root@i-id8g0yu9 _data]# docker run -d --name mynginxvolume2 -v /usr/share/nginx/html -p 30002:80 nginx 44efbcbbb23325714fd6285cd5823f4d97a9937ebc34b35a7ee6b9d5555f3a5c [root@i-id8g0yu9 _data]# docker volume ls DRIVER VOLUME NAME local 958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4 local nginxhtml [root@i-id8g0yu9 _data]# docker volume inspect 958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4 [ { "CreatedAt": "2021-04-17T16:06:48+08:00", "Driver": "local", "Labels": null, "Mountpoint": "/var/lib/docker/volumes/958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4/_data", "Name": "958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4", "Options": null, "Scope": "local" } ] [root@i-id8g0yu9 _data]# cd /var/lib/docker/volumes/958a10da49ff92c048071292cb70dd329c080863aa3394eb9c0bc8d7204962f4/_data [root@i-id8g0yu9 _data]# ls 50x.html index.html
③. 手动挂载 bind mount
①. bind mount,文件挂载没有在外部准备好内容而导致的容器启动失败问题(一定要防止空挂载问题)
②. docker run -d -P -v /root/nginxconf:/etc/nginx/ -v /root/nginxhtml:/usr/share/nginx/html --name=nginx999 nginx
(一定要提前把/nginxconfig和nginxhtml以及里面的东西提前准备好,不然会出现空挂载问题)
③. 参考Nginx的安装步骤
④. 使用总结
- ①. 如果自己开发测试,用-v绝对路径的方式
- ②. 如果是生产环境建议用卷
- ③. 除非特殊/bin/docker需要挂载主机路径的则操作绝对路径挂载