20190415 前一次實戰 docker PHP 失敗教訓:
- 直接 pull 的 image ,只包含一些基本的 php 擴展
- 每一個實際的 php 項目,可能會有一些新的 php 擴展需求
- 雖然可以進入到容器再去安裝擴展,但是,實踐中經常會刪除容器再來,然後,剛纔安裝的擴展就都沒有了,還要在安裝一次!
- 將需要的擴展預先寫入 Dockerfile,直接生成所需的鏡像,就省事多了!
- 想使用Docker,Dockerfile是必須學會的!
直接找了一個 php:5.6.37-fpm-alpine3.7 開始,結果悲劇了!折騰了一大圈!linux 瞭解不夠!按照ubunt 和 centos 命令去操作,抓瞎了!
宿主機環境
visualbox 虛擬機
CentOS 7.6
ip: 192.168.1.187
本機已安裝
nginx : nginx version: nginx/1.12.2
php : PHP 7.2.16 (cli) (built: Mar 10 2019 21:22:49) ( NTS )
本次學習目的
- 生成一個 Docker php 5.6,並配置許多 php 擴展
** 實際不一定需要這麼多,根據項目需要進行刪減 - 正確創建、運行一個 Dockerfile
** 原型已經忘記了是從哪裏抄寫過來的,反正就每一條命令逐個測試 - 看到那些高大上的 Dockerfile,有一種高山仰止的感覺,目前我只能在山腳下爬行!
1、背景知識
Alpine 操作系統是一個面向安全的輕型 Linux 發行版
alpine linux官網
https://www.alpinelinux.org/
簡介
https://blog.csdn.net/bbwangj/article/details/81088231
2、折騰 Dockerfile
-
創建 Dockerfile
在自己的 dockerfile 目錄下,新建一個 Alpine
mkdir Alpine
cd Alpine
touch Dockerfile
vim Dockerfile
以下內容:FROM php:5.6.37-fpm-alpine3.7 RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories \ && apk update\ && apk add --no-cache libmcrypt-dev freetype-dev libjpeg-turbo-dev \ git \ # libfreetype6-dev \ # libjpeg62-turbo-dev \ libpng-dev \ && docker-php-ext-install mcrypt mysqli pdo pdo_mysql mbstring bcmath zip opcache\ && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ --with-png-dir=/usr/include/ \ && docker-php-ext-install -j$(nproc) gd
-
生成鏡像
docker build -t myphp5606:v1 .最終成功的結果應該是這樣的
…
OK: 34 MiB in 42 packages
Removing intermediate container d09f8e2e89d8
—> fd888a483d00
Successfully built fd888a483d00
Successfully tagged myphp5606:v1
3、運行並測試
- 查看以上生成的鏡像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
myphp5606 v1 fd888a483d00 About an hour ago 77.4MB
...
-
生成一個 php 容器
** 因爲學習過程中鏡像和容器都已經比較多,先找個能用的容器名字和映射端口
ss -tlnp |grep 9002
確認沒有佔用!sudo docker run -p 9002:9000 --name myphp5606 -v /usr/share/nginx/html:/usr/share/nginx/html -d myphp5606:v1
-
進入容器查看
docker exec -it myphp5606 shphp -v
返回結果:
PHP 5.6.37 (cli) (built: Sep 12 2018 04:00:31)
Copyright © 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright © 1998-2016 Zend Technologies
with Zend OPcache v7.0.6-dev, Copyright © 1999-2016, by Zend Technologiesphp -m
返回結果:
[PHP Modules]
bcmath
Core
ctype
curl
…php -m |grep gd
返回結果:
gd -
打開 nginx 網站測試
修改 php 配置
9000 端口是本機的 php ,版本是 7.2
9002 端口是剛纔安裝的 docker PHP,版本是 5.6
vim nginx.conf
# fastcgi_pass 127.0.0.1:9000;
fastcgi_pass 127.0.0.1:9002;
curl 127.0.0.1/index.php
http://192.168.1.187/index.php
後記:
- build 過程中總是會看到一些 紅色 錯誤 ,但是最終發現還是正確 build 了
- Dockfile 應該怎麼調試?
在啓動容器之後, exec 進入容器的shell,將 Dockfile 裏的腳本中值得懷疑的命令 cp 出來,單獨執行!
就可以找出來時那一條執行 build 的時候錯誤了! - 我主要是懷疑那些 php 擴展沒有安裝上
同樣進入容器 shell , php -m |grep XXX 確認!