標籤: WordPress

透過Docker安裝mysql + phpmyadmin + nginx + php7 + wordpress

透過Docker安裝mysql + phpmyadmin + nginx + php7 + wordpress

最近開始熟悉使用Docker建置環境,索性希望透過一個平台可以記錄自己曾經待過的坑。原本是存在Evernote,但我希望一半程度可以透過公開平台來展現自己的經歷,這是一部分私心,但記錄下來總是對於自己曾經參與過的一個重新組織與整理的機會。

話不多說…立刻來指令安裝,這次的虛擬環境:從Azure上租了一個新台幣$800元左右/月的小小vm,只有單核,0.75G,但只用ssh,沒有什麼影像處理、大量運算的需求,先硬著頭皮用下去了吧,至於Linux Ubuntu Server版本,好像是16版的,一開始若沒安裝Docker的,可以透過以下指令安裝Linux上的Docker

sudo apt-get install docker.io

這次安裝過程中需要3個Containner,一個放db,二個放web server

安裝Mariadb

MariaDB是Mysql的Opensoure分支,最大的好處就是免費授權。不過mysql是否會遇到什麼授權問題其實我也不是太清楚,日後有機會再來研究。
有許多官網公司出的Docker/Images其實都很方便,wiki都建的好好的,單一無腦啟用或是微調設定上,資訊已經很足夠用了。

sudo docker pull mariadb:latest

sudo docker run --name mariadb \
-p 3306:3306 \
-v /mnt/mariadb/data:/var/lib/mysql \
-v /mnt/mariadb/config:/etc/mysql/conf.d \
 -e MYSQL_ROOT_PASSWORD=123456 \
  -d mariadb

-p代表port的對外開放。通常用:隔開,前者是使用端的port,後者是容器內port,因此假如你起了一個80的Docker Containner,但你希望綁到你對外主機domain 8080 port的話,就設定成-p 8080:80, 也可以給一樣的

-v代表volumns,代表要從外部掛載資料卷,外部資料卷會直接同步containner的內容。因此當你指定的位置內檔案有異動,containner會即時讀取到最新的檔案。

-e代表環境變數,通常是dockerfile內定義,預先初始化可以帶入的參數。這邊的例子是預設定root的密碼

這邊我就不註記所有的參數用途了,有興趣請到docker從入門到實踐

安裝好DataBase,接著來順便安裝一下PhpMyadmin,這個是我從大學時期就很愛用的Mysql管理介面,最棒的是他有web版本,方便至上

sudo docker pull phpmyadmin/phpmyadmin:latest
sudo docker run -d -P –name mariadbMyAdmin –link mariadb:db phpmyadmin/phpmyadmin

-d代表在background執行

–link代表containner之間建立連線,透過:隔開,前者為來源containner名稱,後者為別名,其原理其實為在此Containner的環境的/etc/hosts下建立ip別名,透過這樣,才能讓設定檔保持一致,不用因為每次取得新的虛擬ip後,程式相關的檔案又要再度調整。

這樣設定以後,就可以直接連到該畫面了,預設的port是32768

http://xxx.xxx.xxx.xxx:32768

可以使用一開始對mariadb設定的ip進行

下載Wordpress

wget https://tw.wordpress.org/wordpress-4.7.4-zh_TW.tar.gz

複製到指定的Application目錄

tar -xzpvf wordpress-4.7.4-zh_TW.tar.gz

將該解壓縮後的檔案目錄,直接複製到一個Application的目錄,這個目錄下再切一個Wordpress目錄放置所有解壓的內容。

wordpress設定檔位置:

wordpress/we-config.php

// ** MySQL 設定 – 您可以從主機服務提供商獲取相關資訊。 ** //
/** WordPress 的資料庫名稱,請更改 “database_name_here” */
define(‘DB_NAME’, ‘wordpress’);

/** MySQL 資料庫使用者名稱,請更改 “username_here” */
define(‘DB_USER’, ‘wordpressuser’);

/** MySQL 資料庫密碼,請更改 “password_here” */
define(‘DB_PASSWORD’, ‘Abc123’);

/** MySQL 主機位址 */
define(‘DB_HOST’, ‘mariadb’);

/** 建立資料表時預設的文字編碼 */
define(‘DB_CHARSET’, ‘utf8’);

/** 資料庫對照型態。如果不確定請勿更改。 */
define(‘DB_COLLATE’, ‘utf8_unicode_ci’);

我這邊我先將db的路徑先直接改成我等下預計要建立link的名稱:mariadb,然後帳密先設定一下就好,另外我有設一個,認證金鑰,相關取得方式config都有說明,一併複製到config檔裡面就好

安裝nginx+php+php_mysql模組

特別說一下,這次使用的docker組合是已經有大神Docker連結,將php7+NGINX打包好,我將剛剛下載解壓的wordpress放到application目錄中,然後一樣透過-v配置到容器中,同時指定link到mariadb。(我自己試著裝php7,可以正常使用php,偏偏少了mysql的extension,卡了半天,先投降,日後再努力orz)

sudo docker run –name nginx -p 80:80 -v /home/paul/nginx-php/application:/data/www –link mariadb:mariadb -d skiychan/nginx-php7

建立起來以後,直接連到ip的80 port,記得vm的firewall要開,不然怎樣都連不進去

苦手坑談

曾經想自已分別安裝nginx與php-fpm模組。會這樣想純粹是因為好像有了Docker任何安裝問題都解決了,想裝什麼就裝什麼…所以我透過Docker-Compose.yml玩了一個上午,透過配置的方式,驅動Docker建置,但當環境愈來愈複雜時,包含DB跟App的分離,Php模組需要做調整設定,不同Containner之間要Link,還分為外部link跟內部link,事實上我苦腦於Compose的配置如何跟已存在的containner作link,這段也還沒研究出來,看來還有很長的路要走,但至少現在有一個開始,所以才有辦法發這篇文章呀XD