1、准備工作
docker pull 下載好需要的鏡像文件:
[root@Docker-Test mysql]# docker pull nginx
[root@Docker-Test mysql]# docker pull php:7.1-fpm
[root@Docker-Test mysql]# docker pull mysql
[root@Docker-Test mysql]# docker pull phpmyadmin/phpmyadmin

2、啟動Nginx
docker run -d -p 8080:80 --name xj_nginx1 nginx
--name自定義容器名稱。-d設置容器在在后台一直運行。-p端口進行映射,將本地 8080 端口映射到容器內部的 80 端口。
在瀏覽器中打開 http://IP:8080/,效果如下:

3、啟動php-fpm+Nginx容器
為了方便管理,預先創建幾個相關的文件目錄
mkdir -p /opt/nginx/conf/conf.d && mkdir /opt/nginx/www && mkdir /opt/nginx/logs
解釋執行 php 需要 php-fpm,先啟動此容器:
docker run --name xj_php-fpm -d -v /opt/nginx/www:/var/www/html:ro php:7.1-fpm
- --name 自定義容器名字。-v 路徑映射
- /opt/nginx/www 是本地 php 文件的存儲目錄,/var/www/html 是xj_php-fpm容器內 php 文件的存儲目錄,ro 表示只讀。
/opt/nginx/conf.d路徑下創建default.conf文件
(亦可從已運行的nginx容器內拷貝后修改 docker cp xj_nginx1:/etc/nginx/conf.d/default.conf /opt/nginx/conf/conf.d/default.conf)
文件內容如下:
server {
listen 80;
server_name localhost;
location / {
root /usr/share/nginx/html;
index index.html index.htm index.php;
}
error_page 500 502 503 504 /50x.html;
location = /50x.html {
root /usr/share/nginx/html;
}
location ~ \.php$ {
fastcgi_pass php:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME /var/www/html/$fastcgi_script_name;
include fastcgi_params;
}
}
配置文件說明:
- php:9000: 表示 php-fpm 服務的 URL
- /var/www/html 是 容器xj_php-fpm 中 php 文件的存儲路徑,映射到宿主機的 /opt/nginx/www 目錄。
啟動支持php的ngnix容器:
docker run --name xj_nginx2 -p 8081:80 -d -v /opt/nginx/www:/usr/share/nginx/html:ro -v /opt/nginx/conf/conf.d:/etc/nginx/conf.d:ro --link xj_php-fpm:php nginx
- -p 8081:80 用於添加端口映射,把 xj_nginx2 中的 80 端口暴露出來。
- /opt/nginx/www 是本地 html 文件的存儲目錄,/usr/share/nginx/html 是xj_nginx2容器內 html 文件的存儲目錄。
- /opt/nginx/conf/conf.d 是本地 nginx 配置文件的存儲目錄,/etc/nginx/conf.d 是xj_nginx2容器內 nginx 配置文件的存儲目錄。
- --link xj_php-fpm:php 把容器xj_php-fpm 的網絡並入xj_nginx2,並通過修改xj_nginx2的 /etc/hosts,把域名php映射成 容器xj_php-fpm使用的IP地址,讓 nginx 通過 php:9000 訪問 php-fpm。

在/opt/nginx/www路徑下創建一個php測試頁面 index.php:
<?php echo phpinfo(); ?>
瀏覽器打開 http://IP:8081/index.php,驗證成功:

4、啟動 mysql容器
同樣,先在宿主機系統里創建幾個mysql相關的文件目錄
mkdir -p /opt/mysql/conf /opt/mysql/data /opt/mysql/logs
啟動mysql容器,並關聯到已運行的php-fpm容器:
docker run -p 3306:3306 --name xj_mysql -v /opt/mysql/conf:/etc/mysql/conf.d -v /opt/mysql/logs:/logs -v /opt/mysql/data:/mysql_data -e MYSQL_ROOT_PASSWORD='123qwe' -d --link xj_php-fpm:php mysql
- -p 3306:3306 用於添加端口映射,把 容器xj_mysql 中的 3306 端口暴露出來。
- /opt/mysql/conf 是本地mysql配置文件的存儲目錄,/etc/mysql/conf.d是xj_mysql容器內配置文件的存儲目錄,-v參數將兩者映射,同理映射對應的data和logs目錄
- -e MYSQL_ROOT_PASSWORD='123qwe' 使用-e使容器啟動時執行命令,此條命令設置了容器內mysql 的root用戶密碼
- --link xj_php-fpm:php 把容器xj_php-fpm 的網絡並入xj_mysql,並通過修改xj_mysql的 /etc/hosts,把域名php映射成 容器xj_php-fpm使用的IP地址,讓 mysql通過 php:9000 訪問 php-fpm。

5、啟動 phpmyadmin容器
docker run -p 8082:80 --name xj_phpmyadmin -d --link xj_mysql:db phpmyadmin/phpmyadmin
- -p 8082:80 用於添加端口映射,把 容器xj_phpmyadmin 中的 80 端口暴露出來。
- --link xj_mysql:db 把容器xj_mysql 的網絡並入xj_phpmyadmin,並通過修改xj_phpmyadmin的 /etc/hosts,把域名db映射成 容器xj_mysql使用的IP地址,讓 phpmyadmin 通過 db 訪問 mysql數據庫。

瀏覽器打開 http://IP:8082,終於看到了phpmyadmin的登錄界面。

輸入root用戶名密碼,出現報錯:

兩條錯誤信息,google了一下,大致是說root用戶的驗證方式caching_sha2_password不被phpmyadmin應用支持。
不過我修改mysql user表,把root驗證方式改成mysql_native_password后又開始報錯說root用戶無法遠程訪問,我再修改mysql user表放開root用戶的遠程訪問權限,都沒有解決這個頁面使用root用戶登錄的問題,折騰了幾天實在找不到問題原因,只好新建了一個admin用戶並授權才登錄成功,這個問題留着慢慢找原因和想解決辦法吧,哎!


后記:補充一點個人理解,docker run啟動時所加的一些參數,-d是為了保持后台運行,-p 做端口映射,其他大多並非必須,可以在容器啟動之后,再docker exec -it 進入容器做一些相關配置文件的修改,當然,可能需要你安裝一些容器內原本沒有集成的工具,比如我常用的net-tools,vim啥的,但是為了保持容器的純凈輕量,一般不建議這么做,自己做實驗學習的時候可以玩玩,--name --link -e -v這些,都可以在容器啟動后,去修改配置達到自己想要的效果。
這其中 -v需要特別說一句,按照 Docker 最佳實踐的要求,容器不應該向其存儲層內寫入任何數據,容器存儲層要保持無狀態化。所有的文件寫入操作,都應該使用 數據卷(Volume)、或者綁定宿主目錄,在這些位置的讀寫會跳過容器存儲層,直接對宿主(或網絡存儲)發生讀寫,其性能和穩定性更高。容器可以隨時拋棄,但是數據文件還是保留在宿主機,啟動新的容器也可繼續使用。
但是也需要格外注意映射目標容器的路徑不要寫錯,否則易出現按照示例啟動后,無法啟動容器或者啟動了也有其他異常,我在實驗過程中多處因為路徑書寫錯誤,導致意想不到的問題。
而且,官方下載的容器鏡像版本不同,容器內的路徑也會有稍許差異,最好的方式是先docker run一個沒什么參數的容器,進容器內實際查看確認一下之后再在啟動容器的時候加上路徑映射。
