Docker學習筆記05_部署nginx+php+mysql+phpmyadmin


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一個沒什么參數的容器,進容器內實際查看確認一下之后再在啟動容器的時候加上路徑映射。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM