docker swarm搭建集群环境之dnsrr,docker stack,swarm

文章目录

  • 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

docker swarm搭建集群环境之dnsrr,docker stack,swarm_第1张图片

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

docker swarm搭建集群环境之dnsrr,docker stack,swarm_第2张图片

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

docker swarm搭建集群环境之dnsrr,docker stack,swarm_第3张图片

访问server02的ip,测试nginx是否能访问。

http://192.168.0.109:8080/

docker swarm搭建集群环境之dnsrr,docker stack,swarm_第4张图片

访问server01,server03也都可以。说明ingress生效了,在每个节点都暴露了8080,通过vip访问到了提供nginx服务的容器。

把nginx 扩容成3个节点。

docker service scale nginx=3

docker swarm搭建集群环境之dnsrr,docker stack,swarm_第5张图片

在这里插入图片描述

有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 swarm搭建集群环境之dnsrr,docker stack,swarm_第6张图片

docker service  ps test1

test1运行在server02上,
在这里插入图片描述

在server02,进入到test1容器,在test1里,ping nginx没有找到,说明不能通过名字找到nginx服务。

docker swarm搭建集群环境之dnsrr,docker stack,swarm_第7张图片

通过ingress的routing mesh的服务发现找到nginx。

在这里插入图片描述

3、创建服务(自定义网络)

首先,看下有哪些网络
docker swarm搭建集群环境之dnsrr,docker stack,swarm_第8张图片

创建一个网络。

docker network create -d  overlay demo-overlay

在这里插入图片描述

docker network ls

docker swarm搭建集群环境之dnsrr,docker stack,swarm_第9张图片
把之前的服务停掉:

 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:
docker swarm搭建集群环境之dnsrr,docker stack,swarm_第10张图片

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 swarm搭建集群环境之dnsrr,docker stack,swarm_第11张图片

停止所以服务。

docker service rm alpine nginx nginx-b

在这里插入图片描述

5、docker stack

docker swarm搭建集群环境之dnsrr,docker stack,swarm_第12张图片
创建一个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 swarm搭建集群环境之dnsrr,docker stack,swarm_第13张图片

docker swarm搭建集群环境之dnsrr,docker stack,swarm_第14张图片

查看:

docker service ps test_alpine

在这里插入图片描述

去server02上:

docker ps

在这里插入图片描述
进入到容器中,ping一下nginx,是可以访问的。走的vip的负载均衡的方式,而不是走的dnsrr的方式。
docker swarm搭建集群环境之dnsrr,docker stack,swarm_第15张图片

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

删除原来的:
在这里插入图片描述
重新创建:
在这里插入图片描述

你可能感兴趣的:(docker)