嘗試用 docker 模擬負載均衡完整版(踩著石頭過河)

j475523225發表於2019-03-24

我的環境:Ubuntu 16.04.4、Docker version 18.06.1-ce、docker-compose version 1.18.0、git version 2.7.4
工作目錄統一在/wwwroot下

1、先建立一個用來做負載均衡nginx

進入/wwwroot建立nginx目錄
進入nginx目錄
docker pull nginx:alpine

docker run -it --name testnginx -p 80:80 -d nginx:alpine

把裡面的預設檔案copy出來nginx.conf
docker cp testnginx:/etc/nginx/nginx.conf nginx.conf

docker rm -f testnginx

重新執行一個容器

docker run -p 80:80 --name nginx -v $PWD/conf.d:/etc/nginx/conf.d -v $PWD/nginx.conf:/etc/nginx/nginx.conf -d nginx:alpine

進入nginx目錄下的conf.d目錄建立default.conf
server {
listen 80;
server_name localhost;
root /www;
index index.php index.html index.htm;
location / {

}
}
加入如上配置

進入 nginx目錄下的www目錄 新建index.html 加入"welcome to nginx!"

重啟nginx 容器 docker restart nginx

然後訪問你的地址

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

2、克隆一套nginx+php+mysql+redis環境(安裝環境請參考https://learnku.com/articles/24594

git clone https://github.com/MichealJl/dnmp.git

3、進入目錄dnmp(為了方便記憶將目錄名改為dnmp1)

mv env-example .env

編輯docker-compose.yml檔案 刪除掉php5.6和gogs

為了快速安裝,修改env檔案將php的一些擴充套件 :swoole和IMAGEMAGICK置為false

修改env檔案中nginx  對外暴露的埠為81 NGINX_HTTP_PORT=81

docker-compose up -d

進入 nginx的project目錄建立index.php輸出 phpinfo();

訪問你的81埠

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

4、再複製2份dnmp 作為節點

cp -r dnmp1 dnmp2

現在的情況是這樣

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

進入dnmp2和dnmp3修改env檔案  將nginx、php、redis和mysql對外的埠修改一下不要相同即可
我是在之前的埠基礎上挨個+1的
然後都執行docker-compose up -d

檢視現在容器的執行情況

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

然後分別訪問3個埠都會看到phpinfo

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

為了區分 分別修改project裡的index.php檔案

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

5、修改 /wwwroot/nginx/nginx.conf

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

再修改nginx目錄下conf.d/default.conf

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

然後訪問你的ip就會看到負載均衡的效果

6、加入laravel專案測試

1、分別進入三個節點對應的mysql容器
docker exec -it dnmp1_mysql_1 /bin/bash

docker exec -it dnmp2_mysql_1 /bin/bash

docker exec -it dnmp3_mysql_1 /bin/bash

登入mysql 建立測試資料 因為這裡安裝的是mysql8所以需要修改下root使用者的密碼認證方式

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

create database test;

use test;

CREATE TABLE `user` (

 `id` int(11) NOT NULL AUTO_INCREMENT,

 `name` varchar(255) NOT NULL DEFAULT '',

 PRIMARY KEY (`id`)

) ENGINE=MyISAM AUTO_INCREMENT=4 DEFAULT CHARSET=utf8;

INSERT INTO `user` VALUES ('1', 'zhangsan');

INSERT INTO `user` VALUES ('2', 'lisi');

INSERT INTO `user` VALUES ('3', 'wangermazi');

flush privileges;
2、 分別進入三個節點對應的php容器
docker exec -it dnmp1_php-fpm72_1 /bin/bash

docker exec -it dnmp2_php-fpm72_1 /bin/bash

docker exec -it dnmp3_php-fpm72_1 /bin/bash

進入容器後 進入/www目錄 然後安裝 laravel

3、分別修改三個節點對應的nginx目錄下的default.conf 指向laravel目錄
4、然後重啟三個節點的nginx
docker restart dnmp1_nginx_1

docker restart dnmp2_nginx_1

docker restart dnmp3_nginx_1
5、 在三個laravel專案中建立User控制器和模型

例:

docker exec dnmp1_php-fpm72_1 bash -c "cd /www/laravel/ && php artisan make:controller UserController"

docker exec dnmp1_php-fpm72_1 bash -c "cd /www/laravel/ && php artisan make:model Models/User"

後面兩個請自行修改容器名稱建立

6、 修改模型並在控制器中新增方法

模型中關聯表名

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

在api裡新增路由
嘗試用docker模擬負載均衡完整版(踩著石頭過河)

7、修改.env檔案中的DB引數

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

後邊兩個專案照樣複製就行

效果如下

嘗試用docker模擬負載均衡完整版(踩著石頭過河)

相關文章