k8s docker 中部署think php 並搭建php websocket
不得不說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 檔案內容
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'
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'
打包映象並啟動容器
執行 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 檔案內容: 主要作用是等容器啟動成功後,執行一些自定義命令
# 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 這個地方是寫死的不能更改
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; } }