应用需求:在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 deploy或docker 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.
2。docker 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
6.Docker 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节点机上,不需要自己手动再布署,然后再运行起来,看来还比较自动化。