尝试用 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 协议》,转载必须注明作者和本文链接
《L01 基础入门》
我们将带你从零开发一个项目并部署到线上,本课程教授 Web 开发中专业、实用的技能,如 Git 工作流、Laravel Mix 前端工作流等。
《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
讨论数量: 6
幽弥狂

结束的好突然

5年前 评论

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

5年前 评论

不用keepalive?

5年前 评论

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

5年前 评论
幽弥狂

好好学习

5年前 评论

@Chasers9527 正在踩坑中 :joy:

5年前 评论

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