Docker部署nginx+php
2023年6月10日
为什么要部署在容器中
php由于版本、扩展等问题,环境部署麻烦,使用docker能屏蔽这些。 而nginx部署在docker中我也实在找不到太强烈的理由,主打一个来都来了。
主要内容
- 分别使用
docker启动nginx和php-fpm - 将nginx配置和
php.ini放在本地,避免删除容器后丢失。(php-fpm如果你有需求更改可以自行研究,一般我们本地不需要对php-fpm调优)
步骤
确认映射文件夹。 放置配置文件的
/opt/docker/nginx和/opt/docker/php两个文件夹,放置PHP代码的/opt/www/php目录。创建网络
- 创建名为
web的网络docker network create web - 查看IP段
docker network inspect web | grep Gateway,我的是172.18.0.1,172.18.0.2也被占用着, 从172.18.0.3开始给接下来的容器分配IP
- 创建名为
创建
php-fpm- 创建
Dockerfile,可根据自己需求更改扩展
FROM php:8.0-fpm COPY Dockerfile /root/Dockerfile ENV TZ=Asia/Shanghai RUN apt-get update # odbc 用来支持SQL Server的,这里是个人项目需要,现在都MySQL用不上的 #RUN apt-get install -y unixodbc-dev \ # && docker-php-source extract \ # && cd /usr/src/php/ext/odbc \ # && phpize \ # && sed -ri 's@^ *test +"\$PHP_.*" *= *"no" *&& *PHP_.*=yes *$@#&@g' configure \ # && ./configure --with-unixODBC=shared,/usr \ # && docker-php-ext-configure pdo_odbc --with-pdo-odbc=unixODBC,/usr \ # && docker-php-ext-install odbc pdo_odbc # gd RUN apt-get install -y libfreetype-dev libjpeg62-turbo-dev libpng-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install -j$(nproc) gd # pdo_dblib 这里注意是x86架构还是苹果芯片选择其一 RUN apt-get install -y freetds-dev \ && docker-php-ext-configure pdo_dblib --with-libdir=lib/x86_64-linux-gnu \ # && docker-php-ext-configure pdo_dblib --with-libdir=lib/aarch64-linux-gnu \ && docker-php-ext-install -j$(nproc) pdo_dblib # zip RUN apt-get install -y libzip-dev \ && docker-php-ext-install -j$(nproc) zip # redis RUN pecl install redis && docker-php-ext-enable redis # mysql RUN docker-php-ext-install -j$(nproc) pdo_mysql RUN docker-php-source delete && rm -r /var/lib/apt/lists/* EXPOSE 9000- 构建镜像
docker build -t php:8.0-fpm . - 编辑
/opt/docker/php/php.ini配置,你可以从别处找,也可以新建一个,只设置一下时区。
date.timezone = Asia/Shanghai- 运行
docker run --name php -d --network web --ip 172.18.0.3 -v /opt/docker/php/php.ini:/usr/local/etc/php/php.ini -v /opt/www/php:/opt/www/php -e TZ=Asia/Shanghai php:8.0-fpm(注意我是容器命名为了php) - 测试
docker exec -it php php -v
- 创建
启动
nginx- 下载并启动
docker run -itd -p 80:80 --name nginx nginx - 拷贝配置目录到本地
docker cp nginx:/etc/nginx /opt/docker - 删除容器
docker rm -f nginx - 重新启动
docker run --name nginx -itd -p 80:80 --network web --ip 172.18.0.4 -v /opt/docker/nginx:/etc/nginx -v /opt/www/php:/opt/www/php -e TZ=Asia/Shanghai nginx - 测试
docker exec -it nginx nginx -v
- 下载并启动
修改环境变量
alias php='docker exec -it php php' alias nginx='docker exec -it nginx nginx'修改
nginx配置- 直接修改
/opt/docker/nginx/conf.d/default.conf。 举例:
server { listen 80; server_name _; root /opt/www/php; index index.php; access_log /var/log/nginx/access.log; location / { try_files $uri $uri/ /index.php?$query_string; } location ~ \.php$ { fastcgi_pass 172.18.0.3:9000; # 这里要注意IP是php-fpm的IP fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }- 重加载
nginx -s reload即可
- 直接修改
测试,
vim /opt/www/php/index.php<?php echo date('Y-m-d H:i:s') . PHP_EOL; phpinfo();浏览器访问 127.0.0.1