1 )准备 docker-compose.yml的文件, 示例 demo 如下
version: "3"
services:
mysql_c:
image: mysql
environment:
MYSQL_ROOT_PASSWORD: 123456
restart: always
ports:
- 3306:3306
volumes:
- /root/mysql/conf.d:/etc/mysql/conf.d
- /root/mysql/data:/var/lib/mysql
goweb1:
image: gowebimg
restart: always
deploy:
replicas: 6 # 副本数量
resources: # 资源
limits: # 配置cpu
cpus: "0.3" # 设置该容器最多只能使用 30% 的 CPU
memory: 500M # 设置该容器最多只能使用 500M内存
restart_policy: # 定义容器重启策略, 用于代替 restart 参数
condition: on-failure # 只有当容器内部应用程序出现问题才会重启
depends_on:
- mysql_c
nginx:
image: nginx
restart: always
ports:
- 80:80
depends_on:
- goweb1
volumes:
- /root/nginx/conf.d/:/etc/nginx/conf.d
deploy:
replicas: 6 #副本数量
resources: #资源
limits: #配置cpu
cpus: "0.3" # 设置该容器最多只能使用 30% 的 CPU
memory: 500M # 设置该容器最多只能使用 500M内存
restart_policy: # 定义容器重启策略, 用于代替 restart 参数
condition: on-failure #只有当容器内部应用程序出现问题才会重启
docker stack deploy --compose-file docker-compose.yml swarmName
2 )搭建集群
docker swarm init --advertise-addr 192.168.1.10
初始化集群并创建管理节点(当前指定的ip为管理节点)
docker swarm join --token SWMTKN-1-52tr219htvsg1volky2tej7pj8bjs2j78q4b6wc9fnt72kkchd-29ohn4mgz191f6oznldvjiw47 192.168.1.10:2377
3 )部署和验证
docker stack deploy --compose-file docker-compose.yml goWebSwarm
开始部署服务
docker service ls
可查看当前运行起来的服务docker service ps goWebSwarm
查看当前某个服务4 )配置部署额外的一台Nginx服务器(非集群内)
upstream backend {
ip_hash;
server goweb1:8080; # 这里是 goweb1 容器服务的host别名
}
server {
listen 80;
server_name localhost; # 你的域名地址
location / {
# 设置主机头和客户端真实地址,以便服务器获取客户端真实IP
# 禁用缓存
proxy_buffering off;
# 反向代理的地址
proxy_pass http://backend;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
upstream backend {
ip_hash;
server 192.168.1.10 weight=1; # 集群内的服务 ip 这里有一台 nginx服务器
server 192.168.1.11 weight=1;
server 192.168.1.12 weight=1;
server 192.168.1.13 weight=1;
}
server {
listen 80;
server_name goweb.xxxx.com; # 你的域名地址 这里本机可以配置 host, 如果在服务器配置 域名解析
add_header backendCode $upstream_status;
add_header BackendIP "$upstream_addr;" always;
location / {
# 设置主机头和客户端真实地址,以便服务器获取客户端真实 IP
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
# nginx服务器与被代理服务连接超时时间,代理超时,请求一台超过1s就会转发到其他ip
proxy_connect_timeout 1s;
# 禁用缓存
proxy_buffering off;
# 反向代理的地址
proxy_pass http://backend;
}
#error_page 404 /404.html;
# redirect server error pages to the static page /50x.html
#
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root html;
}
}
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
BackendIP
的字段docker run -itd --name nginxweb -p 80:80 -v /root/nginx/conf.d:/etc/nginx/conf.d nginx
5 )整体架构如下
第一层 )nginx 服务器接收到请求后转发到集群中的各台主机上
第二层 )集群里面有各类服务
第三层 )mysql 或 mysql集群
以上三个层,是我们服务端一般的设计方案,当然上面没用到 mysql 集群
以上架构可支持 100W 的访问量 (使用mysql集群)
如果需要负载更多, 可把这套架构复制到多个城市地区