NingG +

Docker 系列:数据管理

当前分享,整理有单独的 keynote.

1. 概要

Docker 的数据管理,面临几个问题:

实现 2 个业务目标:

容器中,实现「数据存储」解耦,有 3 种方式:

3 中方式,详细描述一下:

如何挂载 volume、bind mount、tmpfs mount:

关于 –mount 的用法:

--mount <key>=<value>,<key>=<value>,<key>=<value>

其中,key 的具体取值说明:

volume (volume、bind mount)相关参数的含义:

疑问:

参考资料:

2. Bind mount

几个方面:

2.1. 基本知识

关于 Bind mount:

2.2. 实践

具体几个方面:

基本实例,对应操作:

# 1. bind mount:创建 container 时, 同步 bind mount
$ docker run -d \
   -it \
   --name devtest \
   --mount type=bind,source="$(pwd)"/target,target=/app \
   nginx:latest
 
docker: Error response from daemon: invalid mount config for type "bind": bind source path does not exist.
  
# 2. 分析 bind mount
$ docker inspect devtest
...
        "Mounts": [
            {
                "Type": "bind",
                "Source": "/Users/guoning/ningg/github/docker-learn/volume",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": "rprivate"
            }
        ],
...
  
# 3. 只读模式 bind mount
$ docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/target,target=/app,readonly \
  nginx:latest

特别说明:

3. volume

作用:数据存储在宿主机的 FS 上,为 Docker 独占的空间,非 Docker 进程不应该修改,推荐使用

注意事项

2 个方面:

3.1. 基本知识

基本知识:

几个疑问:

3.2. 实践

几个方面:

详细实例,参考: https://docs.docker.com/storage/volumes/

3.2.1. 基本实例

具体使用 volume 的实例:

# 0. 基本用法:创建、查看、分析、删除
# a. 创建 volume
docker volume create my-vol
  
# b. 查看 volume 列表
docker volume ls
  
# c. 分析 volume 详情
docker volume inspect my-vol
...
[
    {
        "CreatedAt": "2018-09-20T06:36:08Z",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
        "Name": "my-vol",
        "Options": {},
        "Scope": "local"
    }
]
...
# d. 删除
docker volume rm my-vol
  
# 1. 自动创建 volume:绑定 volume,Docker 会自动创建对应 volume
$ docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest
  
# 查看 volume 列表
$ docker volume ls
DRIVER              VOLUME NAME
local               myvol2
  
# 查看 container 对应的挂载点
$ docker inspect [containerId]|[containerName]
...
        "Mounts": [
            {
                "Type": "volume",
                "Name": "myvol2",
                "Source": "/var/lib/docker/volumes/myvol2/_data",
                "Destination": "/app",
                "Driver": "local",
                "Mode": "z",
                "RW": true,
                "Propagation": ""
            }
        ],
...
  
# 2. 创建只读的 volume:
$ docker run -d \
  --name=nginxtestReadOnly \
  --mount source=nginx-vol,destination=/usr/share/nginx/html,readonly \
  nginx:latest

补充说明:

3.2.2. 数据共享

分为 2 个方面:

3.2.2.1. 同一宿主机,容器间,数据共享

具体示例:

# 1. 创建 volume:创建一个 container,并创建 volume
$ docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest
  
# 登录容器,查看目标目录下,文件列表
$ docker exec -it devtest /bin/bash
$ cd /app
$ ls -alh
  
# 2. 容器间,共享 volume:创建另一个 container,共享上述 volume
$ docker run -d \
   --name=nginxtest \
   --mount source=myvol2,destination=/usr/share/nginx/html \
   nginx:latest
  
# 登录容器,查看目标目录下,文件列表
$ docker exec -it devtest /bin/bash
$ cd /app
$ ls -alh
3.2.2.2. 不同宿主机,容器间,数据共享

不同宿主机,实现容器间数据共享,基本上,都是 2 个思路可选:

下述示例,涵盖 2 个场景:

具体示例:

# 场景 A:创建独立的 volume
# 1. 安装插件
$ docker plugin install --grant-all-permissions vieux/sshfs
  
# 2. 创建 volume
$ docker volume create --driver vieux/sshfs \
  -o sshcmd=test@node2:/home/test \
  -o password=testpassword \
  sshvolume
  
# 场景 B:创建 container 过程中,创建 volume
$ docker run -d \
  --name sshfs-container \
  --volume-driver vieux/sshfs \
  --mount src=sshvolume,target=/app,volume-opt=sshcmd=test@node2:/home/test,volume-opt=password=testpassword \
  nginx:latest 

3.2.3. 数据备份

volume 中数据,如何进行备份、迁移。

TODO:

4. tmpfs mount

关于 tmpfs mount:

使用实例:

# 1. 创建 tmpfs mount
$ docker run -d \
  -it \
  --name tmptest \
  --mount type=tmpfs,destination=/app \
  nginx:latest
  
# 2. 分析 mount
$ docker inspect tmptest
...
        "Mounts": [
            {
                "Type": "tmpfs",
                "Source": "",
                "Destination": "/app",
                "Mode": "",
                "RW": true,
                "Propagation": ""
            }
        ],
...
  
# 3. 设置参数:tmpfs 内存大小 和 mode,默认为物理内存大小,tmpfs-size(单位 Byte), tmpfs-mode(rwx,1777)
$ docker run -d \
  -it \
  --name tmptest \
  --mount type=tmpfs,destination=/app,tmpfs-mode=1770 \
  nginx:latest

关于 tmpfs-mode 的默认 1777 模式,其中使用了 sticky bit:(约束 删除、移动等特殊的写权限,只有 owner 才有权限)

细节,参考:

5. 使用实践

关于 volume、bind mount、tmpfs mount 的使用实践:

6. 附录

6.1. 附录 A:镜像、容器、驱动器

6.1.1. 镜像

关于镜像:

上图展示了 ubuntu 15.04 镜像的层级关系

6.1.2. 容器

关于容器:

注意: 如果你有多个镜像需要 共享访问 相同的数据 ,那么需要将这些数据放在 docker volume中,并 mount 到你的容器中。

关于容器的大小:

6.1.3. volume 和 驱动器

容器和 volume:

7. 讨论问题

讨论内容:

8. 参考资料

Top