文章目录

  • 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配置dns docker swarm dnsrr_自定义

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配置dns docker swarm dnsrr_自定义_02

3、高可用配置

docker swarm配置dns docker swarm dnsrr_自定义_03

1、提升server01,server03为manger节点

docker node promote server01

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_04

docker node ls

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_05

docker node promote server03

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_06

docker node ls

docker swarm配置dns docker swarm dnsrr_docker_07


集群环境搭建完成。

2、创建服务(ingress网络)

1、创建

测试:

docker service create --name 起个名字 镜像名字  执行命令
docker service create --name test1 alpine  ping www.baidu.ccom

查看:

docker service ls

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_08


查看信息:

docker service inspect 服务名
docker service inspect test1

创建一个nginx服务:

docker service create --name 起个服务名字  镜像名字
docker service create --name nginx nginx

docker swarm配置dns docker swarm dnsrr_自定义_09


发现没有暴露端口,更新一下:

docker service update --publish-add 对外暴露的端口:nginx本身的端口  服务名字
docker service update --publish-add 8080:80 nginx

docker swarm配置dns docker swarm dnsrr_nginx_10

docker service ls

docker swarm配置dns docker swarm dnsrr_自定义_11

查看端口:

netstat -na | grep LISTEN

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_12

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

http://192.168.0.109:8080/

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_13

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

把nginx 扩容成3个节点。

docker service scale nginx=3

docker swarm配置dns docker swarm dnsrr_自定义_14

docker swarm配置dns docker swarm dnsrr_docker_15

有3个实例后,浏览器访问时,会vip lb的方式做一个负载均衡。

下面验证:

docker service ps nginx

docker swarm配置dns docker swarm dnsrr_docker_16


就在server02上,修改一下nginx页面。查看容器

docker ps

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_17

进入容器:

docker exec -it 9925c8ad297d bash
echo "hello,i am the test nginx" > /usr/share/nginx/html/index.html

docker swarm配置dns docker swarm dnsrr_docker_18


浏览器访问;有会话保存。

http://192.168.0.109:8080/

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_19

docker service  ps test1

test1运行在server02上,

docker swarm配置dns docker swarm dnsrr_nginx_20

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

docker swarm配置dns docker swarm dnsrr_nginx_21

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

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_22

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

首先,看下有哪些网络

docker swarm配置dns docker swarm dnsrr_nginx_23

创建一个网络。

docker network create -d  overlay demo-overlay

docker swarm配置dns docker swarm dnsrr_docker_24

docker network ls

docker swarm配置dns docker swarm dnsrr_nginx_25


把之前的服务停掉:

docker service rm nginx test1

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_26

docker service  ls

docker swarm配置dns docker swarm dnsrr_nginx_27

重新创建一个服务:

docker service create --network demo-overlay  --name nginx  -p 8080:80  nginx

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_28

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 swarm配置dns docker swarm dnsrr_docker_29

docker service ls

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_30

查看运行在哪里:

docker service ps  alpine

docker swarm配置dns docker swarm dnsrr_自定义_31


在server01上,到server01上执行命令:

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_32


进入到容器:

docker exec -it c4cb bash

可以ping通nginx:

docker swarm配置dns docker swarm dnsrr_自定义_33

wget nginx是可以的。

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_34

wget nginx:8080是不可以的。因为用名字去访问的时候,相当于容器间的访问,而不是通过主机绕一圈去访问。虽然也是通过vip,但还是有区别于主机的方式。

docker swarm配置dns docker swarm dnsrr_docker_35

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

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_36

查看运行在哪:在server01上。

docker service ps alpine

docker swarm配置dns docker swarm dnsrr_自定义_37

在server01上,运行:

docker ps

docker swarm配置dns docker swarm dnsrr_自定义_38

docker exec -it c4cbab44b42e sh

ping nginx-b

ping nginx,都能ping通。

docker swarm配置dns docker swarm dnsrr_自定义_39

停止所以服务。

docker service rm alpine nginx nginx-b

docker swarm配置dns docker swarm dnsrr_自定义_40

5、docker stack

docker swarm配置dns docker swarm dnsrr_nginx_41


创建一个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 swarm配置dns docker swarm dnsrr_docker swarm配置dns_42


查看:

docker stack ls

docker swarm配置dns docker swarm dnsrr_docker_43

查看:

docker stack services test

docker swarm配置dns docker swarm dnsrr_nginx_44

查看:也是一样的

docker service ls

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_45

访问server01,server03:都可以访问。

docker swarm配置dns docker swarm dnsrr_自定义_46

docker swarm配置dns docker swarm dnsrr_docker_47

查看:

docker service ps test_alpine

docker swarm配置dns docker swarm dnsrr_自定义_48

去server02上:

docker ps

docker swarm配置dns docker swarm dnsrr_nginx_49


进入到容器中,ping一下nginx,是可以访问的。走的vip的负载均衡的方式,而不是走的dnsrr的方式。

docker swarm配置dns docker swarm dnsrr_docker swarm配置dns_50

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 swarm配置dns docker swarm dnsrr_docker swarm配置dns_51


重新创建:

docker swarm配置dns docker swarm dnsrr_自定义_52