Docker 集群

#Docker

1. 说明

  一般情况下,我们用 Docker run 命令将 docker 启成普通进程。有时候我们有多台运行 docker 的机器,希望 Docker 以集群方式运行。与手动启动不同 Docker,集群涉及统一管理,各服务的状态监控,负载均衡,日志文件,重启,统一向外暴露端口等等。

  本篇介绍一些 Docker 集群相关的内容:包括集群管理工具 Smarm,卷 Volume,图形化管理工具 Portainer。

2. 安装 Docker 的最新版本

  如果 ubuntu 版本较低,用 apt-get 只能安装 docker 的早期版本,像 docker service, docker volume 等工具都无法正常使用,需要下载 docker 较新的版本,方法如下:

1
2
3
$ curl -fsSLO https://get.daocloud.io/docker/builds/Linux/x86_64/docker-17.05.0-ce.tgz
$ sudo tar --strip-components=1 -xvzf docker-17.05.0-ce.tgz -C /usr/local/bin #解压到bin目录
$ sudo dockerd

  执行 dockerd 启动 docker 后台服务,就无需再使用系统方式启动(service docker start),用 docker 命令即可与后台服务交互了。该方法也比较适用于在嵌入式系统中安装 docker。

3. Docker Portainer

 Portainer 是 Docker 的可视化管理工具,用它可以查看和管理 docker 的映像,容器,卷,后台服务等等。

 Docker 的辅助工具,一般也是以 Docker image 的方式提供,安装它们不需要用 apt-get 或者下载 tgz 包,只需要用 docker pull 把镜像下载到本地即可使用。安装 Portainer 方法如下:

1
2
3
4
5
6
7
8
$ docker search portainer  # 查看portainer相关的工具
$ docker pull docker.io/portainer/portainer #下载portainer镜像
$ docker images # 查看是否正常下载到本地
$ docker run -d -p 9000:9000 \
--restart=always \
-v /var/run/docker.sock:/var/run/docker.sock \
--name prtainer-test \
docker.io/portainer/portainer # 运行portainer

  此时用浏览器访问 http://127.0.0.1:9000,即可看到 portainer 界面,首次访问时需要设置密码 (如:admin, 12345678),登入后即可看到 docker 的各种状态。

4. Docker Volume

  上篇提到过,镜像是静态的,当容器关闭之后,对其中内容的修改不能保存,虽然可以用 commit 从容器生成镜像,但很麻烦,所以在手动运行容器时用 -v 参数,将容器外目录映射到容器内,以方便保存。

  在集群中以服务的方式启动 docker 时,不使用直接指定路径的映射方式,而使用 volume,简单地说,就是把容器外目录映射成一个 volume,再将该 volume 挂载成容器内目录,这样多个容器可使用同一 volume。

  具体方法如下:

1
2
3
4
$ docker volume create --name 名  # 创建volume, 默认位置在/var/lib/docker/volumes/名/_data
$ docker volume ls # 查看当前所有volume,也可使用portainer中的volume查看
$ docker volume inspect VOLUME_NAME # 查看volume的具体内容
$ docker rm -v VOLUME_NAME # 删除 volume

5. Docker Swarm

 Swarm 是 Docker 官方提供的一款集群管理工具,其主要作用是把若干台 Docker 主机抽象为一个整体,并且通过一个入口统一管理这些 Docker 主机上的各种 Docker 资源。

 Swarm 自己不运行容器,它只是接受 docker 客户端发送过来的请求,调度适合的节点来运行容器,这意味着,即使 Swarm 由于某些原因挂掉了,集群中的节点也会照常运行,当 Swarm 重新恢复运行之后,它会收集重建集群信息。

  具体方法如下:

1
2
3
4
$ docker pull swarm  # 下载swarm镜像
$ docker run swarm create
此时会显示集群号,要记住这个号,各台机器加入集群时,都需要指定这个号
$ docker run swarm list token://集群号 # 查看集群中的所有节点

  在各个 docker 机器用以下方式加入集群

1
$ docker run -d swarm join --addr=192.168.1.207:2375 token://集群号

  在管理节点上运行以下命令

1
$ docker rn -d -p 2376:2375 swarm manage token:

  此时用 docker ps 就可以看到此管理容器了

6. Docker Stack

  一个 stack 就是一组有关联的服务的组合,可以编排在一起管理。具体方法是将各个服务的内容填写在一个 yml 文件中。docker build 时指定的 CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在 yml 中再次设置。

 yml 文件写法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
version: "3.0"
services:
example: # 服务名
image: xieyan:0.4 # 镜像名
command: sleep 5000 # 执行的程序
volumes:
- haha:/root/model_data # 挂载的volume及容器中的对应目录
deploy:
mode: replicated
replicas: 1
placement:
constraints: [node.hostname!=node1] # 限制不在nod1结点执行
resources:
limits:
cpus: '2' # 限制CPU个数
memory: 2048M # 限制内存大小

volumes:
haha:
external: true

  开启和关系 stack 方法如期下:

1
2
$ docker stack deploy --compose-file tmp.yml testme # 开启stack, testme是stack名
$ docker stack rm testme # 关

  此时在 portainer 的 stack/service 中可以看到 testme_example

  如果启动服务出问题,可能会不停的重启,可用以下命令查看出错的具体原因。

1
$ docker service logs testme_example

7. 参考

Portainer -- Docker 可视化管理工具的安装配置及使用

https://blog.csdn.net/A632189007/article/details/78779920

Docker 管理工具 -Swarm 部署记录

https://www.cnblogs.com/liuyansheng/p/8178341.html

深入理解 Docker(镜像、容器、服务、swarm、stack)

https://blog.csdn.net/oChangWen/article/details/75758211

Docker 存储 volume

https://www.cnblogs.com/elvi/p/8463673.html