mac下使用docker安装php7.4环境
本项目以 Laravel 框架为例,启动文件按照自己的项目而定
安装目录自定义,我本地的安装目录是 ysw 是我本机的名称,目录可以自己定
/Users/ysw/docker_data
1、在docker_data在创建目录
1.nginx
2.php
2、在docker_data下创建文件
1.docker-compose.yml
services:nginx:build:context: ./nginx # 确保 ./nginx 目录存在并包含 Dockerfilecontainer_name: nginx-containerports:- "80:80" #注意本地的apacha环境,是否启动,启动则停止,或者修改docker映射端口volumes:# 这是项目地址,按照自己的项目地址改正即可 :后面的是docker映射目录,记得改名称- /Users/ysw/current/demo1:/var/www/demo1# 配置第二个用例 demo2项目地址修改即可- /Users/ysw/current/demo2:/var/www/demo2# 这是nginx配置文件,按照我给的目录层级则不需要改动,反之自己修改- ./nginx/nginx.conf:/etc/nginx/conf.d/default.confdepends_on:- phpphp:build:context: ./php # 确保 ./php 目录存在并包含 Dockerfilecontainer_name: php-containervolumes:- /Users/ysw/current/demo1:/var/www/demo1# 配置第二个用例 demo2项目地址修改即可- /Users/ysw/current/demo2:/var/www/demo2 # 项目如果需要 ssh,则需要加这一段,反之去除- /Users/ysw/.ssh:/root/.ssh # 持久化 SSH 密钥,按需添加# docker搭建的redis需要这一段,如果不是则去除即可,这是网络设置,docker内通信用的redis:image: redis:latestcontainer_name: redis-containerports:- "6379:6379" # 映射 Redis 到主机
3、在docker_data下的php目录创建文件,基本全部复制即可,不需要改动
1.Dockerfile
# 使用 PHP 7.4 FPM 镜像
FROM php:7.4-fpm# 设置工作目录
WORKDIR /var/www/html# 更新包列表并替换为阿里云的 Debian 镜像源
RUN sed -i 's|http://deb.debian.org|http://mirrors.aliyun.com|g' /etc/apt/sources.list && \apt-get update && \apt-get install -y \git \libfreetype6-dev \libjpeg62-turbo-dev \libpng-dev \libzip-dev \unzip \&& apt-get clean# 配置 GD 扩展
RUN docker-php-ext-configure gd --with-freetype --with-jpeg# 安装 PHP 扩展,按需添加
RUN docker-php-ext-install -j$(nproc) gd bcmath zip pdo_mysql# 安装 Redis 扩展
RUN pecl install redis && docker-php-ext-enable redis# 安装 composer
RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer# 清理不必要的文件
RUN apt-get autoremove -y && \rm -rf /var/lib/apt/lists/*
4、在docker_data下的nginx目录创建文件,基本全部复制即可,不需要改动
1.Dockerfile
FROM nginx:latest
COPY nginx.conf /etc/nginx/conf.d/default.conf
2.nginx.conf
server {listen 80;# 配置好后,需要在本机的 vim /etc/hosts 文件最后加入 127.0.0.1 demo1.test.comserver_name demo1.test.com;# 这个目录就是上面指定的docker映射目录,不理解直接复制粘贴root /var/www/demo1/public; # 确保这个路径指向 Laravel 的 public 目录# 下面的不要动index index.php index.html index.htm;location / {try_files $uri $uri/ /index.php?$query_string; # 将请求路由到 index.php}location ~ \.php$ {include fastcgi_params;fastcgi_pass php:9000; # 确保 PHP 容器的端口fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
}# 配置第二个项目 demo
server {listen 80;# 配置好后,需要在本机的 vim /etc/hosts 文件最后加入 127.0.0.1 demo1.test.comserver_name demo2.test.com;root /var/www/demo2/public;# 下面的不要动index index.php index.html index.htm;location / {try_files $uri $uri/ /index.php?$query_string;}location ~ \.php$ {include fastcgi_params;fastcgi_pass php:9000;fastcgi_index index.php;fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;}
}
5、打开终端 进入 /Users/ysw/docker_data
输入 (注意顺序)
docker-compose down(这个是结束,重启先输入这个,没有启动过则没有任何输出),以下是正常的输出结果
[+] Running 4/4✔ Container nginx-container Removed 0.2s ✔ Container redis-container Removed 0.2s ✔ Container php-container Removed 0.2s ✔ Network docker_data_default Removed
docker-compose up -d --build(第一次启动先输入这个),启动打印较多,只是复制最终的输出结果
[+] Running 4/4✔ Network docker_data_default Created 0.1s ✔ Container redis-container Started 0.3s ✔ Container php-container Started 0.3s ✔ Container nginx-container Started
6、在 浏览器输入 http://admin.test.com/ 即可显示,表示环境配置正常,具体路由按照自己的项目定
7、注意事项
- 不能设置代理(翻墙),我本地翻墙后是访问不了的,你们自己测试即可
- git 可能存在 ssh校验,需要在本地生成 ssh-keygen -t ed25519 -C "<comment>"
- 并上传到git服务器,再上传到docker
- 进入到 本机的 ssh 目录 执行以下命令,不会的问去ai
- 上传到docker,ssh生成之后是有2个文件,名称是自己起的,记得修改
- docker cp ./ysw-20241025-6 php-container:/root/.ssh/id_rsa
- docker cp ./ysw-20241025-6.pub php-container:/root/.ssh/id_rsa.pub
- 本机的apacha一定要停止(注意开启是否自启,否则下次开启又启动不了了),会干扰docker的nginx 端口冲突无法启动(修改docker映射端口不受此影响)
- 本机的brew安装的 ngixn、php、apache等最好都卸载掉,统一使用docker
- openssl记得升级,不会的就使用brew安装新版
- Dockerfile是没有后缀的,注意系统的隐藏文件后缀,可在终端查看是否带后缀
- 配置好后,一定要在本机的 vim /etc/hosts 文件加入 127.0.0.1 demo1.test.com
- 注意,redis是加入到了docker网络,如果项目启动报redis链接错误,在项目内redis配置改为 REDIS_HOST=redis,原来是 REDIS_HOST=127.0.0.1(这是报错信息:Connection refused [tcp://127.0.0.1:6379])