尝试用 docker 模拟负载均衡完整版(踩着石头过河)

我的环境: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 环境(安装环境请参考博客:终于能用 Docker 搭建一套自己的环境了(dnmp)#

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模拟负载均衡完整版(踩着石头过河)

本作品采用《CC 协议》,转载必须注明作者和本文链接
《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 6
幽弥狂

结束的好突然

6年前 评论

@Chasers9527 因为后面大部分都是相同的操作。。

6年前 评论

不用 keepalive?

6年前 评论

@Jovem 额。还没到那程度 我这刚开始练习.... 先实现 后面在研究研究

6年前 评论
幽弥狂

好好学习

6年前 评论

@Chasers9527 正在踩坑中 :joy:

6年前 评论