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
  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

相关推荐

  1. macdockernginx+php+mysql,实现nginx负载均衡

    2024-04-13 06:02:02       38 阅读
  2. DockerNginx+keepalived高可用负载均衡服务器

    2024-04-13 06:02:02       40 阅读
  3. Nginx实现负载均衡

    2024-04-13 06:02:02       61 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-13 06:02:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-13 06:02:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-13 06:02:02       87 阅读
  4. Python语言-面向对象

    2024-04-13 06:02:02       96 阅读

热门阅读

  1. Qt中的事件与事件处理

    2024-04-13 06:02:02       60 阅读
  2. 浅析云算力平台的优势及关键点

    2024-04-13 06:02:02       40 阅读
  3. CSRF

    CSRF

    2024-04-13 06:02:02      72 阅读
  4. WPF —— GDI画板

    2024-04-13 06:02:02       45 阅读
  5. 15. 登录页案例

    2024-04-13 06:02:02       36 阅读
  6. comp21 Python web computer language

    2024-04-13 06:02:02       36 阅读
  7. SQLMap简单注入教程

    2024-04-13 06:02:02       46 阅读
  8. Devops初讲

    2024-04-13 06:02:02       46 阅读
  9. opencv+python(顶帽+黑帽)

    2024-04-13 06:02:02       90 阅读