今天朋友给我讲给客户部署PHP网站一直遇到问题让我帮助,我看了下系统环境,宝塔面板,好几个Nginx程序,还有Apache服务器,乱七八糟的什么都有,各个服务器占用80 443端口,PHP环境也有问题,然后我觉得也别折腾主机环境了,把程序该卸载卸载了,进程该结束结束了,使用Docker部署吧,把环境隔离开,然后就是整的这些东西。
1 2 3 4 5 6 7 8 9
|
nginx/ ----ssl/ --------域名证书 ----nginx.conf php/ ----web/ --------网站项目文件
|
构建PHP镜像
PHP的官方镜像少了很多拓展,所以自己构建一个包含程序所有依赖的镜像。
dockerfile 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
| FROM php:7.4-fpm
RUN apt install apt-transport-https ca-certificates && \ echo > /etc/apt/sources.list && \ echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm main contrib non-free non-free-firmware" >> /etc/apt/sources.list && \ echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-updates main contrib non-free non-free-firmware" >> /etc/apt/sources.list && \ echo "deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bookworm-backports main contrib non-free non-free-firmware" >> /etc/apt/sources.list && \ apt-get update && apt-get install -y \ libpng-dev \ libjpeg-dev \ libfreetype6-dev \ && docker-php-ext-configure gd --with-freetype --with-jpeg \ && docker-php-ext-install gd mysqli pdo pdo_mysql
|
使用 docker build 构建镜像
1
| docker build image:tag .
|
nginx 配置文件和域名证书
nginx.conf 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
| user nginx; worker_processes auto;
error_log /var/log/nginx/error.log; pid /run/nginx.pid;
events { worker_connections 1024; }
http { include /etc/nginx/mime.types; default_type application/octet-stream; server { listen 443 ssl;
root /var/www/html; index index.php index.html; ssl_certificate /etc/nginx/ssl/domain.com.pem; ssl_certificate_key /etc/nginx/ssl/domain.com.key; location / { try_files $uri $uri/ =404; } location ~ \.php$ { include fastcgi_params; fastcgi_pass app-php:9000; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; } } }
|
使用 docker-compose 管理应用程序容器编排
docker-compose.yml 文件
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
| version: "3.8" services: app-nginx: image: nginx:latest container_name: app-nginx ports: - "38888:443" - "38887:80" - "443:443" - "80:80" volumes: - /data/docker/nginx/ssl:/etc/nginx/ssl - /data/docker/nginx/nginx.conf:/etc/nginx/nginx.conf - /data/docker/php/web:/var/www/html depends_on: - app-php networks: - app-network
app-php: image: php-mysql:0.0.2 container_name: app-php volumes: - /data/docker/php/web:/var/www/html networks: - app-network
app-mysql: image: mysql:latest container_name: app-mysql environment: MYSQL_ROOT_PASSWORD: root@pass2025 MYSQL_DATABASE: my_database MYSQL_USER: user MYSQL_PASSWORD: user@pass2025 ports: - "3306:3306" volumes: - /data/docker/mysql-data:/var/lib/mysql networks: - app-network
volumes: mysql-data:
networks: app-network:
|
完事之后使用 docker-compose up -d 运行所有容器