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