文章目录
- 0、环境准备
- 1、搭建swarm集群:
- 1、在server02上,初始化swarm
- 2、在另2台执行:
- 3、高可用配置
- 1、提升server01,server03为manger节点
- 2、创建服务(ingress网络)
- 1、创建
- 3、创建服务(自定义网络)
- 4、dnsrr
- 5、docker stack
0、环境准备
3台:
server01 192.168.0.108
server02 192.168.0.109
server03 192.168.0.111
网络环境查看:
docker network ls
1、搭建swarm集群:
1、在server02上,初始化swarm
docker swarm init --advertise-addr 192.168.0.109
2、在另2台执行:
docker swarm join --token SWMTKN-1-0lp2ymzcrps7sis0tm1gfp0tz8e2wc1c8oflxdx8j4t9tafufc-7xitjyduducjndc03s6t0yi3o 192.168.0.109:2377
3、高可用配置
1、提升server01,server03为manger节点
docker node promote server01
docker node ls
docker node promote server03
docker node ls
集群环境搭建完成。
2、创建服务(ingress网络)
1、创建
测试:
docker service create --name 起个名字 镜像名字 执行命令
docker service create --name test1 alpine ping www.baidu.ccom
查看:
docker service ls
查看信息:
docker service inspect 服务名
docker service inspect test1
创建一个nginx服务:
docker service create --name 起个服务名字 镜像名字
docker service create --name nginx nginx
发现没有暴露端口,更新一下:
docker service update --publish-add 对外暴露的端口:nginx本身的端口 服务名字
docker service update --publish-add 8080:80 nginx
docker service ls
查看端口:
netstat -na | grep LISTEN
访问server02的ip,测试nginx是否能访问。
http://192.168.0.109:8080/
访问server01,server03也都可以。说明ingress生效了,在每个节点都暴露了8080,通过vip访问到了提供nginx服务的容器。
把nginx 扩容成3个节点。
docker service scale nginx=3
有3个实例后,浏览器访问时,会vip lb的方式做一个负载均衡。
下面验证:
docker service ps nginx
就在server02上,修改一下nginx页面。查看容器
docker ps
进入容器:
docker exec -it 9925c8ad297d bash
echo "hello,i am the test nginx" > /usr/share/nginx/html/index.html
浏览器访问;有会话保存。
http://192.168.0.109:8080/
docker service ps test1
test1运行在server02上,
在server02,进入到test1容器,在test1里,ping nginx没有找到,说明不能通过名字找到nginx服务。
通过ingress的routing mesh的服务发现找到nginx。
3、创建服务(自定义网络)
首先,看下有哪些网络
创建一个网络。
docker network create -d overlay demo-overlay
docker network ls
把之前的服务停掉:
docker service rm nginx test1
docker service ls
重新创建一个服务:
docker service create --network demo-overlay --name nginx -p 8080:80 nginx
docker service create --network 指定自定义的网络 --name 网络名字 --name 服务名字 镜像名字 ping www.baidu.com
docker service create --network demo-overlay --name alpine --name alpine alpine ping www.baidu.com
docker service ls
查看运行在哪里:
docker service ps alpine
在server01上,到server01上执行命令:
进入到容器:
docker exec -it c4cb bash
可以ping通nginx:
wget nginx是可以的。
wget nginx:8080是不可以的。因为用名字去访问的时候,相当于容器间的访问,而不是通过主机绕一圈去访问。虽然也是通过vip,但还是有区别于主机的方式。
alpine没有对外暴露端口,只能通过名字的方式去访问。
nginx可以外部去调用,可以容器间通过名字去调用。
4、dnsrr
dnsrr,是给通过名字调用,而且是在容器间,不需要给外部的调用。
如果没有指定–network,会跟之前创建的服务,不在一个网络上。所以这里指定。
docker service create --name 起个服务名字 --endpoint-mode dnsrr的方式 --network 指定网络 镜像名
docker service create --name nginx-b --endpoint-mode dnsrr --network demo-overlay nginx
查看运行在哪:在server01上。
docker service ps alpine
在server01上,运行:
docker ps
docker exec -it c4cbab44b42e sh
ping nginx-b
ping nginx,都能ping通。
停止所以服务。
docker service rm alpine nginx nginx-b
5、docker stack
创建一个service.yml:
version: "3.4"
services:
alpine:
image: alpine
command:
- "ping"
- "www.baidu.com"
networks:
- "demo-overlay"
deploy:
replicas: 2
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
depends_on:
- nginx
nginx:
image: nginx
networks:
- "demo-overlay"
ports:
- "8080:80"
networks:
demo-overlay:
external: true
运行:
docker stack deploy -c service.yml 起一个名字
docker stack deploy -c service.yml test
查看:
docker stack ls
查看:
docker stack services test
查看:也是一样的
docker service ls
访问server01,server03:都可以访问。
查看:
docker service ps test_alpine
去server02上:
docker ps
进入到容器中,ping一下nginx,是可以访问的。走的vip的负载均衡的方式,而不是走的dnsrr的方式。
dnsrr的方式:在service.yml加一行,
endpoint_node: dnsrr
如下:
version: "3.4"
services:
alpine:
image: alpine
command:
- "ping"
- "www.baidu.com"
networks:
- "demo-overlay"
deploy:
endpoint_mode: dnsrr
replicas: 2
restart_policy:
condition: on-failure
resources:
limits:
cpus: "0.1"
memory: 50M
depends_on:
- nginx
nginx:
image: nginx
networks:
- "demo-overlay"
ports:
- "8080:80"
networks:
demo-overlay:
external: true
删除原来的:
重新创建: