应用需求:在docker swarm环境下,希望某app所在的容器能在多个node上运行,则docker service create时镜像文件从registry中获取。

 

      考虑到要使用docker swarm 支持群集问题,docker软件安装不低于12版本,因此选择了Ubuntu 16系统。测试中若image是从已经有的网上registry中获取,一般没有什么大的问题,若是自己制作的镜像,没有把它放入registry中,而是直接在create service是指定的本地镜像,则会发现其容器集中运行在managernode上,worker node上则没有运行, 刚开始还没有留意这个问题,以为搭建好了swarm,容器在docker stack deploydocker service create时会自动发布在多个node上,实际情况则是事与愿违。


相关参考:
docker swarm
集群的搭建:
https://blog.csdn.net/letter_a/article/details/81975820

使用docker创建集成服务—lnmp

https://www.cnblogs.com/s-b-b/p/8624491.html

Ubuntu 搭建dockerregistry 私有仓库:

https://www.cnblogs.com/xiao987334176/p/9946915.html


简单地记录一下流水帐:
1
Docker的安装:

deb https://apt.dockerproject.org/repoubuntu-xenial main

apt-get install -y docker-engine=17.05.0~ce-0~ubuntu-xenial--fix-missing

vi /etc/apt/sources.list


列出下关的内处配置文件:

/etc/default/docker

/etc/docker/daemon.json
/etc/systemd/system/multi-user.target.wants/docker.service

 

shell中通过命令行提取文件中某一行某一列的字段

命令如下:

sed -n Np /file/path | cut -d " "-fM

docker ps|grep 8500 |cut -d " "-f1.

 

2docker swarm集群的搭建(略)
3
。制作镜像,docker-compose.yml(略)
4
。容器运行测试:

 

在执行docker service create --replicas 2--name my_eproc esproc /bin/bash
遇到image could not be accessed on a registry to recordits digest.
运行的容器都在manager node节点上,而没有分配到其它workernode上。

 

开始以为是生成的镜像问题,后来用《使用docker创建集成服务--lnmp》中的例子在本地测试一下,是没有问题,将它改为本地的镜像后,结果出现的现象与当前的一样,感觉问题出在镜像registry来源上,测试的image只是本地存在的,但它并没有入库。本来想取巧用阿里云docker来验证一下想法,谁知道以前正常的docker pull不行了, 只好在本地建立私有regitry来测试。

5.Ubuntu 搭建docker registry 私有仓库

docker pull registry

 

docker push 192.168.91.131:5000/alpine

输出:

The push refers to a repository [192.168.91.131:5000/alpine]
Get https://192.168.0.77:5000/v1/_ping: http: server gave HTTP response to HTTPS client
 这个需要在/etc/docker/daemon.json 中修改,其中若想基非manager node机上操作,也需要加上它 /etc/docker/daemon.json 
{
   "registry-mirrors": [
      "https://kv3q33c.mirror.aliyuncs.com"
   ],
   "insecure-registries": [
      "192.168.0.77:5000"
    ]
}
 
systemctl restart docker 检测上传的镜像库文件.
curl http://192.168.0.77:5000/v2/_catalog
 
6Docker stack deploy测试
esproc改为private registry,并上传
docker tag esproc 192.168.0.77:5000/unc/esproc
docker push 192.168.0.77:5000/unc/esproc

 

docker stack deploy -c docker-compose.yml my

# more docker-compose.yml

version: "3"

services:

  proc:

    image:192.168.0.77:5000/unc/esproc

    volumes:

      -/home/docker/share:/share:ro

      - /opt/app/u01:/u01

    deploy:

      replicas: 4

      resources:

        limits:

          cpus:"0.5"

          memory: 250M

      restart_policy:

        condition:on-failure

    tty: true

    ports:

      - "80:80"

    networks:

      - overlay

 

networks:

  overlay:

 

检测执行情况

# docker service ps my_proc

ID                 NAME                IMAGE                                 NODE                DESIRED STATE       CURRENT STATE               ERROR               PORTS

cbvp3xos2bqa       my_proc.1          192.168.0.77:5000/unc/esproc:latest  worker              Running             Running about an hour ago                      

18h3znc97mv2       my_proc.2          192.168.0.77:5000/unc/esproc:latest  master              Running             Running about an hour ago                      

doaqlydtoen2       my_proc.3          192.168.0.77:5000/unc/esproc:latest  worker              Running             Running about an hour ago                      

ejbqw4nuv728       my_proc.4          192.168.0.77:5000/unc/esproc:latest  master              Running             Running about an hour ago     

初次要慢一些,docker自动把要运行的镜像发布到关联的node节点机上,不需要自己手动再布署,然后再运行起来,看来还比较自动化。

09-07 13:35