1. 程式人生 > 其它 >k8s docker 中部署think php 並搭建php websocket

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'
  命令註解 1.  ADD  ./containerConfig/install-php-extensions /usr/local/bin/   是把根目錄下的containerConfig(自己新增的資料夾放一些容器配置檔案) 資料夾下的install-php-extensions(從 https://github.com/mlocati/docker-php-extension-installer/releases/latest/download/install-php-extensions 下載到本地的) 檔案新增到容器中的/usr/local/bin/ 目錄下   2. 以下的命令是新增php用到的擴充套件
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 檔案內容: 主要作用是等容器啟動成功後,執行一些自定義命令

# 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;
        }
}