好吧,首先,我確實盜用了@konata 部落格標題了。雖然不是第一次在ESC(Elastic Cloud Service)上建立部落格了,但經歷了手動 bash 腳本、通過 Package 安裝 SimpleText 到這次用 Docker 佈置 WordPress,不能不說人類的進步真是令人敬佩。
TL;DR
如果只是 follow 所有的 code box 的話,其實也可以安裝起來屬於你自己的部落格的唷。
準備工作
本手記假定用戶已經擁有一臺雲端主機,可以是諸如阿里雲的 ECS,也可以是 Amazon 的 EC2 或者 Google 的同類產品,不一而足。當然如果是專屬的 VPS 則更好,不過對於訪問量不大的部落格而言 ECS 經濟又實惠。
SSH登錄你的服務器
衆所周知,通過 ssh 登錄服務器使用的命令是ssh <user>@<host>
,但每次輸入密碼既不安全也很麻煩,一般服務提供商會提供私鑰 PEM(Privacy Enhanced Mail)來加固登錄安全,這就要求我們必須保存好私鑰,並且限制了我們可以使用的終端數量。或者,我們也可以選擇把常用的客戶端(client)添加到主機的信任列表中。
1. 簽發你的密鑰對(Key Pair)
在 Linux 系統中,簽發密鑰對非常的方便,並且密鑰對會被保存在用戶根目錄下的一個隱藏目錄中,這使得我們一般不會誤刪這個文件,即使誤刪,我們依舊可以通過其他方式(私鑰)來登錄主機。具體地,在客戶端命令行中運行以下代碼:
ssh-keygen -t rsa
上述代碼中 ssh-keygen
就是生成密鑰對的工具,參數 -t rsa
則指定了密鑰對的加密方式爲 RSA(Rivest–Shamir–Adleman)。其他的加密方式也是可以的,不過似乎 rsa 依然是最常見的方式。
BTW:所有的 Linux 工具的參數和用法我們都可以通過 man <program name>
來查看(包括 man man
這種特別♂的命令)
生成的密鑰對保存在 ~/.ssh/id_rsa
和 ~/.ssh/id_rsa.pub
中,見不到他們也不用擔心,所以以句點(period)開始命名的文件在 Linux 系統下都是隱藏文件,需要通過 ls -a
來查看。這裏的 id_rsa.pub
就是我們的公鑰。
2. 添加到主機的信任列表(authorized_keys
)
由於你的主機可以通過 ssh 登錄,因此他應該已經存在 ~/.ssh
文件夾了,在文件夾下也應當存在一個名爲 authorized_keys
的文件,這就是我們的信任列表。當然爲了以防萬一,可以在主機輸入這兩條命令:
mkdir -p ~/.ssh
touch ~/.ssh/authorized_keys
第一條命令的 mkdir
是 make directory 的工具,參數 -p
用於保證當入參路徑的父文件夾不存在時 mkdir
會自動新建。第二條命令 touch
的作用是確保後面入參指示的文件存在,如果不存在, touch
會建立一個空文件。
確保了上述文件都存在之後,我們就可以回到我們的客戶端來把公鑰添加到剛剛我們確認的文件了。
cat ~/.ssh/id_rsa.pub | ssh <user>@<host> 'cat >> ~/.ssh/authorized_keys'
上面的這行 one-liner 實際上用到了四個程式,其中 ssh
當然是登錄主機的命令。cat
這種很萌的名字其實是 concatenate 的縮寫,作用是將文件粘貼到 stdout
或者當文件未指定時讀取 stdin
到剪貼板,第一個 cat
就是把公鑰 id_rsa.pub
複製到 stdout
,而後“|
”則把 stdout
輸送(pipe)到下一個命令裏。第二條命令 ssh
登錄了主機後立即執行 cat >> authorized_keys
於是 cat
把剛剛 pipe 來的內容通過 >>
寫入到 authorized_keys
中。自此,客戶端就加入了主機信任列表。
3. 登錄主機!
在上述操作之後,登錄主機的命令變爲:
ssh <user>@<host>
看似沒有變化,但是主機在客戶端登錄時候會匹配密鑰對,從而無需再輸入密碼。
安裝 Docker
過去的安裝經驗告訴我,大多數時候佈置一個服務需要滿足相當多的依賴關係(dependencies)任何一個環節都可能是翻車現場,Docker 的作用在於,他將已經滿足所有依賴關係的環境和程序打包成鏡像,當我們使用他的時候,只需要在容器中展開他,所有的依賴關係就能被滿足。我這裏也使用了 Ubuntu LTS 作爲 ECS 的系統,基於 Debian 的 Ubuntu 具有資源相對豐富的優勢,另一方面網路上 Ubuntu 的教程也是唾手可得,在遇到問題時候尤爲方便。
在 Ubuntu 上安裝 Docker,只需要通過 apt
程序管理器即可,需要注意,Docker 的包名是 docker.io
而不是 docker
。
sudo apt update && sudo apt -y upgrade && sudo apt install docker.io
上述命令我們使用了三次 apt
,第一次用於更新程序列表,第二次用於升級所有可升級的程式,其中參數 -y
通知 apt
在安裝時無需再次確認。第三次則是安裝 docker.io
程式。
到這步爲止,我們已經完成了準備工作。
MariaDB 容器
WordPress 是一款 CMS(Content Management System),因此需要一個數據庫來支持他,這裏我們選擇 MariaBD,因爲 Maria 這個名字我很喜歡 MariaBD 是一款開源的數據庫管理軟體(DBM),作爲 MySQL 的復刻(fork),他能很好兼容舊式的 MySQL 接口。
佈置本地文件
由於所有的程序是在 Container 當中運行的,如果 Container 被刪除我們就會失去所有的內容,爲了能夠將內容保存在本地,我們需要規劃兩個檔案夾來安置數據庫內容和部落格的頁面文件。
mkdir -p ~/wordpress/database ~/wordpress/html
其中 database
用來存放數據庫,html
用來存放 WordPress 的頁面文件。
安裝和運行 MariaDB
MariaDB 和 WordPress 這類鏡像我們都可以直接從 docker.io 下載:
docker pull mariadb
上述命令用於下載 MariaDB 的鏡像,默認地,docker 會下載最新版本的鏡像,這等同於 docker pull mariadb:latest
。
在運行這個鏡像時,我們需要設置一些參數:
- MariaDB 的參數:
-e MYSQL_ROOT_PASSWORD=<root_password>
-e MYSQL_DATABASE=wordpress
這兩個參數分別決定了我們使用的數據庫的密碼和數據庫名稱。 - Docker 的參數:
--name wordpressdb
-v /root/wordpress/database:/var/lib/mysql
-d
--name
參數給這個容器命名,這將方便我們之後使用他,-v
參數的用法是-v <filesystem_file>:<container_file>
將<filesystem_file>
映射(map)到<container_file>
。最後-d
是的整個程序在後臺運行而不佔用命令行(detached)
完整的命令就是:
docker run -e MYSQL_ROOT_PASSWORD=<root_password> -e MYSQL_DATABASE=wordpress --name wordpressdb -v /root/wordpress/database:/var/lib/mysql -d mariadb
這樣,就擁有了一個運作的數據庫了。
WordPress 容器
基本與上述相同,先下載 WordPress 鏡像:
docker pull wordpress
然後添加下列參數:
- WordPress參數:
-e WORDPRESS_DB_PASSWORD=<root_password>
這個參數用於讓 WordPress 鏈接剛剛建立的 MariaDB - Docker 參數:
--name wordpress
--link wordpressdb:mysql
-p 80:80
-v /root/wordpress/html:/var/www/html
-d
其中--link
參數用於將剛剛的wordpressdb
容器作爲mysql
鏈接到 WordPress 的容器上,-p
是端口(port)映射的參數,將容器內部的80
端口映射到主機的80
端口,這樣容器就可以通過 80 端口監聽訪問。
BTW:80 端口是最常用的 http 協議端口,也有使用 8080 或者 8280 之類的。
完成上述設置後我們的部落格就架設好了。如果我們運行:
docker ps
就能看到所有運行中的 Container。

自動重啓
當然,我們偶爾會遇到容器因爲升級等原因退出,如何讓他能夠自動重啓呢?
docker update --restart unless-stopped $(docker ps -q)
這裏我們更新了 Docker 的重啓策略,使得選定的容器除非手動停止,否則總是自動重啓。注意到命令中 $(...)
的部分是一條子命令,命令的返回值輸入到上一層的命令中。
回家作業和一些感想
Docker 的易用程度真的超出了我的想象,基本上省略了所有的 Dependencies 和 Environment configuration,無疑是人類的一大發明,不會計算機的人(我)的福音。但是運行這些 Container 其實也是吃內存的,因此窘迫的我,升級了我的 ECS plan,心疼。那麼回家作業是:
- 爲你的部落格選擇一款心儀的主題,並通過插件或 CSS 美化他,
- 不要忘記中國境內的網站是需要備案的,通過修改
Footer.php
增加備案信息, - 利用上述的 Docker 知識,讓我們來安裝
trilium
吧,一款個人知識庫管理工具。提示,鏡像的名字是 trilium 唷~
那麼,今天就到此爲止吧 XD