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

posted on 2018-07-01 15:35  xieyan0811  阅读(54)  评论(0编辑  收藏  举报