Docker进阶(一)挂载——容器数据卷

容器数据卷

卷技术,作用是数据共享。由于容器删除后内部修改的数据也会丢失,因此需要有个地方存储数据。 卷技术可以让容器本地产生的数据映射到本地,卷技术的本质是目录的挂载,将容器内部的目录挂载到宿主机上,实现容器持久化。包括容器间也可以共享
docker -v 主机目录:容器目录
# 就算重启容器,映射关系也还是会存在
 
 
 

安装mysql

 
navicat连接到云服务器的3305端口,映射到docker容器的3306端口,即可连接成功
docker run -d -p 3305:3306 -v /home/mysql/conf:/etc/mysql/conf.d -v /home/mysql/data:/var/lib/mysql  -e MYSQL_ROOT_PASSWORD=root --name mysql01 mysql:5.7

-v:挂载卷
-e:配置环境,这里是设置root密码

本地创建数据库,数据直接是同步的。就算将容器删除,挂载到本地的数据卷中的数据也不会丢失

 

具名挂载和匿名挂载

 

匿名挂载

没有给挂载点取名。在-v时没有写容器外的路径,只写了容器内的路径
[root@VM-0-7-centos ~]# docker run -d -P --name jmnginx -v /etc/nginx nginx
可以发现,匿名挂载的外部路径,默认是在 /var/lib/docker/volumes/xxx/_data
[root@VM-0-7-centos ~]# docker volume ls
DRIVER    VOLUME NAME
local     39e68d440c53a251de69252c9e767a0386c88ddcf699d7ba42ec556e8c94d74b
 
[root@VM-0-7-centos ~]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                       NAMES
25b3bd3c330b   nginx     "/docker-entrypoint.…"   4 minutes ago   Up 4 minutes   0.0.0.0:49153->80/tcp, :::49153->80/tcp     jmnginx
 
[root@VM-0-7-centos ~]# docker inspect jmnginx
…………
"Mounts": [
            {
                "Type": "volume",
                "Name": "5940b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d",
                "Source": "/var/lib/docker/volumes/5940b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d/_data",
                "Destination": "/etc/nginx",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
…………
 
 

具名挂载

为挂载卷指定名字,方便查找卷,一般都是使用具名挂载
[root@VM-0-7-centos _data]# docker run -d -P --name nginx -v jmnginx:/etc/nginx nginx
8052e5458d216512b650455d97713e30fdb0dd31b49e22335cef8bb2a7625532
[root@VM-0-7-centos _data]# docker ps
CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                       NAMES
8052e5458d21   nginx     "/docker-entrypoint.…"   8 seconds ago   Up 6 seconds   0.0.0.0:49154->80/tcp, :::49154->80/tcp     nginx
 
[root@VM-0-7-centos _data]# docker volume ls
DRIVER    VOLUME NAME
local     39e68d440c53a251de69252c9e767a0386c88ddcf699d7ba42ec556e8c94d74b
local     5940b7fbf8563daefa34a40270ac793bf2b2084d8e6702dc0c2999681542c66d
local     jmnginx
 
[root@VM-0-7-centos _data]# docker volume inspect jmnginx
[
    {
        "CreatedAt": "2021-12-05T16:57:41+08:00",
        "Driver": "local",
        "Labels": null,
        "Mountpoint": "/var/lib/docker/volumes/jmnginx/_data",
        "Name": "jmnginx",
        "Options": null,
        "Scope": "local"
    }
]
[root@VM-0-7-centos _data]#

扩展

为容器挂载出来的内容设置读写权限
[root@VM-0-7-centos _data]# docker run -d -P --name nginx -v jmnginx:/etc/nginx:ro/rw nginx
 
:ro  read-only  只读,只可通诺宿主机来操作,容器内不无法操作
:rw  read write 可读写(默认)

 

 

在DockerFile中挂载

dockerfile用于构建docker镜像的构建文件,命令脚本。docker镜像是一层层的,dockerfile也是一个个命令的。
[root@VM-0-7-centos docker-test-volume]# cat dockerfile01   #新建脚本,注意,脚本中的指令都是大写的
FROM centos
VOLUME ["volume01","volume02"]
 
 
CMD echo "-------------end--------"
 
 
CMD /bin/bash
 

构建镜像

-f file名   -t 镜像名
[root@VM-0-7-centos docker-test-volume]# docker build -f dockerfile01 -t yuanzhou/centos:1.0 .
Sending build context to Docker daemon  2.048kB
Step 1/4 : FROM centos
---> 5d0da3dc9764
Step 2/4 : VOLUME ["Vvolume01","volume02"]
---> Running in 794cbe294f47
Removing intermediate container 794cbe294f47
---> 64be4f7b9f83
Step 3/4 : CMD echo "-------------end--------"
---> Running in f16a4be3b1c0
Removing intermediate container f16a4be3b1c0
---> e9f0e352192d
Step 4/4 : CMD /bin/bash
---> Running in 7c1a9d4a1363
Removing intermediate container 7c1a9d4a1363
---> 989969f6fbad
Successfully built 989969f6fbad
Successfully tagged yuanzhou/centos:1.0
 
[root@VM-0-7-centos docker-test-volume]# docker images
REPOSITORY            TAG       IMAGE ID       CREATED         SIZE
yuanzhou/centos       1.0       989969f6fbad   3 minutes ago   231MB

启动镜像

这种挂载也较为常用,如果构建镜像时没有挂载,就需要手动-v挂载
[root@VM-0-7-centos docker-test-volume]# docker run -it yuanzhou/centos:1.0 /bin/bash
[root@d6afa730c9b7 /]# ls
volume01  bin  dev  etc  home  lib  lib64  lost+found  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var  volume02
 
#这里的volume01和volume02就是创建镜像时自动挂载的,这种目录属于匿名目录。使用inspect可以查看宿主机的目录
"Mounts": [
            {
                "Type": "volume",
                "Name": "c432ac4c1479b54b8b2248a5bd982b0d95f2909e605b0d1744bd9734c9f093f6",
                "Source": "/var/lib/docker/volumes/c432ac4c1479b54b8b2248a5bd982b0d95f2909e605b0d1744bd9734c9f093f6/_data",
                "Destination": "Vvolume01",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            },
            {
                "Type": "volume",
                "Name": "358875250c31b98b1b5ff64e17f7873f5b3ed65f75207e5f127d430ef89b5221",
                "Source": "/var/lib/docker/volumes/358875250c31b98b1b5ff64e17f7873f5b3ed65f75207e5f127d430ef89b5221/_data",
                "Destination": "volume02",
                "Driver": "local",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],

 

数据卷容器

 多个容器挂载同一个目录。是容器之间的数据共享
 
 
 
 
数据卷:挂载的目录
 
docker run -it --name centos02 --volumes-from d6afa730c9b7 yuanzhou/centos:1.0
 
--volumes-from 从第一台机器volume出来的容器,数据卷目录的是共享的,即使源容器删掉目录也不会丢失,因为文件本身是存储在宿主机上的

 

 
 
posted @ 2021-12-04 11:29  我永远喜欢石原里美  阅读(472)  评论(0编辑  收藏  举报