暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Docker数据管理与挂载

OpenInfo 2020-08-10
200


介绍如何在 Docker 内部以及容器之间管理数据;在容器中管理数据主要有两种方式:数据卷(Volumes)、挂载主机目录 (Bind mounts)


镜像来源

    [root@docker01 ~]# docker pull registry.cn-beijing.aliyuncs.com/google_registry/nginx:1.17
    [root@docker01 ~]# docker tag ed21b7a8aee9 nginx:1.17
    [root@docker01 ~]# 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


    数据卷【-v, --volume】

    数据卷 是一个可供一个或多个容器使用的特殊目录,它绕过 UFS,可以提供很多有用的特性:


    1、数据卷可以在容器之间共享和重用


    2、对数据卷的修改会立马生效


    3、对数据卷的更新,不会影响镜像


    4、数据卷默认会一直存在,即使容器被删除


    注意:数据卷的使用,类似于 Linux 下对目录或文件进行 mount,镜像中的被指定为挂载点的目录中的文件会隐藏掉,能显示看的是挂载的数据卷。


    数据卷挂载方式1【重点,常用】

    包括挂载目录挂载文件


    宿主机挂载的目录和文件

      [root@docker01 ~]# mkdir -p data/nginx_test2  # 在宿主机创建目录
      [root@docker01 ~]# 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 文件挂载 前面:宿主机文件;后面:容器文件
        [root@docker01 ~]# docker run -d -v data/nginx_test2:/data_volume_test2 -v etc/hosts:/etc/hosts --name nginx102 nginx:1.17 # 发布容器
        [root@docker01 ~]# 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"
        }
        ],
        …………
        # 在宿主机的挂载目录创建文件和目录
        [root@docker01 ~]# cd data/nginx_test2/
        [root@docker01 nginx_test2]# echo "aaa" > aaa
        [root@docker01 nginx_test2]# mkdir abc
        [root@docker01 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


        容器操作

          # 进入容器
          [root@docker01 ~]# docker exec -it nginx102 bash
          # 查看挂载目录信息
          root@8c8db5089c0e:/# ls
          bin boot data_volume_test2 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
          root@8c8db5089c0e:/# cd data_volume_test2/
          root@8c8db5089c0e:/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
          # 查看挂载文件信息
          root@2537d3854b42:/# 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【了解】

          宿主机操作

            [root@docker01 ~]# docker run -d -v data_volume --name nginx101 nginx:1.17   # 发布时,加入数据卷信息 -v data_volume
            594ea376d9301263046b13c72304af9c74a2a7516d0f3d8292f020ceba94742d
            [root@docker01 ~]# 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
            [root@docker01 ~]# docker inspect -f {{.Mounts}} nginx101 # 或者执行 docker inspect nginx101 然后在 Mounts 查看信息
            [{volume b7bXXXX897 var/lib/docker/volumes/b7bXXXX897/_data data_volume local true }]
            [root@docker01 ~]# cd var/lib/docker/volumes/b7bXXXX897/_data # 进入数据卷目录
            [root@docker01 _data]# echo "1111" > 111 # 创建文件并写入数据
            [root@docker01 _data]# mkdir aaa/bbb -p # 创建多个目录


            进入容器操作

              [root@docker01 ~]# docker exec -it nginx101 bash   # 进入容器
              root@594ea376d930:/# 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
              …………
              root@594ea376d930:/# cd data_volume/ # 进入数据卷
              root@594ea376d930:/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


              查看容器的挂载信息

                root@594ea376d930:/# mount  # 查看容器挂载信息
                ………………
                /dev/sda2 on /data_volume type xfs (rw,relatime,attr2,inode64,noquota) # 找到数据卷信息
                ………………


                挂载主机目录【--mount】

                包括挂载目录挂载文件


                宿主机挂载的目录和文件

                  [root@docker01 ~]# mkdir -p /data/nginx_test3  # 在宿主机创建目录
                  [root@docker01 ~]# 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


                  宿主机操作

                    [root@docker01 ~]# 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   # 发布容器
                    [root@docker01 ~]# 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"
                    }
                    ],
                    …………
                    # 在宿主机的挂载目录创建文件和目录
                    [root@docker01 ~]# cd /data/nginx_test3/
                    [root@docker01 nginx_test3]# echo "123" > 123
                    [root@docker01 nginx_test3]# mkdir -p 111/222
                    [root@docker01 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
                    [root@docker01 nginx_test3]# tree
                    .
                    ├── 111
                    │ └── 222
                    └── 123


                    2 directories, 1 file


                    容器操作

                      # 进入容器
                      [root@docker01 ~]# docker exec -it nginx103 bash
                      # 查看挂载目录信息
                      root@c9427fcbc26c:/# ls
                      bin boot data_volume_test3 dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
                      root@c9427fcbc26c:/# 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
                      # 查看挂载文件信息
                      root@c9427fcbc26c:/# 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^-) !


                      文章转载自OpenInfo,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                      评论