目录

学习 Docker(5)-Docker 服务管理

Docker 容器的网络连接

Docker 客户端和守护进程

Docker 为 c/s 架构,客户端和守护进程支持以下三种 socket:

  • unix:///var/run/docker.sock
  • tcp://host:port
  • fd://socket

自定义的 Docker 客户端 可以通过 Remote API 与 Docker 守护进程进行通信。

Docker 客户端远程访问

Docker 守护进程使用 -H —-host 选项指定 socket;

1
$ sudo dockerd -H unix:///var/run/docker.sock -H tcp://192.168.59.106 -H tcp://10.10.10.2

Docker 客户端使用 -H —-host 选项

1
$ docker -H tcp://0.0.0.0:2375 ps

或者指定 DOCKER_HOST 环境变量指定 socket

1
2
$ export DOCKER_HOST="tcp://0.0.0.0:2375"
$ docker ps

Docker 容器的互联

Docker 容器使用虚拟网桥与宿主机通信,默认网段为 172.17.42.1/16

虽然同一宿主机上的 Docker 容器可以互相访问,但由于 Docker 容器的 IP 地址在容器启动时分配,所以容器间不能通过指定 IP 的方式互相连接。

要链接到其他容器,可以在容器启动时添加 —-link 参数:

1
docker run —-link=[CONTAINER_NAME or CONTAINER_ID]:[ALIAS]

ALIAS 是给被链接容器设置的别名,可以在容器中直接使用这个名字访问被链接容器。

如果要禁止容器的互相访问,设置 Docker 守护进程的 --icc 参数为 false。

如果只允许特定容器的互相访问:

  1. 守护进程设置参数 —-icc=false(默认为 true)和 --iptables=true
  2. 相互访问的容器设置 —-link 参数。

Docker 容器的数据管理

数据卷

有两种方式挂载数据卷。

一种是,在 Dockerfile 构建文件中使用 VOLUME 命令创建数据卷。通过这种方式创建的数据卷,在容器启动时会被映射到宿主机上不存在的随机目录。不能用于不同容器之间的共享。

另一种是,使用 -v—-volume 参数在容器启动时挂载数据卷:

1
docker run -v [宿主机目录]:[容器中目录]:[访问权限]

容器中目录必须为绝对路径

访问权限可以不指定,可选值为:

  • wr 读写(默认值);
  • ro 只读;

数据卷容器

一个容器挂载数据卷,其他容器通过挂载这个容器实现数据共享。挂载数据卷的容器,被称之为数据卷容器

其他容器通过 —volumes-from 指令在运行时挂载数据卷容器

1
docker run —-volumes-from [数据卷容器名]

下面是一个实例。

首先,我们新建一个 Dockerfile 文件,在文件中创建数据卷 /datavolume

1
2
3
4
FROM ubuntu:latest

VOLUME /datavolume
CMD bash

使用该文件构建镜像 dv

1
docker build -t dv - < Dockerfile

新建一个数据卷容器 dv1,把数据卷 /datavolume 映射到宿主机 ~/Downloads 目录

1
docker run --name dv1 -it -v ~/Downloads:/datavolume dv

此时该容器已经挂载了 /datavolume 数据卷,我们在数据卷中新建文件 dv1.txt,然后退出 dv1 的 shell,dv1 停止运行。

1
echo "" > /datavolume/dv1.txt

基于 Ubuntu 镜像新建容器 dv2,把 dv1 作为数据卷容器

1
docker run --name dv2 --volumes-from dv1  -it ubuntu

基于 Ubuntu 镜像新建容器 dv3,把 dv1 作为数据卷容器

1
docker run --name dv3 --volumes-from dv1  -it ubuntu

在 dv2 和 dv3 中访问 /datavolume 目录,都能看到我们新建的 dv1.txt 文件。

删除 dv1 容器

1
docker rm dv1

在 dv2 中删除文件 dv1.txt,宿主机中 ~/Downloads 目录中文件也已经被删除。

查看 dv2 容器的信息,可以看到 dv2 容器中 /datavolume 数据卷直接映射到了宿主机的 ~/Downloads 目录

1
docker inspect dv2

该数据卷容器的作用仅仅在于传递配置信息(映射关系)。即使删除数据卷容器,容器与宿主机的映射关系仍然存在。

数据卷的备份和还原

  1. 使用 -—volumes-from 挂载数据卷容器
  2. 使用 -v 挂载备份目录
  3. 使用 tar 命令将数据卷容器目录打包放到备份目录,即实现了数据卷的备份。