0%

Docker 数据管理

容器中的数据在未设置时, 宿主机与其他容器是不感知, 其生命周期与容器生命周期保持一致; 然而数据的持久化是常见的需求, 例如记录关键日志; Docker 中支持两种方式的数据持久化:

  • 挂载数据卷(Volume)
  • 挂载主机目录(Bind Mounts)

image-20221030174516931

上图展示了Docker 数据管理的架构, 可供理解;

挂载数据卷

数据卷定义

数据卷是供一个或多个容器使用的目录, 存在诸多特性: 容器间共享, 修改即可生效, 生命周期独立于容器;

数据卷命令

1
2
3
4
5
6
7
8
9
10
11
docker volume --help
Usage: docker volume COMMAND
Manage volumes
Options:
--help Print usage
Commands:
create Create a volume
inspect Display detailed information on one or more volumes
ls List volumes
prune Remove all unused volumes
rm Remove one or more volumes

数据卷操作

  • 创建一个数据卷: docker volume create

    • 创建一个my-vol数据卷:docker volume create

      1
      2
      [root@VM-0-13-centos ~]# docker volume create my-vol
      my-vol
    • 查看所有数据卷信息: docker volume ls

      1
      2
      3
      [root@VM-0-13-centos ~]# docker volume ls
      DRIVER VOLUME NAME
      local my-vol

      发现刚创建的数据卷已出现在列表中;

    • 查看指定数据卷信息: docker volume inspect

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      [root@VM-0-13-centos ~]# docker volume inspect my-vol
      [
      {
      "Driver": "local",
      "Labels": {},
      "Mountpoint": "/var/lib/docker/volumes/my-vol/_data",
      "Name": "my-vol",
      "Options": {},
      "Scope": "local"
      }
      ]
  • 启动一个挂载数据卷的容器: docker run --mount

    docker run 命令中可选参数 -mount 用于指定数据卷的挂载, 一次可以指定多个数据卷;

    1
    2
    3
    4
    5
    6
    [root@VM-0-13-centos ~]# docker run -d -P \ 
    --name webs \
    --mount source=my-vol,target=/usr/share/nginx/html \
    nginx:v2

    c3f5eb699108de48074cb8050e9b811eb1d4a518ce35fe7fbe60040d8f82525c
  • 查看数据卷的具体信息: docker inspect [CONTAINERNAME]

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    [root@VM-0-13-centos ~]# docker inspect webs
    [
    ....
    "Mounts": [
    {
    "Type": "volume",
    "Name": "my-vol",
    "Source": "/var/lib/docker/volumes/my-vol/_data",
    "Destination": "/usr/share/nginx/html",
    "Driver": "local",
    "Mode": "z",
    "RW": true,
    "Propagation": ""
    }
    ],
    ....
    ]

  • 删除数据卷: docker volume rm [VOLUMENAME]

    数据卷 是被设计用来持久化数据的,它的生命周期独立于容器,Docker 不会在容器被删除后自动删除 数据卷,并且也不存在垃圾回收这样的机制来处理没有任何容器引用的 数据卷。如果需要在删除容器的同时移除数据卷。可以在删除容器的时候使用 docker rm -v 这个命令。

    无主的数据卷可能会占据很多空间,要清理请使用以下命令

挂载主机目录

挂载主机目录到指定Docker容器目录中, 是最直接的方式;

挂载主机目录充当数据卷

使用--mount标记可以指定一个本地主机目录到容器中:

1
docker run -d -v -P --name web --mount source=webapp,target=/usr/share/nginx/html nginx:v2

查看容器详情:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
docker inspect web
"Mounts": [
{
"Type": "volume",
"Name": "b7cf786fbd7bd5487677dcc9b3665e8bd22636a7fa1679e405184e6d7e661aa5",
"Source": "/var/lib/docker/volumes/b7cf786fbd7bd5487677dcc9b3665e8bd22636a7fa1679e405184e6d7e661aa5/_data",
"Destination": "-P",
"Driver": "local",
"Mode": "",
"RW": true,
"Propagation": ""
},
{
"Type": "volume",
"Name": "webapp",
"Source": "/var/lib/docker/volumes/webapp/_data",
"Destination": "/usr/share/nginx/html",
"Driver": "local",
"Mode": "z",
"RW": true,
"Propagation": ""
}
],

挂载主机文件充当数据卷

--mount 标记也可以从主机挂载单个文件到容器中

1
2
3
4
5
6
7
8
[root@VM-0-13-centos ~]# docker run --rm -it --mount type=bind,source=$HOME/.bash_history,target=/root/.bash_history    ubuntu:18.04    bash
Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
a404e5416296: Pull complete
Digest: sha256:ca70a834041dd1bf16cc38dfcd24f0888ec4fa431e09f3344f354cf8d1724499
Status: Downloaded newer image for ubuntu:18.04

root@729362a97898:/#