尝试用 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 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《L04 微信小程序从零到发布》
从小程序个人账户申请开始,带你一步步进行开发一个微信小程序,直到提交微信控制台上线发布。
讨论数量: 6
幽弥狂

结束的好突然

5年前 评论

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

5年前 评论

不用keepalive?

5年前 评论

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

5年前 评论
幽弥狂

好好学习

5年前 评论

@Chasers9527 正在踩坑中 :joy:

5年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!