尝试用 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.confdocker 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
然后访问你的地址
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 端口
4、再复制 2 份 dnmp 作为节点#
cp -r dnmp1 dnmp2
现在的情况是这样
进入 dnmp2 和 dnmp3 修改 env 文件 将 nginx、php、redis 和 mysql 对外的端口修改一下不要相同即可
我是在之前的端口基础上挨个 + 1 的
然后都执行 docker-compose up -d
查看现在容器的运行情况
然后分别访问 3 个端口都会看到 phpinfo
为了区分 分别修改 project 里的 index.php 文件
5、修改 /wwwroot/nginx/nginx.conf#
再修改 nginx 目录下 conf.d/default.conf
然后访问你的 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、 修改模型并在控制器中添加方法#
模型中关联表名
在 api 里添加路由
7、修改.env 文件中的 DB 参数#
后边两个项目照样复制就行
效果如下
本作品采用《CC 协议》,转载必须注明作者和本文链接
推荐文章: