不得不说php 对云原生有点不够友好,之前用java .net打包docker镜像 一下就ok了,php倒腾了好久才算部署成功。
场景:使用阿里云ack(k8s) 部署采用thinkPHP框架的php项目,并执行php think worker:server -d 开启websocket 服务 ,可以使用一个docker 镜像就能部署好。
php 主要使用webdevops/php-nginx:7.4镜像 部署,这个镜像自带nginx和php环境
dokerfile 放在php项目根目录下,dokerfile 文件内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | FROM webdevops/php-nginx:7.4 EXPOSE 2346 ADD ./containerConfig/install-php-extensions /usr/local/bin/ RUN chmod +x /usr/local/bin/install-php-extensions && sync && \ install-php-extensions bz2 bcmath \ calendar \ dba \ exif \ gettext gd \ imagick \ mysqli mcrypt \ opcache \ pcntl pdo_mysql \ redis \ shmop sysvmsg sysvsem sysvshm sockets soap \ xdebug \ zip COPY . /app RUN /bin/bash -c 'cp /app/containerConfig/vhost.conf /opt/docker/etc/nginx/vhost.conf' RUN /bin/bash -c 'cp /app/containerConfig/10-init.sh /opt/docker/bin/service.d/supervisor.d//10-init.sh' |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | RUN chmod +x /usr/local/bin/install-php-extensions && sync && \ install-php-extensions bz2 bcmath \ calendar \ dba \ exif \ gettext gd \ imagick \ mysqli mcrypt \ opcache \ pcntl pdo_mysql \ redis \ shmop sysvmsg sysvsem sysvshm sockets soap \ xdebug \ zip |
3.COPY . /app 把php项目拷贝到容器的/app 文件夹下
4. RUN /bin/bash -c 'cp /app/containerConfig/vhost.conf /opt/docker/etc/nginx/vhost.conf' 运行容器时将容器内的/app/containerConfig/vhost.conf 覆盖到容器中/opt/docker/etc/nginx/vhost.conf 文件,这个vhost.conf主要是容器内的nginx 配置,后面会放vhost.conf的内容
5. RUN /bin/bash -c 'cp /app/containerConfig/10-init.sh /opt/docker/bin/service.d/supervisor.d//10-init.sh' 运行容器时将容器内的/app/containerConfig/10-init.sh 覆盖到容器中/opt/docker/bin/service.d/supervisor.d//10-init.sh 文件,这一步主要时配置容器启动后要执行的命令,单独启动websocket 服务时 需要用到的,启动websocket这个地方被坑了好久才找到解决方法。
打包镜像并启动容器
运行 docker build -t phpDemo:v1 . 命令打包成镜像,运行 docker run -p 8086:80 -p 2346:2346 --name phpDemo -d phpDemo:v1 命令启动容器 ,2346 端口即为websocket 对外暴露的端口
containerConfig 文件夹内容
containerConfig文件夹下包含 10-init.sh,install-php-extensions,vhost.conf 3个文件。
-----10-init.sh 文件内容: 主要作用是等容器启动成功后,执行一些自定义命令
1 2 | # placeholder cd /app && php think worker:server -d |
-----install-php-extensions 文件可以从 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions 处下载到本地保存到 containerConfig 文件夹下
-----vhost.conf 主要用来配置nginx, 可以自行配置,一下是我的配置 fastcgi_pass php 这个地方是写死的不能更改
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | server { listen 80 default_server; server_name _ *.vm docker; root "/app/public"; index index.php index.html; location / { if (!-e $request_filename){ rewrite ^(.*)$ /index.php?s=/$1 last; } } add_header Access-Control-Allow-Origin *; add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS,PUT,DELETE,HEAD'; add_header Access-Control-Allow-Headers 'DNT,X-Mx-ReqToken,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Authorization'; location ~ \.php(.*)$ { fastcgi_pass php; fastcgi_index index.php; fastcgi_split_path_info ^((?U).+\.php)(/?.+)$; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; fastcgi_param PATH_INFO $fastcgi_path_info; fastcgi_param PATH_TRANSLATED $document_root$fastcgi_path_info; include fastcgi_params; } } |