搭建swarm群集,并实现docker stack 相关应用
实验目标:搭建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仓库
![]()
- 使用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
查看

- 修改网络标签并推送其他镜像
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 服务运行与跨主机访问
- 发布服务
[root@manager1 ~]# docker service create --name test01 --replicas 3 -p 80:80 192.168.8.20/library/nginx:v1
因为默认是ingress网络默认都映射端口

- 跨主机访问
[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

- 服务数据持久化+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 应用案例
- 部署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
更多推荐
所有评论(0)