1. 说明
一般情况下,我们用Docker run命令将docker启成普通进程。有时候我们有多台运行docker的机器,希望Docker以集群方式运行。与手动启动不同Docker,集群涉及统一管理,各服务的状态监控,负载均衡,日志文件,重启,统一向外暴露端口等等。
本篇介绍一些Docker集群相关的内容:包括集群管理工具Smarm,卷Volume,图形化管理工具Portainer。
2. 安装Docker的最新版本
如果ubuntu版本较低,用apt-get只能安装docker的早期版本,像docker service, docker volume等工具都无法正常使用,需要下载docker较新的版本,方法如下:
$ 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方法如下:
$ 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。
具体方法如下:
$ 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重新恢复运行之后,它会收集重建集群信息。
具体方法如下:
$ docker pull swarm # 下载swarm镜像
$ docker run swarm create
此时会显示集群号,要记住这个号,各台机器加入集群时,都需要指定这个号
$ docker run swarm list token://集群号 # 查看集群中的所有节点
在各个docker机器用以下方式加入集群
$ docker run -d swarm join --addr=192.168.1.207:2375 token://集群号
在管理节点上运行以下命令
$ docker rn -d -p 2376:2375 swarm manage token:
此时用docker ps就可以看到此管理容器了
6. Docker Stack
一个stack就是一组有关联的服务的组合,可以编排在一起管理。具体方法是将各个服务的内容填写在一个yml文件中。docker build时指定的CMD, EXPOSE, VOLUME, ENV 等) 将会自动被获取,无需在yml 中再次设置。
yml文件写法如下:
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方法如期下:
$ docker stack deploy --compose-file tmp.yml testme # 开启stack, testme是stack名
$ docker stack rm testme # 关
此时在portainer的stack/service中可以看到testme_example
如果启动服务出问题,可能会不停的重启,可用以下命令查看出错的具体原因。
$ 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