容器编排-集群部署Docker Swarm
程序员文章站
2024-03-01 14:42:58
...
Docker Swarm
- docker compose用来管理项目和服务,但是不能实现集群,docker的集群部署可以通过docker swarm实现
- swarm是docker内置的服务,所以不需要再次下载
- swarm分为工作节点和管理节点,都可以部署集群,但管理节点只能有一个leader
创建简单的swarm集群环境
- 启动三台服务器(虚拟机),例如ip如下
192.168.154.121 192.168.154.122 192.168.154.123
- 案例演示将192.168.154.121机器设置为管理节点,只在管理节点上执行以下指令
docker swarm init --advertise-addr 192.168.154.121
- 执行后会生成一下一个指令,随机生成的,将这个指令copy到另外两台机器
# 随机生成的 docker swarm join --token SWMTKN-1-65r8j68xwf5u1301nun5iowjzmqf6g1t24shsomo4tfqevemym-apgt591r9zuoogkxijxfzotf8 192.168.154.121:2377 # 在工作节点执行成功后会有以下提示 This node joined a swarm as a worker.
- 在管理节点上查看集群
docker node ls # 执行结果示例 48lip1pz3jfrznnuerwxixbdn chongba-docker Ready Active 19.03.13 m0085v45735bx6k7qc3eiisj8 * chongba-docker Ready Active Leader 19.03.13 roujeh9roofnheu9cg3ew6188 chongba-docker Ready Active 19.03.13
- 设置主机名部分
1.# 根据规划设置主机名,每台机器上执行 hostnamectl set-hostname <hostname> 2.# 在master添加hosts,每台机器上执行 cat >> /etc/hosts << EOF 192.168.200.150 node1 192.168.200.151 node2 192.168.200.152 node3 EOF 3.# 将桥接的IPv4流量传递到iptables的链,在每台机器上执行 cat > /etc/sysctl.d/k8s.conf << EOF net.bridge.bridge-nf-call-ip6tables = 1 net.bridge.bridge-nf-call-iptables = 1 EOF sysctl --system # 使其生效 4.# 时间同步,并验证 yum install ntpdate -y ntpdate time.windows.com date
- 再次查看服务列表会发现节点名称已经更改,这个时候已经部署了一个最小的swarm集群,包含一个管理节点和两个工作节点
docker node ls m0085v45735bx6k7qc3eiisj8 * note1 Ready Active Leader 19.03.13 roujeh9roofnheu9cg3ew6188 note2 Ready Active 19.03.13 48lip1pz3jfrznnuerwxixbdn note3 Ready Active 19.03.13
使用swarm部署单个服务
- 以nginx服务为例
- 创建服务
docker service create --replicas 3 -p 80:80 --name nginx nginx # --replicas 3:代表这个服务要创建3个副本,也就是启动3个容器来运行nginx
- 查看服务状态
docker service ls # 结果示例 ID NAME MODE REPLICAS IMAGE PORTS okosowyzk3xt nginx replicated 2/2 nginx:latest *:80->80/tcp
- 查看服务运行节点
docker service ps nginx # 结果示例 ID NAME IMAGE NODE DESIRED STATE CURRENT STATE ERROR PORTS pxjrh45eu29q nginx.1 nginx:latest note1 Running Running 8 minutes ago wmrg4o02ds08 nginx.2 nginx:latest note2 Running Running 7 minutes ago sgat4y6ag1oc nginx.3 nginx:latest note3 Running Running 7 seconds ago
- 其他指令
# 扩容 docker service scale nginx=5 # 减少容器运行数量 docker service scale nginx=2 # 终止某个服务 docker service rm nginx
使用swarm部署多个服务
- 部署计划
web:就是之前在docker-compose案例中的Java项目,依赖于redis进行计数。部署3个 redis:redis数据库,记录某个IP的访问次数,部署1个,在管理节点。 nginx:nginx服务,对3个web服务反向代理,部署1个,在管理节点
- 将之前docker-demo文件夹的三个文件分表copy到三台机器上的同一目录下/opt/docker-compose下
- 分别在三台机器上,构建镜像
docker build -t web:latest .
- 在管理节点的/opt/docker-compose/swarm目录下创建一个nginx.conf文件,并配置
worker_processes 1; events { worker_connections 1024; } http { default_type text/html; # 默认响应类型是html server { listen 80; location /hello { # 代理/hello路径,会代理到web服务的9090端口 proxy_pass http://web:9090; } location / { root /usr/share/nginx/html; } } }
- 在管理节点的swarm目录下再创建一个docker-compose.yml文件,工作节点不需更改
version: '3' services: web: image: "web:latest" networks: - overlay deploy: mode: replicated replicas: 3 redis: image: "redis:latest" networks: - overlay deploy: placement: constraints: [node.role == manager] nginx: image: "nginx:latest" networks: - overlay ports: - "80:80" volumes: - $PWD/nginx.conf:/etc/nginx/nginx.conf deploy: placement: constraints: [node.role == manager] networks: overlay: # 解读 service:服务,包括3个 web:java项目 image:指定web服务的镜像,就是刚刚自己打包的web:latest networks: 网络配置,这里是用了默认的overlay格式,是swarm模式的固定格式 deploy:swarm下的部署配置 mode:replicated代表在多个节点上做备份 replicas: 3 ,备份数量为3,即web服务会部署到swarm集群的随机3个节点 redis:redis数据库 image: “redis:latest”,指定用到的镜像是redis最新镜像 deploy:swarm下的部署配置 placement: 指定部署位置 constraints: [node.role == manager] 部署到manager节点 nginx:nginx服务 image: “nginx:latest”,指定镜像名称 networks: 指定网络,这里是用了默认的overlay格式,是swarm模式的固定格式 ports: 对外暴露的端口为80 volumes: 数据卷,指定当前目录下的nginx.conf文件挂载到容器中 deploy: 部署,指定部署位置到manager节点
- 在管理节点执行以下指令运行
docker stack deploy -c docker-compose.yml counter # 解读 docker stack:就是通过docker-compose部署的命令 -c docker-compose.yml:指定docker-compose文件位置 counter:给部署的集群起个名字
- 其他指令
# 查看集群信息 docker stack ls # 查看集群部署的容器情况 docker stack ps [集群名] # 查看指定服务的日志 docker service logs -f counter_web
- 页面访问测试:http://192.168.200.150/hello,通过查看日志检查负载均衡情况