docker系列--在一台服务器上搭建docker swarm测试集群

1. 宿主机环境

ubuntu 20.04
docker 20.10.8

重装集群时先删除以下服务

# 删除所有使用 dind:ssh 镜像启动的容器
sudo docker rm -f $(docker ps -f "ancestor=dind:ssh" -aq)
# 删除 dind:ssh 镜像
sudo docker rmi -f dind:ssh
# 删除 docker-swarm 网络
sudo docker network rm docker-swarm

2. 构建swarm环境

在宿主机创建 docker-swarm.sh 文件

#!/bin/bash
set -e # 程序出错在出错位置退出

mkdir -p /app/docker/dockerfile

# 创建一个带有ssh服务的docker in docker镜像
tee /app/docker/dockerfile/dind <<-'EOOF'
FROM docker:dind
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \
        && apk update \
        && apk add --no-cache openssh tzdata \
        && cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
        && sed -i "s/#PermitRootLogin.*/PermitRootLogin yes/g" /etc/ssh/sshd_config \
        && ssh-keygen -t dsa -P "" -f /etc/ssh/ssh_host_dsa_key \
        && ssh-keygen -t rsa -P "" -f /etc/ssh/ssh_host_rsa_key \
        && ssh-keygen -t ecdsa -P "" -f /etc/ssh/ssh_host_ecdsa_key \
        && ssh-keygen -t ed25519 -P "" -f /etc/ssh/ssh_host_ed25519_key \
        && echo "root:admin" | chpasswd
RUN sed -i '2 a /usr/sbin/sshd -D &' /usr/local/bin/dockerd-entrypoint.sh
RUN sed -i '3 a echo ***** sshd is run *****' /usr/local/bin/dockerd-entrypoint.sh
EOOF
# --rm 删除中间镜像
docker build -f /app/docker/dockerfile/dind --rm -t dind:ssh .

# 创建一个网络, 我们在此局域网段中搭建docker集群
ip12="192.179"
docker network create --driver=bridge --subnet=${ip12}.0.1/16 docker-swarm

# ip3, ip4 存储ip地址后两段的值
ip3=0
ip4=1
# 用于记录第一个创建的机器的ip
manager1ip=""
# 创建的机器编号, 计划用几台机器搭建集群 end 值设为几即可
start=1
end=4
for i in $(seq $start $end); do
  # ip地址后两端递增添加
  ((ip4++))
  if [ "$ip4" -ge 255 ]; then
    ((ip3++))
    ip4=1
  fi
  # 启动含有docker服务的容器, 并将容器22端口使用宿主机2000+端口暴漏出去
  # --network docker-swarm 使用我们自定义的网路
  # --ip 给容器分配固定ip, 减少我们搭建集群时查询ip的麻烦
  # -e 设置环境变量
  # -v 挂在卷, 将容器中部分文件挂载在宿主机上
  # -p 端口映射
  docker run --privileged --name dind-"${i}" -d \
    --network docker-swarm --ip ${ip12}."${ip3}".${ip4} \
    --restart=always \
    -e DOCKER_TLS_CERTDIR=/certs \
    -v some-docker-certs-ca:/certs/ca \
    -v some-docker-certs-client:/certs/client \
    -p $((2000+i)):22 \
    dind:ssh
  # 记录第一台机器的ip用于初始化swarm集群
  if [ "$i" == 1 ]; then
    manager1ip="${ip12}.${ip3}.${ip4}"
  fi
done

# 睡眠5s, 用以保证容器内服务全部已启动
# 不睡眠可能会导致容器里的docker服务不可正常运行
sleep 5
# 用以限制 manager 节点的数量, 一般不低于3
((max_manager=start+3))
for i in $(seq $start $end); do
  if [ "$i" == $start ]; then
    # 使用第一个容器进行swarm初始化
    docker exec dind-"${i}" docker swarm init --advertise-addr ${manager1ip}
  elif [ "$i" -lt "$max_manager" ]; then
    # 前几台机器作为manager节点
    token=$(docker exec -it dind-${start} docker swarm join-token -q manager)
    docker exec dind-"${i}" docker swarm join --token "${token:0:85}" ${manager1ip}:2377
  else
    # 剩余的机器作为worker节点
    token=$(docker exec dind-${start} docker swarm join-token -q worker)
    docker exec dind-"${i}" docker swarm join --token "${token:0:85}" ${manager1ip}:2377
  fi
done

在宿主机root账户下执行下述代码

chmod +x ./docker-swarm.sh
# -x 打印shell文件里每一行执行的代码, 可用于调试
bash -x ./docker-swarm.sh

3. 测试

使用ssh工具连上我们上述创建的容器

root@宿主机ip:2001~200x

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值