一. 安装docker
https://www.runoob.com/docker/centos-docker-install.htmlhttps://www.runoob.com/docker/centos-docker-install.html
二. 拉取镜像文件
1. dockerhub 拉取 nginx、consul、swoft 镜像
例:docker pull centos:centos6.8
2. 安装docker-compose 编写docker-compose文件使用 docker-compose up命令生成容器、指定端口、映射目录、自定义IP地址
# 编排php,redis,nginx容器
version: "3.6" # 确定docker-composer文件的版本
services: # 代表就是一组服务 - 简单来说一组容器
swoft_110: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: swoft/swoft # 指定容器的镜像文件
container_name: swoft_110 # 这是容器的名称
networks: ## 引入外部预先定义的网段
swoft_consul:
ipv4_address: 182.168.44.31 #设置ip地址
privileged: true # 执行特殊权限的命令
volumes: # 配置数据挂载
- /www/wwwroot/swoft:/var/www/swoft
working_dir: /var/www/swoft #工作目录
swoft_120: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: swoft/swoft # 指定容器的镜像文件
container_name: swoft_120 # 这是容器的名称
networks: ## 引入外部预先定义的网段
swoft_consul:
ipv4_address: 182.168.44.32 #设置ip地址
privileged: true # 执行特殊权限的命令
volumes: # 配置数据挂载
- /www/wwwroot/swoft:/var/www/swoft
working_dir: /var/www/swoft #工作目录
swoft_130: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: swoft/swoft # 指定容器的镜像文件
container_name: swoft_130 # 这是容器的名称
networks: ## 引入外部预先定义的网段
swoft_consul:
ipv4_address: 182.168.44.33 #设置ip地址
privileged: true # 执行特殊权限的命令
volumes: # 配置数据挂载
- /www/wwwroot/swoft:/var/www/swoft
working_dir: /var/www/swoft #工作目录
nginx: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: nginx1.17 # 指定容器的镜像文件
ports: # 配置容器与宿主机的端口
- "81:80"
networks: ## 引入外部预先定义的网段
swoft_consul:
ipv4_address: 182.168.44.20 #设置ip地址
container_name: nginx # 这是容器的名称
volumes: # 配置数据挂载
- /www/wwwroot/srm_swoft/nginx:/nginx
consul: # 这个表示服务的名称,课自定义; 注意不是容器名称
image: consul1.4 # 指定容器的镜像文件
ports: # 配置容器与宿主机的端口
- "8500:8500"
networks: ## 引入外部预先定义的网段
swoft_consul:
ipv4_address: 182.168.44.30 #设置ip地址
container_name: consul # 这是容器的名称
command: ./consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -node=ali -bind=182.168.44.30 -ui -client=0.0.0.0
# 设置网络模块
networks:
# 自定义网络
swoft_consul:
driver: bridge
ipam: #定义网段
config:
- subnet: "182.168.44.0/24"
三. 创建nginx swoft 的挂载目录,开放 nginx 81端口 consul8500端口 或者关闭防火墙
(swoft访问使用nginx转发不需要开放端口,docker容器实现通讯两种方式 1.端口映射(对外)2.自定义IP地址(对内))
1. 在srm_swoft目录下创建 nginx目录
2. www/wwwroot/srm_swoft/nginx 下创建 logs、conf 两个目录
3. logs 下创建error.log 空文件 conf目录下创建 nginx.conf 自定义配置 swoft_servers.conf 空文件(用作nginx upsync动态异步获取consul数据填写)
4. nginx.conf 文件配置
upsync_timeout 超时时间
upsync_interval 定时获取时间
worker_processes 4;
worker_cpu_affinity auto; #自动绑定cpu跟进程的关系
events {
worker_connections 100000; #设置单个worker连接数
}
error_log /nginx/logs/error.log;
http {
default_type application/octet-stream;
sendfile on;
upstream swoft_server {
server 182.168.44.31:18306 max_fails=2 fail_timeout=30s;
upsync 182.168.44.30:8500/v1/kv/upstreams/swoole_test upsync_timeout=6m upsync_interval=500ms upsync_type=consul strong_dependency=on;
upsync_dump_path /nginx/conf/swoft_servers.conf;
include /nginx/conf/swoft_servers.conf;
}
server {
listen 80;
server_name localhost;
root /www;
location / {
proxy_pass http://swoft_server;
}
}
}
四. swoft 创建一个方法 自定义注解(路由)(查看swoft官网 https://www.swoft.org/documents/v2/basic-components/annotation/)
因此我的路由地址为 http://192.168.44.3:81/test
五. 启动五个容器 nginx consul swoft110 swoft120 swoft130
使用docker-compose启动容器 命令:docker-compose start
六. consul添加服务数据
curl -X PUT -d '{"max_fails":2,"fail_timeout":10}' http://182.168.44.30:8500/v1/kv/upstreams/swoole_test/182.168.44.31:18306
curl -X PUT -d '{"max_fails":2,"fail_timeout":10}' http://182.168.44.30:8500/v1/kv/upstreams/swoole_test/182.168.44.32:18306
curl -X PUT -d '{"max_fails":2,"fail_timeout":10}' http://182.168.44.30:8500/v1/kv/upstreams/swoole_test/182.168.44.33:18306
curl命令在本机执行 所以 182.168.44.30 自定义IP地址可以访问到 访问结果返true 进入consul 界面查看 地址 192.168.44.3:8500
添加成功
七. 测试是否设置成功 浏览器访问地址 http://192.168.44.3:81/test
第一次访问
第二次访问
第三次访问
由此一个docker+nginx+consul+swoft动态负载均衡就完成了就搭建完成了
可以尝试在consul中新增服务器k/v 刷新浏览器 观察是否动态添加服务器成功
实操过程中可能遇见的问题
注册失败,【服务启动,无法访问,配置文件为空】
服务启动:docker log 容器id
无法访问:先检测所以服务是否正常启动,docker top
配置文件为空:consul获取存在问题 ,【检查consul服务信息,consul k值,文件名,目录】