使用docker搭建php環境

1、在官網安裝docker

   https://hub.docker.com/editions/community/docker-ce-desktop-windows

2、在官網測試你的安裝

https://docs.docker.com/docker-for-windows/#test-your-installation

3、安裝鏡像

   https://www.runoob.com/docker/docker-install-nginx.html

4、開始配置環境

①、創建容器

       docker run -itd -p 23:22 -p 80:8080 -p 8080:8080 --name dev --dns=10.237.8.8  -v  d:/www/vhost:/home/work/app/nginx/conf/vhosts -v d:/www:/home/work/data/www/  dev-registry.be.mi.com/online/centos63:php71 /usr/bin/supervisord

      參數說明:

  • -itd : 已守護進程方式運行
  • -p : 端品映射, 80( 開發機端口 ) : 8080 ( 容器端口)
  • -v : 目錄映射,d:/www(需要在本地手動創建),d:/www/vhost(開發機目錄,需要手動創建) : /home/work/app/nginx/conf/vhosts (容器目錄);
  • --dns : 默認DNS解析,一般指定爲10.237.8.8
  • --name : 容器名稱或標籤,可以在啓、停、刪除容器時、與其它容器進行連接時使用
  • dev-registry.be.mi.com/online/centos63:php53 鏡像名稱 php53代表TAG,不同TAG可以使用不同的鏡像
  • /usr/bin/supervisord 容器創建 後第一個運行的程序,小米網基礎環境鏡像的服務是使用supervisord進行管理的,需第一個啓動它

     報錯實例:

   (1)、docker: Error response from daemon: Mount denied:The source path "D:/www/vhost"  doesn't exist and is not known to Docker. See 'docker run --help'.

               錯誤原因:本地沒有改文件夾

               解決方案:在本地創建文件夾

  (2)、docker: Error response from daemon: driver failed programming external connectivity on endpoint dev (eb9e6278e4014ba9707d010c9fea4fe6c2250bc2cd0db3ad8ef10db9664cf032): Bind for 0.0.0.0:80 failed: port is already allocated.

              錯誤原因:80端口被佔用

              解決方案:使用docker ps –a 查看運行的進程,然後將進程停止以及移除,docker stop 2137af85261a(CONTAINER ID) ,docker rm 2137af85261a

②、將新建的dev項目以bash運行,並且通過容器進入ssh

       docker exec -it dev bash

       在此同時新開啓一個cmd命令框,執行以下兩個命令:docker stop dev    ,  docker start dev

③、切換到work用戶

        su – work

④、進去docker,熟悉文件內容。

       此時的位置在:/home/work

  • ls之後就可以看到以下文件:app  data  logs  opshell
  • cd  data/www  本地目錄與docker映射的目錄
  • cd app/  這裏有nginx php mysql等文件,如下:git  keycenter_agent  logcollect  mae  micron_agent  micron-agent  mysql  nginx  php  supervisor
  • cd app/supervisor/etc  這裏是一些配置文件,如下:demo.ini.template  dssagent.ini.bak  hostname.ini.bak  keycent_agent_c3.ini.bak  keycent_agent_lg.ini.bak  logcollect.ini  micron-agent.ini  nginx.ini  php-fpm.ini

⑤、開啓nginx

  • 進去nginx目錄,    cd /home/work/app/nginx
  • 在本地的d:/www/vhost目錄下創建xx.conf,例如:
  • server
    {
        listen       8080;
        server_name  zxy.XXXX.com;
        index index-test.php  index.html index.htm  default.html default.htm default.php;
        root  /home/work/data/www/XXXXXX/web;
        if ($request_uri ~ "^/api/(.+)$") {
            set $path $1;        rewrite .* /api.php?$path last;
        }
        if (!-e $request_filename){
            rewrite ^/(.+)$ /index-test.php?r=$1 last;
        }
        location ~ .*\.(php|php5)?$
        {
            fastcgi_pass  127.0.0.1:9000;
            fastcgi_index index-test.php;
            include /home/work/app/nginx/conf/fastcgi_params;
            gzip on;
            gzip_min_length 1k;
            gzip_disable "MSIE [1-6]\.";
            gzip_buffers 4 16k;
            set $path_info "";
            set $real_script_name $fastcgi_script_name;
            if ($fastcgi_script_name ~ "^(.+?\\.php)(/.+)$")
            {
                    set $real_script_name $1;
                   set $path_info $2;
            }
            fastcgi_param SCRIPT_REAL_SCRIPT_NAME $real_script_name;
            fastcgi_param SCRIPT_FILENAME /home/work/data/www/XXXXX/web$real_script_name;
            fastcgi_param SCRIPT_NAME $real_script_name;
            fastcgi_param PATH_INFO $path_info;
        }
    
        location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
        {
            expires      30d;
        }
    
        location ~ .*\.(js|css)?$
        {
            expires      12h;
        }
    }
    
    

     

  • vim app/nginx/conf/nginx.conf  把下面幾段註釋掉
  • 第一次運行nginx腳本, 

    -> cd ..

    ->./run.sh start

  • 重啓nginx,    ./run.sh reload  

⑥、開啓php

  • 進去php目錄,    cd  /home/work/app/php
  • 第一次運行php,    ./run.sh start    
  • 重啓php(在docker中php是自動啓動的),    ./run.sh reload  

⑦、配置C:\Windows\System32\drivers\etc\ hosts 

備註:./run.sh status 可以看到當前php、nginx的運行狀態

5、關閉cmd命令框之後,進入docker的方法;

  •     管理員方式運行cmd,執行  docker exec -it dev(容器名) bash  命令,之後重複4、(3)以及以下的步驟即可。

6、如果有一天配置新的項目之後,沒有任何錯誤,訪問域名顯示沒有訪問到(ERR_CONNECTION_REFUSED)。

  • 這種情況是在沒有請求到nginx時出現的,原因爲:nginx8080端口與docker映射失敗。
  • docker restart dev  重啓你的項目docker,報錯:

    Error response from daemon: driver failed programming external connectivity on endpoint dev (5b300a42d9908f51c034a891d2e569e28e035aab9c7794fcbcabf8417057814d): Error starting userland proxy: mkdir /port/tcp:0.0.0.0:8080:tcp:172.17.0.2:8080: input/output error
    Error: failed to start containers: dev

  • 解決方案:重啓你本地的docker服務。

 

7、在docker中ping 你的域名失敗,解決方案如下。

  • 切換到root權限
  • vim /etc/hosts  
  • 路由爲:172.17.0.1,在本地打印$_SERVER['REMOTE_ADDR']得來。
  • 172.17.0.1 zxy.express.com

8、如果想要什麼擴展,比如redis、memcache等,先去/home/work/app/php/etc/php.ini中看下是否已經存在。

        

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章