houjinkai 2020-06-18
介绍如何在 Docker 内部以及容器之间管理数据;在容器中管理数据主要有两种方式:数据卷(Volumes)、挂载主机目录 (Bind mounts)
[ ~]# docker pull registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17 [ ~]# docker tag ed21b7a8aee9 nginx:1.17 [ ~]# docker images | grep ‘nginx‘ nginx 1.17 ed21b7a8aee9 2 weeks ago 127MB registry.cn-beijing.aliyuncs.com/google_registry/nginx 1.17 ed21b7a8aee9 2 weeks ago 127MB
数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:
1、数据卷可以在容器之间共享和重用
2、对数据卷的修改会立马生效
3、对数据卷的更新,不会影响镜像
4、数据卷默认会一直存在,即使容器被删除
注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。
包括挂载目录和挂载文件
[ ~]# mkdir -p /data/nginx_test2  # 在宿主机创建目录,要挂载的目录
[ ~]# cat /etc/hosts   # 要挂载的文件
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# hosts info 2020-04-18
宿主机操作
# /data/nginx_test2:/data_volume_test2  目录挂载  前面:宿主机目录; 后面:容器目录
# /etc/hosts:/etc/hosts  文件挂载  前面:宿主机文件; 后面:容器文件
[ ~]# docker run -d -v /data/nginx_test2:/data_volume_test2 -v /etc/hosts:/etc/hosts --name nginx102 nginx:1.17  # 发布容器
[ ~]# docker inspect nginx102   # 然后在 Mounts 查看信息
…………
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/etc/hosts",
                "Destination": "/etc/hosts",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/data/nginx_test2",
                "Destination": "/data_volume_test2",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
…………
# 在宿主机的挂载目录创建文件和目录
[ ~]# cd /data/nginx_test2/
[ nginx_test2]# echo "aaa" > aaa
[ nginx_test2]# mkdir abc
[ nginx_test2]# ll
total 4
-rw-r--r-- 1 root root 4 Apr 18 16:41 aaa
drwxr-xr-x 2 root root 6 Apr 18 16:41 abc
容器操作
# 进入容器
[ ~]# docker exec -it nginx102 bash
# 查看挂载目录信息
:/# ls  
bin  boot  data_volume_test2  dev  etc    home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var
:/# cd data_volume_test2/
:/data_volume_test2# ls -l
total 4
-rw-r--r-- 1 root root 4 Apr 18 08:41 aaa
drwxr-xr-x 2 root root 6 Apr 18 08:41 abc
# 查看挂载文件信息
:/# cat /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# hosts info 2020-04-18
数据卷挂载方式2【了解】
宿主机操作
[ ~]# docker run -d -v /data_volume --name nginx101 nginx:1.17   # 发布时,加入数据卷信息 -v /data_volume
594ea376d9301263046b13c72304af9c74a2a7516d0f3d8292f020ceba94742d
[ ~]# docker ps 
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS    NAMES
594ea376d930   nginx:1.17     "nginx -g ‘daemon of…"   5 seconds ago   Up 3 seconds   80/tcp   nginx101 
[ ~]# docker inspect -f {{.Mounts}} nginx101   # 或者执行 docker inspect nginx101 然后在 Mounts 查看信息
[{volume b7bXXXX897 /var/lib/docker/volumes/b7bXXXX897/_data /data_volume local  true }]
[ ~]# cd /var/lib/docker/volumes/b7bXXXX897/_data  # 进入数据卷目录
[ _data]# echo "1111" > 111  # 创建文件并写入数据
[ _data]# mkdir aaa/bbb -p   # 创建多个目录
进入容器操作
[ ~]# docker exec -it nginx101 bash   # 进入容器
:/# ls -l   # 查看容器根目录信息
total 8
drwxr-xr-x   2 root root 4096 Mar 27 00:00 bin
drwxr-xr-x   2 root root    6 Feb  1 17:09 boot
drwxr-xr-x   2 root root    6 Apr 17 14:35 data_volume  # 存在该目录
drwxr-xr-x   5 root root  340 Apr 17 14:35 dev
…………
:/# cd data_volume/   # 进入数据卷
:/data_volume# ls -l  # 可见文件和目录都在容器中存在
total 4
-rw-r--r-- 1 root root  5 Apr 17 14:44 111
drwxr-xr-x 3 root root 17 Apr 17 14:44 aaa
查看容器的挂载信息
:/# mount  # 查看容器挂载信息
………………
/dev/sda2 on /data_volume type xfs (rw,relatime,attr2,inode64,noquota)   # 找到数据卷信息
………………
挂载主机目录【--mount】
包括挂载目录和挂载文件
宿主机挂载的目录和文件
[ ~]# mkdir -p /data/nginx_test3  # 在宿主机创建目录,要挂载的目录
[ ~]# cat /etc/hosts     # 要挂载的文件
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
# hosts info 2020-04-18宿主机操作
[ ~]# docker run -d --mount type=bind,source=/data/nginx_test3,target=/data_volume_test3 --mount type=bind,source=/etc/hosts,target=/etc/hosts --name nginx103 nginx:1.17   # 发布容器
[ ~]# docker inspect nginx103  # 在Mounts可见容器的挂载信息
…………
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/data/nginx_test3",
                "Destination": "/data_volume_test3",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            },
            {
                "Type": "bind",
                "Source": "/etc/hosts",
                "Destination": "/etc/hosts",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
…………
# 在宿主机的挂载目录创建文件和目录
[ ~]# cd /data/nginx_test3/
[ nginx_test3]# echo "123" > 123
[ nginx_test3]# mkdir -p 111/222
[ nginx_test3]# ll
total 4
drwxr-xr-x 3 root root 17 Apr 18 18:05 111
-rw-r--r-- 1 root root  4 Apr 18 18:05 123
[ nginx_test3]# tree 
.
├── 111
│   └── 222
└── 123
2 directories, 1 file容器操作
# 进入容器 [ ~]# docker exec -it nginx103 bash # 查看挂载目录信息 :/# ls bin boot data_volume_test3 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var :/# ls -l data_volume_test3/ total 4 drwxr-xr-x 3 root root 17 Apr 18 10:05 111 -rw-r--r-- 1 root root 4 Apr 18 10:05 123 # 查看挂载文件信息 :/# cat /etc/hosts 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 # hosts info 2020-04-18
完毕!
———END———
如果觉得不错就关注下呗 (-^O^-) !
