准备工作

我本机是macOS,所以我直接安装了docker desktop,其中包含了docker-machine,不用单独安装。

安装docker主机驱动

我在网上很多人提到了使用virtualbox,太重量级了,我安装了xhyve,更轻量级。

brew install docker-machine-driver-xhyve

下载boot2docker.iso

如果不安装的话第一次执行docker-machine create 速度会很慢,你懂得哦。所以在github上下载boot2docker.iso, 然后拷贝到对应目录下,我的主机目录(/Users/zhangfei/.docker/machine/cache),

创建docker主机

创建docker主机我们用到docker-machine 命令,这也是docker三剑客之一的命令。

查看主机

docker-machine ls

创建主机

# xhyve驱动
docker-machine create -d xhyve test1
# virtualbox驱动
docker-machine create -d virtualbox test1

进入主机

docker-machine ssh test1

退出主机

docker@test1:exit

创建swarm集群

创建三台docker主机

docker-machine create -d xhyve manager1 &&
docker-machine create -d xhyve worker-1 &&
docker-machine create -d xhyve worker-2

配置集群节点

执行以下命令,这里是在manager1主机上使用docker swarm创建一个管理节点,初始化集群的时候会自动把当前节点设置为管理员节点。

bogon:~ zhangfei$ docker-machine ssh manager1 "docker swarm init --advertise-addr 192.168.64.2"
Swarm initialized: current node (5lyi9tkwqyugnk9626f5jhamy) is now a manager. To add a worker to this swarm, run the following command: docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377 To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.

接着在worer1和worker2节点上创建worker节点,并加入集群,上面已经给出了提示命令。

bogon:~ zhangfei$ docker-machine ssh worker1 "docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377"
This node joined a swarm as a worker.
bogon:~ zhangfei$ docker-machine ssh worker2 "docker swarm join --token SWMTKN-1-318b8k07lgqj85ttgjrisl5yg9plqt4qr43ly2b1xsg80i6czr-7bthlott3bl8lqqvemsxothmv 192.168.64.2:2377"
This node joined a swarm as a worker.
bogon:~ zhangfei$

查看集群节点信息

docker@manager1:~$ docker node ls
ID HOSTNAME STATUS AVAILABILITY MANAGER STATUS ENGINE VERSION
5lyi9tkwqyugnk9626f5jhamy * manager1 Ready Active Leader 19.03.5
r01xh6k73cj24yqrmtau3bsqf worker1 Ready Active 19.03.5
5hkzm4ogghgbt6bale2bo7lf5 worker2 Ready Active 19.03.5
docker@manager1:~$

OK,到这里我们就创建一个最小的Swarm集群,包含一个管理节点和两个工作节点。

docker service部署单个集群服务

我们使用docker service命令来管理swarm集群中的服务,该命令只能在管理节点上执行, 这里我们使用nginx作为测试镜像,我这里会拉去nginx最新版本,拉取之前,我们先在3台docker主机上配置国内镜像地址,要不然拉取官方镜像的话会很慢。

#在三台主机上以此执行
docker@manager1:~$ sudo touch /etc/docker/daemon.json &&
> sudo chmod 777 /etc/docker/daemon.json &&
> sudo echo '{ "registry-mirrors": ["http://hub-mirror.c.163.com"]}' > /etc/docker/daemon.json
#修改完镜像地址后重启三台docker主机
docker-machine restart manager1 &&
docker-machine restart worker1 &&
docker-machine restart worker2
#docker service 拉取nginx镜像
docker@manager1:~$ docker service create --replicas 3 -p 8088:80 --name nginx nginx:latest
#也可以使用scale命令手动扩展服务个数
docker@manager1:~$ docker service scale 3
#服务部署好查看服务
docker@manager1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
ja2xjj0dn08m nginx replicated 3/3 nginx:latest *:8088->80/tcp
docker@manager1:~$ docker service ps nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
py9f7w78a95c nginx.1 nginx:latest manager1 Running Running 12 minutes ago
ghv07io2w1hv nginx.2 nginx:latest worker1 Running Running 12 minutes ago
y00d8c0xadil nginx.3 nginx:latest worker2 Running Running 12 minutes ago

三个服务部署好以后,可以使用三台机器任一ip查看nginx服务。

从集群中移除服务

docker@manager1:~$ docker service rm nginx

docker stack部署多个集群服务

docker service只能部署单个服务,部署多个服务的话则需要用到docker stack, 这里同样要使用到docker-compose.yml配置文件,docker-compose是在单机环境提供多容器编排工具,结合docker stack则实现了多主机容器编排服务。

先来创建docker-compose.yml文件,创建两个服务,一个是asp.net core的测试镜像,另一个是nginx,这里需要在管理节点创建yml文件。

version: "3"

services:
aspnetcore:
image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
ports:
- 8088:80
deploy:
mode: replicated
replicas: 3 nginx:
image: nginx:latest
ports:
- 8087:80
deploy:
mode: replicated
replicas: 3

如上所述,总共部署了两个服务,然后执行docker stack deploy命令。

docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-test
Creating network deploy-test_default
Creating service deploy-test_aspnetcore
Creating service deploy-test_nginx

查看服务

docker@manager1:~$ docker service ls
ID NAME MODE REPLICAS IMAGE PORTS
8au30q7tblq0 deploy-test_aspnetcore replicated 3/3 mcr.microsoft.com/dotnet/core/samples:aspnetapp *:8088->80/tcp
367gpz567iiv deploy-test_nginx replicated 3/3 nginx:latest *:8087->80/tcp

查看到服务名称,然后可以根据服务名称查看服务运行状况

docker@manager1:~$ docker service ps deploy-test_nginx
ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS
ov75hjkdux6i deploy-test_nginx.1 nginx:latest worker1 Running Running 27 seconds ago
bcq2zw5p33cb deploy-test_nginx.2 nginx:latest worker2 Running Running 27 seconds ago
cfhbisbab3op deploy-test_nginx.3 nginx:latest manager1 Running Running 27 seconds ago

到这一步,我们可以打开三台主机的任意一台,看下8088端口和8087端口的服务。

asp.net core 服务



nginx服务

GUI管理页面

当然,如果说要用于生产环境中,又或者是像通过更直观的方式观察容器或者服务的运行情况,我们肯定离不开可视化界面,这里推荐两个可视化工具**visualizer,portainer,  **我更新本地的docker-compose.yml,把portainer更新进去,portainer相比visualizer,功能更强大些,可支持在管理界面上操作服务。

         可视化工具只需要安装在管理节点上即可。

version: "3"

services:
aspnetcore:
image: mcr.microsoft.com/dotnet/core/samples:aspnetapp
ports:
- 8088:80
deploy:
mode: replicated
replicas: 3 nginx:
image: nginx:latest
ports:
- 8087:80
deploy:
mode: replicated
replicas: 3 portainer:
image: portainer/portainer:latest
ports:
- "9000:9000"
volumes:
- "/var/run/docker.sock:/var/run/docker.sock"
deploy:
replicas: 1
placement:
constraints: [node.role == manager]
#先暂停stack
docker@manager1:~$ docker stack down deploy-test
Removing service deploy-test_aspnetcore
Removing service deploy-test_nginx
Removing network deploy-test_default
#启动stack
docker@manager1:~$ docker stack deploy -c docker-compose.yml deploy-test

总结

在测试可视化工具时,我先使用visualizer,stack命令执行后Rurrent State一直是Preparing, 也就是说服务一直起不来,不知道什么情况,猜测可能是镜像问题,然后换了另一个portainer时就好了,证明确实是那个镜像有问题,这里感谢纯洁的微笑大哥和蟋蟀大哥的文章,学习了docker swarm相关。

参考

https://github.com/machine-drivers/docker-machine-driver-xhyve

https://www.cnblogs.com/guge-94/p/11102076.html

https://blog.csdn.net/Enjolras_fuu/article/details/89244113

https://www.cnblogs.com/xishuai/p/docker-swarm.html

Docker Swarm 从入门到放弃的更多相关文章

  1. Docker Swarm Mode 入门实践

    本文来源 翻译并总结官方文档,添加自定义示例,参考自Docker 19.03版本官方文档 未来可能归档为:https://docs.docker.com/v19.03/ 2020.01.03为http ...

  2. docker专题 从入门到放弃

    1.docker是什么 Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中,然后发布到任何流行的 Linux或Windows操作系统的机器上,也可以实现虚 ...

  3. 《区块链:从入门到放弃》之obc安装步骤

    obc安装步骤 朋友们可能会好奇,厨师不研究菜谱怎么改研究兵法了,哈哈,我原本是app出身,最近被安排去预研区块链和比特币技术,2个月下来,颇有斩获.期间得到IBM的CC同学指导我一步一步安装obc的 ...

  4. 基于 Consul 的 Docker Swarm 服务发现

    Docker 是一种新型的虚拟化技术,它的目标在于实现轻量级操作系统的虚拟化.相比传统的虚拟化方案,Docker 虚拟化技术有一些很明显的优势:启动容器的速度明显快于传统虚拟化技术,同时创建一台虚拟机 ...

  5. 生产环境中使用Docker Swarm的一些建议

    译者按: 实践中会发现,生产环境中使用单个Docker节点是远远不够的,搭建Docker集群势在必行.然而,面对Kubernetes, Mesos以及Swarm等众多容器集群系统,我们该如何选择呢?它 ...

  6. Docker 三剑客之 Docker Swarm

    上一篇:Docker 三剑客之 Docker Compose 阅读目录: Docker Machine 创建 Docker 主机 Docker Swarm 配置集群节点 Docker Service ...

  7. 云计算之路-阿里云上-容器难容:优化自建 docker swarm 集群的部署

    在上周六遭遇阿里云容器服务 swarm 版的故障之后,我们决定还是走自建 docker swarm 之路,只要不是阿里云底层的问题,我们相信会找到办法解决或避开自建 docker swarm 不稳定的 ...

  8. Docker(六):Docker 三剑客之 Docker Swarm

    实践中会发现,生产环境中使用单个 Docker 节点是远远不够的,搭建 Docker 集群势在必行.然而,面对 Kubernetes, Mesos 以及 Swarm 等众多容器集群系统,我们该如何选择 ...

  9. docker swarm 搭建与服务更新

    一,docker swarm 是什么 Docker Swarm.Docker Machine与Docker Compose号称Docker三剑客Docker Swarm 和 Docker Compos ...

随机推荐

  1. 【题解】有标号的DAG计数1

    [HZOI 2015] 有标号的DAG计数 I 设\(f_i\)为\(i\)个点时的DAG图,(不必联通) 考虑如何转移,由于一个DAG必然有至少一个出度为\(0\)的点,所以我们钦定多少个出度为\( ...

  2. $Poj2228$/洛谷$SP283\ Naptime$ 环形$DP$

    Luogu 一定要记得初始化为-inf!!! Description 在某个星球上,一天由N小时构成.我们称0-1点为第一个小时,1-2点为第二个小时,以此类推.在第i个小时睡觉能恢复Ui点体力.在这 ...

  3. JVM性能监测工具——VisualVM

    Java本身自带了有好几个jvm监测工具,其中jconsole和jvisualvm这两个工具具有图形化界面,可以监测到cpu.类.线程.堆等一些参数,而且具有远程监控的能力. 启动:打开cmd命令窗口 ...

  4. Web基础了解版11-Ajax-JSON

    Ajax AJAX即“Asynchronous Javascript And XML”:是,不发生页面跳转.异步请求载入内容并改写局部页面内容的技术. 也可以简单的理解为通过JS向服务器发送请求.   ...

  5. SpringBoot 2.X集成 jdbc自动配置原理探究

    前言 Springboot对于数据访问层,不管是 SQL还是 NOSQL,Spring Boot 底层都是采用 Spring Data 的方式统一处理.Spring Data 是 Spring 家族中 ...

  6. CTPN-自然文本场景检测代码阅读笔记

    TensorFlow代码 https://github.com/eragonruan/text-detection-ctpn 训练 main/train.py 1. utils/prepare/spl ...

  7. (1)解锁 MongoDB replica set核心姿势

    副本集Replica Set是一个术语,定义具有多节点的数据库集群,这些节点具有主从复制(master-slave replication) 且节点之间实现了自动故障转移. 这样的结构通常需要具有奇数 ...

  8. python中类的输出或类的实例输出为何是<__main__类名 object at xxxx>这种形式?

    原因: __str__()这个特殊方法将对象转换为字符串的结果 效果图: 代码: # 定义一个Person类 class Person(object): """人类&qu ...

  9. 重拾c++第二天(4):复合类型

    1.定义:种类 数组名[元素个数] = {元素1,...,元素n} ,或者直接赋值:数组名[元素位置] = 值; 2.部分初始化,其他全为0,可以就定义一个0,这样得到0数组(或者就一个{},别的啥也 ...

  10. 暑假提高组集训Day1 T2

    那么这一道题我在考试的时候写挂了(0分 呜呜~) 我原来的思路是广搜来骗取部分分(哈哈~) 但是我忘记了一个非常重要的问题 我广搜开的数组没有考虑负的下标 下一次考试如果再写暴力 就可以把坐标都加上一 ...