实验目标:搭建swarm群集,并实现docker stack 相关应用

实验拓扑图:

IP地址

主机

192.168.8.15

Manager1

192.168.8.16

Manager2

192.168.8.17

Manager3

192.168.8.18

Worker1

192.168.8.19

Worker2

192.168.8.20

Harbor

实验步骤:

  • docker swarm环境准备工作

1、设置主机名并写入hosts文件实现互认

配置:

Manager1:

[root@localhost ~]# hostnamectl set-hostname manager1

[root@localhost ~]# bash

[root@manager1 ~]#

Manager2:

[root@localhost ~]# hostnamectl set-hostname manager2

[root@localhost ~]# bash

[root@manager2 ~]#

Manager3:

[root@localhost ~]# hostnamectl set-hostname manager3

[root@localhost ~]# bash

[root@manager3 ~]#

Worker1:

[root@localhost ~]# hostnamectl set-hostname worker1

[root@localhost ~]# bash

[root@worker1 ~]#

Worker2:

[root@localhost ~]# hostnamectl set-hostname worker2

[root@localhost ~]# bash

[root@worker2 ~]#

Harbor:

[root@localhost ~]# hostnamectl set-hostname harbor

[root@localhost ~]# bash

[root@harbor ~]#

所有主机配置hosts文件

[root@所有主机 ~]# vim /etc/hosts

192.168.8.15 manager1

192.168.8.16 manager2

192.168.8.17 manager3

192.168.8.18 worker1

192.168.8.19 worker2

192.168.8.20 harbor

2、所有主机时间同步

yum -y install ntpdate

ntpdate time1.aliyun.com

确保时间都一致

所有主机配置计划任务时间同步

crontab -e

3、所有主机关闭防火墙以及沙盒selinux

systemctl stop firewalld;systemctl disable firewalld

sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/sysconfig/selinux

setenforce 0

4、开启路由转发

echo "net.ipv4.ip_forward = 1" >> /etc/sysctl.conf

sysctl -p

  • docker swarm 集群搭建

1、安装docker服务

wget -O /etc/yum.repos.d/docker-ce.repo  https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

或者有软件包可直接解压缩安装

使用yum安装docker-ce-20.10.20

yum -y install docker-ce-20.10.20

启动docker,可生成/etc/docker文件,如果没启动服务则不会创建

需启动服务再添加内容

systemctl start docker

在/etc/docker/daemon.json添加如下内容

sudo tee /etc/docker/daemon.json <<-'EOF'

{

  "registry-mirrors": [

    "https://2a6bf1988cb6428c877f723ec7530dbc.mirror.swr.myhuaweicloud.com",

    "https://docker.m.daocloud.io",

    "https://hub-mirror.c.163.com",

    "https://mirror.baidubce.com",

    "https://your_preferred_mirror",

    "https://dockerhub.icu",

    "https://docker.registry.cyou",

    "https://docker-cf.registry.cyou",

    "https://dockercf.jsdelivr.fyi",

    "https://docker.jsdelivr.fyi",

    "https://dockertest.jsdelivr.fyi",

    "https://mirror.aliyuncs.com",

    "https://dockerproxy.com",

    "https://mirror.baidubce.com",

    "https://docker.m.daocloud.io",

    "https://docker.nju.edu.cn",

    "https://docker.mirrors.sjtug.sjtu.edu.cn",

    "https://docker.mirrors.ustc.edu.cn",

    "https://mirror.iscas.ac.cn",

    "https://docker.rainbond.cc"

  ]

}

EOF

重启服务

systemctl daemon-reload

systemctl restart docker

systemctl enable docker

可以安装bash-completion以便使用tab键

yum -y install bash-completion

重启shell

bash

2、安装harbor仓库

       复制软件包到主机或者从官网下载

安装docker-compose

chmod +x docker-compose-linux-x86_64

mv docker-compose-linux-x86_64 /usr/bin/docker-compose

安装harbor仓库

tar xf harbor-offline-installer-v2.8.3.tgz -C /usr/local/

cd /usr/local/harbor/

cp -rp harbor.yml.tmpl harbor.yml

修改

vim harbor.yml

hostname: 192.168.8.20

注释

#https:

# port: 443

  # The path of cert and key files for nginx

 # certificate: /your/certificate/path

 # private_key: /your/private/key/path

将harbor镜像导入到本地仓库

docker load -i harbor.v2.8.3.tar.gz

生成容器

./prepare

./install.sh

验证容器是否都启动

在所有主机的daemon.json添加harbor仓库地址

重启daemon和docker

systemctl daemon-reload

systemctl restart docker

如果harbor容器关闭了需要使用docker-compose up -d给他启动起来

docker-compose up -d

使用docker login登录harbor

docker login -u admin -p Harbor12345 192.168.8.20

       上传常用的镜像到harbor仓库

  1. 使用dockerfile构建nginx镜像版本分别为v1和v2,并推送到harbor

[root@harbor ~]# docker load -i nginx1u20.tar; docker load -i mysql5u7.tar ;docker load -i tomcat9.tar ;docker load -i portainer.tar ;docker load -i visualizer.tar ;docker load -i wordpress.tar

[root@harbor ~]# mkdir nginxdir

[root@harbor ~]# cd nginxdir/

[root@harbor nginxdir]# echo "v1" > index.html

[root@harbor nginxdir]# vim Dockerfile

FROM nginx:1.20

MAINTAINER 'zhangsan@163.com'

ADD index.html /usr/share/nginx/html

RUN echo "daemon off;" >> /etc/nginx/nginx.conf

EXPOSE 80

CMD /usr/sbin/nginx

使用docker build构建镜像并推送到harbor

[root@harbor nginxdir]# vim Dockerfile

[root@harbor nginxdir]# docker build -t 192.168.8.20/library/nginx:v1 .

[root@harbor nginxdir]# echo "v2" > index.html

[root@harbor nginxdir]# docker build -t 192.168.8.20/library/nginx:v2 .

docker push 192.168.8.20/library/nginx:v1

docker push 192.168.8.20/library/nginx:v2

查看

  1. 修改网络标签并推送其他镜像

docker tag mysql:5.7 192.168.8.20/library/mysql:5.7

docker tag tomcat:9.0 192.168.8.20/library/tomcat:9.0

docker tag wordpress:latest 192.168.8.20/library/wordpress:latest

推送

docker push 192.168.8.20/library/mysql:5.7

docker push 192.168.8.20/library/tomcat:9.0

docker push 192.168.8.20/library/wordpress:latest

  • docker swarm初始化和群集管理
     

1、在manager1初始化群集

[root@manager1 ~]# docker swarm init --advertise-addr 192.168.8.15 --listen-addr 192.168.8.15:2377

将令牌复制到工作节点worker1和worker2

docker swarm join --token SWMTKN-1-073272lzawipebv265y8nibmradgw2b3zd5udrbivxffemtasc-5ccdcjxbkgv390o788lhuum75 192.168.8.15:2377

如果你想离开群集可以使用docker swarm leave进行离开,然后在管理节点进行删除使用docker node rm -f 节点名  或者 docker node rm --force 节点名

生成管理节点令牌

docker swarm join-token manager

将生成的令牌复制到manager2和manager3

docker swarm join --token SWMTKN-1-073272lzawipebv265y8nibmradgw2b3zd5udrbivxffemtasc-7u8tg2xiyl2qxrd382x4fryrv 192.168.8.15:2377

查看群集中的节点

docker node ls

如果管理节点想要退出群集需要先离开群集然后降级再删除

docker swarm leave

docker node demote 节点名

docker node rm -f 节点名

  • docker swarm 服务运行与跨主机访问
  1. 发布服务

[root@manager1 ~]# docker service create --name test01 --replicas 3 -p 80:80 192.168.8.20/library/nginx:v1

因为默认是ingress网络默认都映射端口

  1. 跨主机访问

[root@manager1 ~]# docker network create --driver overlay vlan1

创建网络时可指定网络地址:

--subnet

[root@manager1 ~]# docker service create --name test01 --network vlan1 --replicas 3 -p 80:80 192.168.8.20/library/nginx:v1

导入centos镜像或者busybox以便使用ping命令测试

[root@harbor ~]# docker load -i centos7.tar ;docker tag centos:7 192.168.8.20/library/centos:7;docker push 192.168.8.20/library/centos:7

[root@manager1 ~]# docker service create --name test02 --network vlan1 --replicas 2 192.168.8.20/library/centos:7 sleep 10000

测试

[root@manager1 ~]# docker exec -it test02.1.vz9mxzhe4tvah9i806wrj8rpo ping test01

  1. 服务数据持久化+nfs

首先需要所有主机安装nfs

yum -y install nfs-utils

在harbor部署nfs服务

[root@harbor ~]# mkdir /opt/data

[root@harbor ~]# vim /etc/exports

/opt/data *(rw,sync,no_root_squash)

[root@harbor ~]# systemctl restart nfs

[root@harbor ~]# systemctl enable nfs

所有主机查看

在群集中创建数据卷绑定nfs

docker volume create --driver local --opt type=nfs --opt o=addr=192.168.8.20,rw --opt device=:/opt/data nginx_volume

发布服务

发布之前需确保没有其他服务有冲突

[root@manager1 ~]# docker service rm test01 test02

[root@manager1 ~]# docker service create --name test01 --replicas 3 -p 80:80 \

> --mount 'type=volume,source=nginx_volume,target=/usr/share/nginx/html' \

> 192.168.8.20/library/nginx:v1

验证

在harbor的nfs目录创建文件

[root@harbor ~]# echo "nfs" > /opt/data/index.html

群集节点查看

  • docker stack 应用案例
    1. 部署wordpress案例

首先需要将tab键设置为2个空格

[root@manager1 ~]# vim .vimrc

set tabstop=2

[root@manager1 ~]# source .vimrc

[root@manager1 ~]# vim stack1.yml

version: '3'

services:

  db:

    image: 192.168.8.20/library/mysql:5.7

    environment:

      MYSQL_ROOT_PASSWORD: somewordpress

      MYSQL_DATABASE: wordpress

      MYSQL_USER: wordpress

      MYSQL_PASSWORD: wordpress

    deploy:

      replicas: 1

  wordpress:

    depends_on:

      - db

    image: 192.168.8.20/library/wordpress:latest

    ports:

      - 80:80

    environment:

      WORDPRESS_DB_HOST: db:3306

      WORDPRESS_DB_USER: wordpress

      WORDPRESS_DB_PASSWORD: wordpress

      WORDPRESS_DB_NAME: wordpress

    deploy:

      replicas: 1

      placement:

        constraints: [node.role == manager]

[root@manager1 ~]# docker stack deploy -c stack1.yml stack1

可以加--detach=false显示过程,我的版本有点低所以没有默认--detach=false,后面的版本默认就带有--detach=false不许自己定义

访问测试

2、部署nginx与web管理服务案例

安装之前需要将portainer和visualizer镜像上传到harbor以便群集拉取镜像

[root@harbor ~]# docker load -i portainer.tar ; docker load -i visualizer.tar

[root@harbor ~]# docker tag dockersamples/visualizer 192.168.8.20/library/visualizer:latest

[root@harbor ~]# docker tag portainer/portainer 192.168.8.20/library/portainer:latest

[root@harbor ~]# docker push 192.168.8.20/library/visualizer:latest ;docker push 192.168.8.20/library/portainer:latest

[root@manager1 ~]# vim stack2.yml

version: '3'

services:

  nginx:

    image: 192.168.8.20/library/nginx:v1

    ports:

      - 80:80

    deploy:

      mode: replicated

      replicas: 3

  visualizer:

    image: 192.168.8.20/library/visualizer:latest

    ports:

      - '9001:8080'

    volumes:

      - "/var/run/docker.sock:/var/run/docker.sock"

    deploy:

      replicas: 1

      placement:

        constraints: [node.role == manager]

  portainer:

    image: 192.168.8.20/library/portainer:latest

    ports:

      - '9000:9000'

    volumes:

      - "/var/run/docker.sock:/var/run/docker.sock"

    deploy:

      replicas: 1

      placement:

        constraints: [node.role == manager]

[root@manager1 ~]# docker stack deploy -c stack2.yml stack2 --detach=false

访问测试

常见的错误

启动docker,可生成/etc/docker文件,如果没启动服务则不会创建

解决方法

需启动服务再添加内容

systemctl start docker

出现的错误

如果harbor容器关闭了需要使用docker-compose up -d给他启动起来

解决方法

cd /usr/local/harbor

docker-compose up -d

更多推荐