首先,在home
目录创建microservices
目录,开启第一篇章。
cd ~ && mkdir microservices && cd microservices
创建nginx
目录,在目录下分别创建三个节点目录:nginx01
、nginx02
、nginx03
,目的是使nginx01
作为反向代理服务器,将请求均衡转发到nginx02
、nginx03
。
mkdir -p ./nginx/nginx01 ./nginx/nginx02 ./nginx/nginx03
展示效果如下所示。
nginx├── nginx01└── nginx02└── nginx03
将nginx镜像中的配置文件拷贝到各子目录中,以便做挂载,方法是创建一个临时容器,将配置文件拷贝至宿主机目录,再删除临时容器。
docker run --name tmpnginx -d nginx:latestdocker cp tmpnginx:/etc/nginx/nginx.conf ~/microservices/nginx/nginx01docker cp tmpnginx:/etc/nginx/nginx.conf ~/microservices/nginx/nginx02docker cp tmpnginx:/etc/nginx/nginx.conf ~/microservices/nginx/nginx03docker cp tmpnginx:/etc/nginx/conf.d ~/microservices/nginx/nginx01docker cp tmpnginx:/etc/nginx/conf.d ~/microservices/nginx/nginx02docker cp tmpnginx:/etc/nginx/conf.d ~/microservices/nginx/nginx03docker rm -f tmpnginx
此时nginx目录如下所示。
nginx├── nginx01│ ├── conf.d│ │ └── default.conf│ └── nginx.conf├── nginx02│ ├── conf.d│ │ └── default.conf│ └── nginx.conf└── nginx03├── conf.d│ └── default.conf└── nginx.conf
在根目录创建文件docker-compose.yml
,创建三个web服务,配置文件分别映射到容器中的对应文件。
version: '3'services:web01: #服务名称image: nginx:latest #镜像container_name: web01 #容器名称ports: #映射端口号,前者宿主机端口,后者容器端口- 8080:80volumes: #映射的目录或文件,前者宿主机目录,后者容器目录- ./nginx/nginx01/nginx.conf:/etc/nginx/nginx.conf #配置文件- ./nginx/nginx01/conf.d:/etc/nginx/conf.d #扩展配置目录- ./nginx/html:/usr/share/nginx/html #html存放目录web02:image: nginx:latestcontainer_name: web02volumes:- ./nginx/nginx02/nginx.conf:/etc/nginx/nginx.conf- ./nginx/nginx02/conf.d:/etc/nginx/conf.d- ./nginx/html:/usr/share/nginx/htmlweb03:image: nginx:latestcontainer_name: web03volumes:- ./nginx/nginx03/nginx.conf:/etc/nginx/nginx.conf- ./nginx/nginx03/conf.d:/etc/nginx/conf.d- ./nginx/html:/usr/share/nginx/html
打开nginx/nginx01/conf.d/default.conf
,在文章顶部加入upstream
配置,web02与web03是docker-compose.yml
中定义的容器名称container_name
。
upstream backend {server web02:80;server web03:80;}
在location /
中加入proxy_pass
以便将请求转发给backend
。
location / {root /usr/share/nginx/html;index index.html index.htm;proxy_pass http://backend; #追加该行}
配置完成后,执行以下命令将容器跑起来。
cd ~/microservicesdocker-compose up
提示以下内容即成功。
Recreating microservices_web01_1 ... doneRecreating microservices_web02_1 ... doneRecreating microservices_web03_1 ... doneAttaching to web02, web01, web03
此时microservices
目录结构如下,nginx目录下多出了一个html
文件夹,可以在html
目录下创建一个index.html
,输入Hello world!
,重新跑一下。
microservices├── docker-compose.yml└── nginx├── html│ └── index.html├── nginx01│ ├── conf.d│ │ └── default.conf│ └── nginx.conf├── nginx02│ ├── conf.d│ │ └── default.conf│ └── nginx.conf└── nginx03├── conf.d│ └── default.conf└── nginx.conf
现在做个测试,在浏览器中访问localhost:8080
,观察终端打印的日志。
web01 | 172.24.0.1 - - [26/Jun/:01:48:28 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"web02 | 172.24.0.2 - - [26/Jun/:01:48:28 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"
上述内容表示本次请求通过web01转发到了web02。
web01 | 172.24.0.1 - - [26/Jun/:04:42:36 +0000] "GET / HTTP/1.1" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"web03 | 172.24.0.2 - - [26/Jun/:04:42:36 +0000] "GET / HTTP/1.0" 304 0 "-" "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36" "-"
再次刷新,可以看到请求通过web01转发到了web03,到目前为止,基本的负载均衡部署就已经完成了,上述的web01是将请求均衡转发到web02、web03的,这种方法叫轮询法,下篇文章介绍几种其他的负载算法。