天天看點

docker 搭建多容器LNMP平台遇到的坑

1. 采用什麼樣的鏡像很重要。必須是php:7.3-fpm,采用預設的latest鏡像是不行的,是以

$ docker pull php:7.3-fpm  #現在有了7.4-fpm

$ docker pull nginx

$ docker pull mariadb
           

2. 搭建獨立的lnmp網絡環境 

$ docker network create --driver bridge --subnet 172.168.1.0/24 --gateway 172.168.1.1 lnmp-net  #網絡名稱為lnmp-net
           

3.建立lnmp的根目錄,并建立應有的目錄體系

$ mkdir /lnmp  
           

 其他的目錄結構:

/lnmp/data/mariadb  #用于存儲mariadb資料庫的資料 

/lnmp/php                 #用于存放php的配置文檔 

 /lnmp/nginx/html    #用于存放網頁源碼,phpMyAdmin,wordpress 等

/lnmp/conf.d           #用于存放nginx的配置文檔,也就是 default.conf  

4.建構各個容器

建構mariadb資料庫容器:

$ docker run -itd  --name mysql -h mysql -p 3306:3306 --network=lnmp-net --ip 172.168.1.201 -v /lnmp/data/mariadb:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=123456789 mariadb
           

建構php-fpm容器:

$  docker run -itd --name myphp -h myphp -p 9000:9000 --network=lnmp-net --ip 172.168.1.202 -v /lnmp/nginx/html:/usr/share/nginx/html  --privileged=true  php:7.3-fpm
           

也可以使用php鏡像自身的路徑,也就是:

$ docker run -itd --name myphp -h myphp -p 9000:9000 --network=lnmp-net --ip 172.168.1.202 -v /lnmp/nginx/html:/var/www/html  --privileged=true  php:7.3-fpm
           

建構nginx:

$ docker run -itd --name mynginx -h mynginx -p 80:80  --network=lnmp-net --ip 172.168.1.203 -v /lnmp/nginx/html:/usr/share/nginx/html  --link myphp  nginx
           

5. 對nginx配置檔案進行編輯,主要是将default.conf 中的下列段落進行修改。增加解析類型,指定php檔案的目錄:

location / {
        root   /usr/share/nginx/html;
        index  index.html index.php index.htm;   #較預設内容增加了 index.php
        client_max_body_size 64m;    
   }



location ~ \.php$ {
    #    root           html;
        fastcgi_pass   172.168.1.202:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  /usr/share/nginx/html$fastcgi_script_name;   #這一行也比較關鍵,這個路徑是php容器内的路徑。如果上一步建構php容器使用的是 /var/www/html/ 則用就是 /var/www/html
        include        fastcgi_params;
        client_max_body_size 64m;
    }
           

若容器内沒有vi、vim等編輯工具,可以使用 docker cp 指令向容器内進行配置檔案的更新,例如本例中

# docker cp /home/nginx/conf.d/default.conf  mynginx:/etc/nginx/conf.d/default.conf     這是将編輯好的defaul.conf檔案進行覆寫

6.在/lnmp/nginx/html中建立info.php,并增加内容

$ vi info.php
           

内容:  <?php phpinfo();?>

7.重新開機相關容器

$ docker restart myphp mynginx 
           

8.用浏覽器檢視nginx歡迎頁和php資訊:

http://host-ip/index.html

http://host-ip/info.php

9. 下載下傳并解壓phpMyAdmin到 /lnmp/nginx/html中,通過浏覽器進入

http://host-ip/phpMyAdmin/

出現錯誤:

docker 搭建多容器LNMP平台遇到的坑

很明顯,要在myphp容器中添加mysqli擴充

10.為php容器添加擴充元件

$ docker exec -it myphp /bin/bash          #進入myphp容器

$ cd /usr/local/bin                                  #進入安裝指令群組件所在目錄

$ ./docker-php-ext-install pdo_mysql     #安裝擴充pdo_mysql

$ ./docker-php-ext-install mysqli             #安裝擴充 mysqli

$ exit                                                      #退出myphp容器

$ docker myphp restart                          #重新開機容器,使擴充元件生效
           

11.再次嘗試   http://host-ip/phpMyAdmin/

docker 搭建多容器LNMP平台遇到的坑

然後發現還是無法進入,出現 “  mysqli_real_connect(): (HY000/2002): No such file or directory   ”的 錯誤提示,還是需要修改

具體方法為:

将phpmyadmin\libraries\config.default.php,修改條目為: $cfg['Servers'][$i]['host']='172.168.1.201';

将phpmyadmin\config.sample.inc.php重命名為config.inc.php,修改條目為:  $cfg['Servers'][$i]['host'] = '172.168.1.201';

然後重新登入。 

這裡我們在建構mariadb資料庫時,指定了root賬戶的密碼為 123456789

登入成功後界面右側會顯示下圖資訊

docker 搭建多容器LNMP平台遇到的坑

好了,至此我們用3個獨立的docker 容器組成了LNMP開發環境。

其他

A。從容器内複制檔案和把外部編輯好的檔案複制進容器

1. 從容器複制到host

$ docker cp myphp:/usr/local/etc/php/php.ini-production /home/lnmp/php/php.ini
           

2.從host複制到容器

$ docker cp /home/lnmp/php/php.ini myphp:/usr/local/etc/php/php.ini
           

從php7開始,php.ini 沒有直接給出,而是給了 php.ini-production  php.ini-development 這兩個預置檔案,将其cp一份命名為php.ini 即可。

B。對配置内容進行部分更新,也就是upload

建立并編輯 uploads.ini檔案,内容為

file_uploads = On
memory_limit = 128M
upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 600
           

用上面的複制指令,将其添加到myphp 容器的   /usr/local/etc/php/conf.d/ 目錄下

$ docker cp  /home/lnmp/php/uploads.ini  myphp:/usr/local/etc/php/conf.d/  

重新開機 myphp容器

$ docker restart myphp

開機啟動參數的補加:

docker update --restart=always  容器名

docker update --restart=no         容器名