需求:
- 有一份现成的php代码,需要通过docker 部署到一个新的服务上
进程:
- 创建php 的Dockerfile
- 使用官方的php 并安装相应的依赖
FROM php:7.2-fpm RUN mkdir /usr/local/etc/php/pool.d/ && mkdir /www/ RUN apt-get update && \ apt-get install -y libpng-dev && \ apt-get install -y gdb && \ apt-get install -y git && \ apt-get install -y liblapack-dev RUN docker-php-ext-install pdo_mysql && \ docker-php-ext-install mysqli && \ docker-php-ext-install gd && \ docker-php-ext-install zip && \ docker-php-ext-install pcntl && \ docker-php-ext-install posix && \ docker-php-ext-install exif
- 使用官方的nginx
FROM nginx COPY nginx.conf /etc/nginx/nginx.conf COPY ./site-enabled /etc/nginx/conf.d RUN mkdir /var/www/ COPY ./trunk /var/www
- 创建对应的docker-compose.yml
version: "3" networks: backend: driver: bridge services: php-fpm-de: build: context: ./php container_name: php-fpm-de ports: - "9101:9000" networks: - backend nginx: build: ./nginx container_name: nginx ports: - "8010:8011" links: - "php-fpm-de" depends_on: - "php-fpm-de" networks: - backend
- 开始启动docker-compose up
- 前端部分顺利启动,但是和php 相关的部分php 那边报错 502 getaway
- 查看nginx 对应的conf 文件配置
server { root /var/www/public; index index.html index.php; listen 8011; client_max_body_size 8M; server_tokens off; location /admin { try_files $uri /admin/index.html$is_args$args; } #使用的是 laravel 框架 location ~ \.php$ { try_files $uri = 404; fastcgi_split_path_info ^(.+\.php)(/.+)$; include fastcgi_params; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param SCRIPT_NAME $fastcgi_script_name; fastcgi_index index.php; # fastcgi_pass php-fpm-de:9101; #error fastcgi_pass php-fpm-de:9000; #success } }
- 因为两个docker 用桥接链接了所以不应该使用 9101 而应该使用 9000
- 修改了之后,错误信息变成了 file not found
- 一脸懵逼然后再本地做调试,发现本地调试的时候会在php 那边也挂载一个代码文件,修改php 的 Dockerfile 加上一行
COPY ./trunk /var/www
- 重新build 并启动 docker-compose 在运行的时候报错了 nginx 报错 permission denied
- 反应过来 php 和 nginx 需要使用相同的用户,或者更高级的用户,修改nginx.conf 文件
user www-data;
- 修改php-fpm 的启动用户, 修改www.conf 文件下的user 和group
user = www-data group = www-data
- 重启docker-compose,在运行的时候php 报错,loadFile failed permission denied
- 看起来是www-data 没有权限读取拷贝进去的文件修改Dockerfile 拷贝代码逻辑
COPY --chown=www-data:www-data ./trunk /var/www
- 重启成功
结论:
- 如果使用的是docker-compose 对两个容器做桥接,需要直接使用内部的端口号,例如php 的9000,mysql 的3306,而不是使用映射到宿主机的端口号
- php 和nginx 分开部署但是理论上还是一个服务,需要使用相同的user 来做启动者
- php 和nginx 分开部署,在nginx 需要有一份代码,不然nginx 下的conf 文件读取会失败,在php 下也需要有一份代码,不然在nginx 使用php 做转发解析的时候会file not found
- 拷贝到php 下的代码,需要有足够宽的权限,有两种方式:1:、将文件的创建者修改为php一样的user。2、将文件的权限放大 chmod -R 777。不然会 permission denied