Swarm集群搭建( docker安装、docker-compose安装、portainer可视化安装、基本使用命令总结、项目集群部署案例)

倪鸿禧
2023-12-01

docker安装、docker-compose安装、Swarm集群搭建、portainer可视化安装、和项目部署案例

四台服务器,我这里选用四台虚拟机1核2G,系统centos7,ip:192.168.10.104、 192.168.10.105、 192.168.10.106、 192.168.10.107

一、环境准备

三台服务器都执行以下命令

1、关闭防火墙或者开放相应端口

#关闭防火墙
systemctl stop firewalld 
systemctl disable firewalld

# 开放2377端口
iptables -A INPUT -p tcp --dport 2377 -j ACCEPT
iptables -A INPUT -p tcp --dport 2375 -j ACCEPT
iptables -A INPUT -p tcp --dport 7946 -j ACCEPT
iptables -A INPUT -p tcp --dport 4789 -j ACCEPT
service iptables save 

firewall-cmd --zone=public --add-port=2377/tcp --permanent #TCP port 2377 用于集群管理节点间通信
firewall-cmd --zone=public --add-port=2375/tcp --permanent #docker服务开启TCP远程管理容器功能,portainer可以使用该端口管理主机上的容器
firewall-cmd --zone=public --add-port=7946/tcp --permanent #TCP 和 UDP 端口号 7946 用于节点间通信
firewall-cmd --zone=public --add-port=4789/tcp --permanent #UDP port 4789 for overlay network traffic,也就是说docker如果使用overlay网络,该端口会用于主机间网络数据包的传输
firewall-cmd --reload

2、关闭 selinux

方法一:

sed -i 's/enforcing/disabled/' /etc/selinux/config 
setenforce 0

方法二:

setenforce 0
vi /etc/sysconfig/selinux
#将里面的SELINUX配置为disabled    SELINUX=disabled

3、更改四台主机hostname

vim /etc/hostname
node1

vim /etc/hostname
node2

vim /etc/hostname
node3

vim /etc/hostname
node4

4、修改四台主机hosts

vim /etc/hosts

192.168.10.104 node1
192.168.10.105 node2
192.168.10.106 node3
192.168.10.107 node4

5、同步时间(可选)

date  #查看时间 (可选) 
yum install -y ntpdate 
ntpdate time.windows.com #同步最新时间

二、安装docker

三台服务器都执行以下命令

1、卸载系统之前的 docker

 sudo yum remove docker \
                  docker-client \
                  docker-client-latest \
                  docker-common \
                  docker-latest \
                  docker-latest-logrotate \
                  docker-logrotate \
                  docker-engine
#删除容器镜像:
sudo rm -rf /var/lib/docker

2、安装依赖包

sudo yum install -y yum-utils device-mapper-persistent-data lvm2 

3、设置阿里云镜像源

sudo yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo 

4、安装 docker,以及 docker-cli

sudo yum install -y docker-ce docker-ce-cli containerd.io

5、配置 docker 加速

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{
  "registry-mirrors": ["https://yuma69sd.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker

可以登录阿里云设置自己加速镜像,用我的也可以。

6、启动 docker & 设置 docker 开机自启

sudo systemctl start docker
sudo systemctl enable docker

7、查看版本

docker version

8、安装Docker可视化(单机选做)

# 创建外链
docker volume create portainer_data

# 创建Portainer容器
docker run -d -p 9000:9000 --name portainer --restart=always -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

在浏览器中输入http://ip:9000 可以看到效果

三、安装docker-compose

1、下载

#官方镜像文件
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

#国内镜像文件
curl -L https://get.daocloud.io/docker/compose/releases/download/1.29.2/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

如果网不好,可离线安装

(1) 访问https://github.com/docker/compose/releases,下载 docker-compose-Linux-x86_64,将docker-compose-Linux-x86_64重命名为docker-compose

(2) 将刚才下载的docker-compose文件上传到centos7的/usr/local/bin/目录下

(3) 重命名

mv /usr/local/bin/docker-compose-Linux-x86_64.64 /usr/local/bin/docker-compose

2、授权

sudo chmod +x /usr/local/bin/docker-compose

3、查看版本

docker-compose version

四、Swarm集群搭建

1、初始化管理节点(node1执行)

docker swarm init --advertise-addr ip地址

docker swarm init --advertise-addr 192.168.10.104

2、添加节点(其他节点执行)

docker swarm join 加入一个节点

#获取 创建其加入管理节点token命令
docker swarm join-token manager
#获取 创建其加入工作节点token命令
docker swarm join-token worker

#在其他三个节点执行(token从上面两个命令获取)
docker swarm join --token SWMTKN-1-1gtih3nv8gfch2fdtisx0xg3wbn8yt894r1yyzb6c7hxu4ot4a-0sxc5jaogtao45wa726af9474 192.168.10.104:2377

3、在管理节点查看node信息

docker node ls

4、步骤总结

  1. init初始化swarm
  2. 把需要加入集群的节点join到对应角色(管理节点、工作节点)

5、概念总结

  1. swarm

    集群的管理和编号。docker可以初始化一个swarm集群,其他节点可加入(管理、工作者)

  2. node

    就是一个docker节点。多个节点组成了一个网络集群。(管理、工作者)

  3. service

    服务,可以在管理节点或者工作节点来运行。当你创建服务的时,你需要指定容器镜像

  4. task

    容器内的命令,细节任务

6、raft一致性协议

二主二从: 假设一个节点挂了 , 其他节点是否可用呢?
raft协议:保证大多数节点存活才可以用 至少 > 1个节点存活 集群 > 3
实验:
如果将主docker停掉一台,那么另外一台主节点也不能使用。
如果将从docker节点离开集群,集群信息会看到此节点down的状态
work节点只是为了工作,manager节点才是为了管理集群
为了达到集群可用,若三个主节点,必须 > 1台存活的主节点 才可以正常使用。

7、安装Docker可视化(集群选做)

(1) 每台主机都开启TCP远程管理端口2375,方便管理(可不做)
vim /lib/systemd/system/docker.service
#ExecStart后添加【 -H tcp://0.0.0.0:2375 】
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375
#执行命令使它生效
systemctl daemon-reload
service docker restart
#查看端口是否已经监听成功
netstat -nlp |grep 2375
(2) 安装portainer

方法一:

# 创建Portainer容器 方法一
docker service create \
    --name portainer \
    --publish 9000:9000 \
    --replicas=1 \
    --constraint 'node.role == manager' \
    --mount type=volume,src=portainer_data,dst=/data \
    --mount type=bind,src=//var/run/docker.sock,dst=/var/run/docker.sock \
    portainer/portainer

# 下载protainer官方的yml文件  方法二
curl -L https://downloads.portainer.io/portainer-agent-stack.yml \
-o portainer-agent-stack.yml
# #通过yml文件进行部署
docker stack deploy -c portainer-agent-stack.yml portainer

方法二:

# 下载protainer官方的yml文件  方法二
curl -L https://downloads.portainer.io/portainer-agent-stack.yml \
-o portainer-agent-stack.yml
# #通过yml文件进行部署
docker stack deploy -c portainer-agent-stack.yml portainer

portainer-agent-stack.yml

version: '3.2'

services:
  agent:
    image: portainer/agent:2.11.1
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /var/lib/docker/volumes:/var/lib/docker/volumes
    networks:
      - agent_network
    deploy:
      mode: global
      placement:
        constraints: [node.platform.os == linux]

  portainer:
    image: portainer/portainer-ce:2.11.1
    command: -H tcp://tasks.agent:9001 --tlsskipverify
    ports:
      - "9443:9443"
      - "9000:9000"
      - "8000:8000"
    volumes:
      - portainer_data:/data
    networks:
      - agent_network
    deploy:
      mode: replicated
      replicas: 1
      placement:
        constraints: [node.role == manager]

networks:
  agent_network:
    driver: overlay
    attachable: true

volumes:
  portainer_data:

在浏览器中输入http://ip:9000 可以看到效果

五、基本命令总结

1、docker

示例:以nginx为例

# 查看可用版本
docker search nginx
# 获取nginx镜像
docker pull nginx
# 查看镜像
docker images
# 运行容器
docker run --name nginx-test -p 8080:80 -d nginx
    # --name nginx-test:容器名称。
    # -p 8080:80: 端口进行映射,将本地 8080 端口映射到容器内部的 80 端口。
    # -d nginx: 设置容器在在后台一直运行。
# 查看运行容器
docker ps
# 进入容器
docker exec -it nginx /bin/bash
# 容器:启动、重启、停止
docker start nginx-test
docker restart nginx-test
docker stop nginx-test
# 删除容器
docker rm nginx-test
# 清理掉所有处于终止状态的容器
docker container prune

编写Dockerfile文件定制镜像

构建镜像

docker build -t nginx:v3 .
    # 在 Dockerfile 文件的存放目录下,执行构建动作。
    # 以下示例,通过目录下的 Dockerfile 构建一个 nginx:v3(镜像名称:镜像标签)。
    # 注:最后的 . 代表本次执行的上下文路径,下一节会介绍。

2、docker-compose(单机)

docker-compose:官网地址 https://docs.docker.com/compose/

主要就是对多个容器进行编排管理 主要核心就是 编写dockerfile文件构建镜像 以及 编写docker-compose.yml文件

# 部署yaml文件
docker-compose up -d
# 打包重构镜像
docker-compose up --build

常用命令

docker-compose 命令 --help                     获得一个命令的帮助
docker-compose up -d nginx                     构建启动nignx容器
docker-compose exec nginx bash                 登录到nginx容器中
docker-compose down                            此命令将会停止 up 命令所启动的容器,并移除网络
docker-compose ps                              列出项目中目前的所有容器
docker-compose restart nginx                   重新启动nginx容器
docker-compose build nginx                     构建镜像 
docker-compose build --no-cache nginx          不带缓存的构建
docker-compose top                             查看各个服务容器内运行的进程 
docker-compose logs -f nginx                   查看nginx的实时日志
docker-compose images                          列出 Compose 文件包含的镜像
docker-compose config                          验证文件配置,当配置正确时,不输出任何内容,当文件配置错误,输出错误信息。 
docker-compose events --json nginx             以json的形式输出nginx的docker日志
docker-compose pause nginx                     暂停nignx容器
docker-compose unpause nginx                   恢复ningx容器
docker-compose rm nginx                        删除容器(删除前必须关闭容器,执行stop)
docker-compose stop nginx                      停止nignx容器
docker-compose start nginx                     启动nignx容器
docker-compose restart nginx                   重启项目中的nignx容器
docker-compose run --no-deps --rm php-fpm php -v   在php-fpm中不启动关联容器,并容器执行php -v 执行完成后删除容器

3、swarm(集群)

docker swarm: 官网地址 https://docs.docker.com/engine/swarm/

主要是对集群的管理和编排 能够轻松实现 动态扩展,动态更新服务 实现动态扩容。 swarm是在docker环境中的扩展。通过初始化swarm,让其他服务器docker节点加入到swarm集群,之后就可以管理节点node从而管理服务service。

# 用于列出 Swarm 中的所有节点及相关信息,包括哪些是管理节点、哪个是主管理节点。
docker node ls
# 管理器节点脱离 docker swarm集群:
docker swarm leave --force
# 工作节点脱离Docker Swarm集群
docker swarm leave

# 创建nginx服务
docker service create -p 8080:80 --name nginx-test nginx
# 查看服务部署情况
docker service ps nginx-test
# 动态扩缩容
docker service scale nginx-test=2
# 删除服务
docker service rm nginx-test
# 集群部署yaml文件
docker stack deploy docker-compose.yml

4、参考网站

KuangStudy:https://www.kuangstudy.com/bbs/1405398545049108481

菜鸟教程:https://www.runoob.com/docker/docker-tutorial.html

六、部署案例

1、部署wordpress博客

官网练习 compose一键部署wordpress
https://docs.docker.com/samples/wordpress/

编写docker-compose.yml

version: "3.9"
    
services:
  db:
    image: mysql:5.7
    volumes:
      - db_data:/var/lib/mysql
    restart: always
    environment:
      MYSQL_ROOT_PASSWORD: somewordpress
      MYSQL_DATABASE: wordpress
      MYSQL_USER: wordpress
      MYSQL_PASSWORD: wordpress
    
  wordpress:
    depends_on:
      - db
    image: wordpress:latest
    volumes:
      - wordpress_data:/var/www/html
    ports:
      - "627:80"
    restart: always
    environment:
      WORDPRESS_DB_HOST: db
      WORDPRESS_DB_USER: wordpress
      WORDPRESS_DB_PASSWORD: wordpress
      WORDPRESS_DB_NAME: wordpress
volumes:
  db_data: {}
  wordpress_data: {}

执行安装部署命令

# 单机部署
docker-compose up -d
# 集群部署
docker stack deploy docker-compose.yml my_wordpress

2、部署jar项目

(1)编写Dockerfile

FROM java:8
EXPOSE 88
VOLUME /tmp
ADD *.jar  /app.jar
RUN bash -c 'touch /app.jar'
ENTRYPOINT ["java","-jar","/app.jar"]

(2)编写docker-compose.yml

version: '2'
services:
  #1.gateway
  gateway:
    container_name: gateway
    build: ./gateway
    image: gateway
    mem_limit: 512M
    restart: always
    ports:
      - "88:88"
    # environment:
    #  - spring.profiles.active=dev

  #2.auth
  auth:
    container_name: auth
    build: ./auth
    image: auth
    mem_limit: 512M
    restart: always
    ports:
      - "8080:8080"
    #environment:
    #  - spring.profiles.active=dev

执行安装部署命令

# 单机部署
docker-compose up -d
# 集群部署
docker stack deploy docker-compose.yml my_wordpress
 类似资料: