mac下docker搭建nginx+php+mysql,并实现nginx负载均衡

一 环境

  • 系统:macOS Sonoma 14.3
  • 芯片:Apple M3 Pro
  • docker 版本:25.0.5

二 软件

  • OrbStack [推荐,一款轻量化的docker管理软件,还是docker的命令]
  • item2

三 步骤

  1. 拉取 nginx 镜像
docker pull nginx
  1. 新建一个 nginx 容器
docker run --name nginx5 -d -p 80:80 nginx 
  1. 确认 nginx 内部的目录 [第一次一定要确认下目录]
- 配置目录 /etc/nginx
- 文件目录 /usr/share/nginx
- 日志目录 /var/log/nginx 
  1. 将上面的需要挂载到本地的文件夹,先拷贝一份到本地
docker cp nginx5:/etc/nginx       /Users/zq/Desktop/03-work_record/2024/0412/docker/nginx
docker cp nginx5:/usr/share/nginx /Users/zq/Desktop/03-work_record/2024/0412/docker/www
docker cp nginx5:/var/log/nginx   /Users/zq/Desktop/03-work_record/2024/0412/docker/log
  1. 关闭nginx5 然后删除. 上面的步骤,是为了确认目录和挂载目录。
docker stop nginx5
docker rm nginx5
  1. 新建 php 容器并挂载到本地,注意php容器中的目录:“/var/www/html”. [注意:‘/var/www/html’ 这个目录,如果不确认,可以先建一个容器查看下,然后删除。]
docker pull php:7.4-fpm

docker run --name myphp -d -v /Users/zq/Desktop/03-work_record/2024/0412/docker/www/nginx/html:/var/www/html php:7.4-fpm
  1. 新建容器nginx5,并挂载上面文件夹 .[注意看具体位置,在目录下都多了一个nginx,挂载的时候,注意加上]
docker run 
    --name nginx10
    -p 80:80
    // 文件目录
    -v /Users/zq/Desktop/03-work_record/2024/0412/docker/www/nginx/html:/usr/share/nginx/html 
    // nginx配置目录
    -v /Users/zq/Desktop/03-work_record/2024/0412/docker/nginx/nginx:/etc/nginx 
    // 日志目录
    -v /Users/zq/Desktop/03-work_record/2024/0412/docker/log/nginx:/var/log/nginx 
    // 和php关联上
    --link myphp:php  
    -d nginx

# 用下面运行
docker run --name nginx10 -p 80:80 -v /Users/zq/Desktop/03-work_record/2024/0412/docker/www/nginx/html:/usr/share/nginx/html -v /Users/zq/Desktop/03-work_record/2024/0412/docker/nginx/nginx:/etc/nginx -v /Users/zq/Desktop/03-work_record/2024/0412/docker/log/nginx:/var/log/nginx --link myphp:php -d nginx

注意:–link myphp:php 和 myphp 容器关联上

  1. 修改nginx配置
vim /etc/nginx/conf.d/default.conf 

location ~ \.php$ {
#    root           html;
   fastcgi_pass   myphp:9000;
   fastcgi_index  index.php;
   fastcgi_param  SCRIPT_FILENAME  /var/www/html$fastcgi_script_name;
   include        fastcgi_params;
}

注意 :
1、fastcgi_pass 指定为 php 容器名字:端口
2、fastcgi_param 参数 SCRIPT_FILENAME 要设置为 php容器中的目录地址$fastcgi_script_name, 我这里php容器的代码地址是 /var/www/html, 也挂载到本地了, 和nginx挂载的位置是一个位置. 所以可以访问到. 这一步非常关键.

  1. 重启nginx容器
docker restart nginx5
  1. 安装mysql
docker run --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=root -d mysql

如果在容器中,想使用宿主机的mysql,可以在 数据库连接中,将 host 修改成 ‘host.docker.internal’ 即可。

// 数据库连接参数:

// $mysql_server = array('127.0.0.1', 'root','root', 'guahaobbwznkyy', 'gbk');
$mysql_server = array('host.docker.internal', 'root', 'root', 'guahaobbwznkyy', 'gbk');
  1. 安装redis
docker run --name redis -d redis:5.0

四 nginx负载均衡

  1. 按照上述步骤,新建3个 nginx 的容器,例如 nginx1,nginx2,nginx3。分别查看nginx1,nginx2,nginx3的ip地址。
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1  
# 192.168.228.2
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx2
# 192.168.228.3
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx3
# 192.168.228.4
  1. 本地添加测试域名,指向 nginx1的地址
sudo vim /etc/hosts

www.test.com 192.168.228.2
  1. 在 nginx1 的 /etc/nginx/conf.d 下,新建 负载均衡的文件 slb.conf
upstream test {
    server 192.168.228.2:81 weight=3 fail_timeout=3s max_fails=3;	    
    server 192.168.228.3:81 weight=3 fail_timeout=3s max_fails=3;
	server 192.168.228.4:81 weight=4 fail_timeout=3s max_fails=3;
}

server {
    listen  80;
    listen  443 ssl http2;
    server_name  www.test.com;

    if ($scheme != https) {
        rewrite ^(.*)$  https://$host$1 permanent;
    }

    ssl_certificate /etc/nginx/cert/nanfei/nanfei.chery.test.pem;
    ssl_certificate_key /etc/nginx/cert/nanfei/nanfei.chery.test-key.pem;
    ssl_protocols TLSv1.2;
    ssl_ciphers EECDH+CHACHA20:EECDH+CHACHA20-draft:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
    ssl_prefer_server_ciphers on;
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
    add_header Strict-Transport-Security "max-age=31536000";
    error_page 497  https://$host$request_uri;

    location / {
        proxy_pass http://test;
        
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_ssl_session_reuse off;
        proxy_ssl_server_name on;
        proxy_ssl_name $proxy_host;
        proxy_ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

        proxy_http_version 1.1;
        proxy_set_header Upgrade $http_upgrade;
        proxy_set_header Connection "Upgrade";
    }
}

如上,www.test.com 通过默认的80进来之后,会被接受,并打到 upstream test 中。然后代理到 3台服务器的 81端口上。所以,在3台电脑上,都需要加上一个 test.conf 文件,其中是监听81 端口。

  1. test.conf
server {
    listen       81;
    listen  [::]:81;
    server_name  www.test.com;
    #access_log  /var/log/nginx/host.access.log  main;

    location / {
        root   /usr/share/nginx/test;
        index index.php index.html index.htm default.php default.htm default.html;
    }

    #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效
    include /etc/nginx/rewrite/yinni/test.conf;
    #REWRITE-END

    #禁止访问的文件或目录
    location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md)
    {
        return 404;
    }
    
    #一键申请SSL证书验证目录相关设置
    location ~ \.well-known{
        allow all;
    }
    
    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
        error_log /dev/null;
        access_log /dev/null;
    }
    
    location ~ .*\.(js|css)?$
    {
        expires      12h;
        error_log /dev/null;
        access_log /dev/null; 
    }

    access_log /etc/nginx/log/test/test.log;
    error_log  /etc/nginx/log/test/test.error.log;
}


五 docker 常用的一些命令

// 新建网络
docker network create my-nginx-network

// 新建容器[相同网络]
docker run -d --name nginx1 -p 8081:80 --network=my-nginx-network --label my-label nginx
docker run -d --name nginx2 -p 8082:80 --network=my-nginx-network --label my-label nginx
docker run -d --name nginx3 -p 8083:80 --network=my-nginx-network --label my-label nginx

docker run -d --name myphp -p 9000:9000 --network=my-nginx-network php:7.4-fpm
docker run -d --name nginx4 -p 8084:80 --network=my-nginx-network --label my-label --link myphp:php nginx


// 拷贝配置[可选]
docker cp /Users/zq/Desktop/02-daywork/01-daily_work/nginx.conf nginx1:/etc/nginx/conf.d/nginx.conf
docker cp /Users/zq/Desktop/02-daywork/01-daily_work/nginx.conf nginx2:/etc/nginx/conf.d/nginx.conf

// 重启容器
docker restart nginx1
docker restart nginx2

// 查询ip
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx2
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx3
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值