首先,在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:latest
docker cp tmpnginx:/etc/nginx/nginx.conf ~/microservices/nginx/nginx01
docker cp tmpnginx:/etc/nginx/nginx.conf ~/microservices/nginx/nginx02
docker cp tmpnginx:/etc/nginx/nginx.conf ~/microservices/nginx/nginx03
docker cp tmpnginx:/etc/nginx/conf.d ~/microservices/nginx/nginx01
docker cp tmpnginx:/etc/nginx/conf.d ~/microservices/nginx/nginx02
docker cp tmpnginx:/etc/nginx/conf.d ~/microservices/nginx/nginx03
docker 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:80
volumes: #對映的目錄或檔案,前者宿主機目錄,後者容器目錄
- ./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:latest
container_name: web02
volumes:
- ./nginx/nginx02/nginx.conf:/etc/nginx/nginx.conf
- ./nginx/nginx02/conf.d:/etc/nginx/conf.d
- ./nginx/html:/usr/share/nginx/html
web03:
image: nginx:latest
container_name: web03
volumes:
- ./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 ~/microservices
docker-compose up
提示以下內容即成功。
Recreating microservices_web01_1 ... done
Recreating microservices_web02_1 ... done
Recreating microservices_web03_1 ... done
Attaching 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/2019: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/2019: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/2019: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/2019: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的,這種方法叫輪詢法,下篇文章介紹幾種其他的負載演算法。