在 Ubuntu 16.04 使用 Docker 快速架設 Wordpress 的簡易指南

Docker 是一種可以創建容器的工具,而 Wordpress 是一個免費且開源的 php 與 mysql 的內容管理系統以及部落格工具,非常多人用它來進行網站架設、電子商務等等,本篇將幫助你在 Ubuntu 系統使用 docker 方式進行在 nginx 網站伺服器安裝 wordpress。

使用 Docker 的好處

一般來說,要進行安裝 Wordpress 系統,需要相關的服務 lamp (Linux, Apache, MySQL, PHP),安裝所有的組件相當耗時,也沒有靈活的方式好好管理。而 Docker 正解決了這件事情,可以透過 compose 快速的架設想要安裝的服務,並且可以運行多個容器的應用程式。

接下來讓我們開始吧。

必要條件

  • Ubuntu 16.04
  • Root Privileges

安裝 Docker

當你拿到一台全新的 Ubuntu 16.04 的虛擬主機時,我們將重頭開始安裝 Docker。在開始之前請先更新 Ubuntu 以及更新到最新。

1
2
$ sudo apt-get update
$ sudo apt-get upgrade

注意:你在執行 sudo apt-get update 時,出現 sudo: unable to resolve host localhost.localdomain 錯誤時。

請先編輯 /etc/hosts ,將
127.0.0.1 localhost
修改成
127.0.0.1 localhost.localdomain localhost

在預設的情況下,在 ubuntu 存儲庫 docker 可用的,安裝 docker 請執行以下

1
$ sudo apt-get install -y docker.io

安裝完成後,啟動 docker 以及設定開機時要自動啟動 docker

1
2
3
4
5
$ systemctl start docker
$ systemctl enable docker

Synchronizing state of docker.service with SysV init with /lib/systemd/systemd-sysv-install...
Executing /lib/systemd/systemd-sysv-install enable docker

那麼現在可以測試一下 docker 是否已在執行中,可以試著用 hello-world 確認一下

1
$ docker run hello-world

在執行之後,你可以看到你的 docker 已經啟動 hello-world 程序

1
2
3
$ root@localhost:~# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest fce289e99eb9 14 months ago 1.84kB

就可以看到有印象檔抓下來,代表 docker 有正常執行。

安裝 Docker-Compose

Docker-compose 是一個採用 python 的腳本撰寫的。我們需要先安裝 python, python-pip 套件

1
2
$ sudo apt-get install -y python python-pip
$ pip install --upgrade pip

接下一步是,要安裝 docker-compose

1
$ pip install docker-compose

接著就等待安裝結束,結束之後可以檢查安裝是否完成

1
$ docker-compose -v

顯示

1
2
root@localhost:~# docker-compose -v
docker-compose version 1.25.4, build unknown

安裝 Wordpress

這樣子的話,已經將 docker 和 docker-compose 安裝到系統上了。在這步驟中,將進行 wordpress 建立以及 docker-compose 環境。在這裡我們透過 docker-compose 方式進行管理將 nginx 作為 web 部署的網站伺服器、MariaDB 作為 MySQL 資料庫,每一個服務都有自己的容器。

  • Nginx: 使用最新版 nginx: latest
  • Wordpress: 在 odcker-hub 有提供了 docker 印象黨,我們要使用 wordpress 4.7 版本以及 php-fpm 7.0 版本
  • MySQL: 使用 mariadb 官方的容器,使用最新版本

我們需要 docker hub 註冊表設定上述三個 docker 印象檔。首先,我們不以 root 身份運行 docker 那麼要建立一個帳號,就使用一般的 liunx 帳號。

1
2
$ useradd -m -s /bin/bash docadmin
$ passwd docadmin

現在我們將使用者增加到 docker 群組,方便使用者可以使用 docker 指令,設定之後再重啟 docker 服務

1
2
$ usermod -a -G docker docadmin
$ systemctl restart docker

如此一來就完成新增 docadmin 使用者,那麼就直接登入 docadmin 帳號並且進行 wordpress 建立

1
2
3
$ su - docadmin
$ mkdir -p wordpress-compose
$ cd wordpress-compose/

接下來,建立一個 docker-compose.yml 檔案,首先是先新增一個資料夾

1
2
3
4
5
$ touch docker-compose.yml
$ mkdir -p nginx/
$ mkdir -p db-data/
$ mkdir -p logs/nginx/
$ mkdir -p wordpress/
  • docker-compose.yml: 主要是用來配置文件,是啟動 docker-compose 需要的文件檔案
  • nginx 資料夾: nginx 組態配置
  • db-data 資料夾: mysql 資料庫目錄,/var/lib/mysql 會被掛載到 db-data 資料夾
  • logs 資料夾: 應用程式資料夾,用來寫入 nginx, mariadb, php-fpm 日誌
  • wordpress 資料夾: wordpress 的所有檔案

在 nginx 資料夾,我們建立一個 wordpress.conf 組態配置資料夾

建立一個新的 wordpress.conf

1
$ vim nginx/wordpress.conf

貼上以下的組態內容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
server {
listen 80;
server_name wp-hakase.co;

root /var/www/html;
index index.php;

access_log /var/log/nginx/hakase-access.log;
error_log /var/log/nginx/hakase-error.log;

location / {
try_files $uri $uri/ /index.php?$args;
}

location ~ \.php$ {
try_files $uri =404;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_pass wordpress:9000;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param PATH_INFO $fastcgi_path_info;
}
}

完成後,存檔。

組態設定 Docker-Compose

在這個步驟裡,我們編輯 docker-compose.yml 文件。請編輯 nginx, mysql, wordpress

1
$ vim docker-compose.yml

貼上以下的組態內容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
nginx:
image: nginx:latest
ports:
- '80:80'
volumes:
- ./nginx:/etc/nginx/conf.d
- ./logs/nginx:/var/log/nginx
- ./wordpress:/var/www/html
links:
- wordpress
restart: always
mysql:
image: mariadb
ports:
- '3306:3306'
volumes:
- ./db-data:/var/lib/mysql
environment:
- MYSQL_ROOT_PASSWORD=yourpassword
restart: always
wordpress:
image: wordpress:4.7.1-php7.0-fpm
ports:
- '9000:9000'
volumes:
- ./wordpress:/var/www/html
environment:
- WORDPRESS_DB_NAME=wpdb
- WORDPRESS_TABLE_PREFIX=wp_
- WORDPRESS_DB_HOST=mysql
- WORDPRESS_DB_PASSWORD=yourpassword
links:
- mysql
restart: always

那麼,docker-compose 組態設定就完成了。

執行 Docker-Compose

在這一步驟要開始用 docker-compose 建立容器,請先到 wordpress-compose 資料夾

1
2
$ cd ~/wordpress-compose/
$ docker-compose up -d

執行過程顯示

1
2
3
4
5
6
... (以下省略)
Digest: sha256:2539d4344dd18e1df02be842ffc435f8e1f699cfc55516e2cf2cb16b7a9aea0b
Status: Downloaded newer image for nginx:latest
Creating wordpress-compose_mysql_1 ... done
Creating wordpress-compose_wordpress_1 ... done
Creating wordpress-compose_nginx_1 ... done

在執行的過程你可以陸陸續續看到創建了三個容器,可以使用 ps 檢查容器狀態

1
$ docker-compose ps

顯示結果

1
2
3
4
5
6
docadmin@localhost:~/wordpress-compose$ docker-compose ps
Name Command State Ports
---------------------------------------------------------------------------------------------
wordpress-compose_mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:3306->3306/tcp
wordpress-compose_nginx_1 nginx -g daemon off; Up 0.0.0.0:80->80/tcp
wordpress-compose_wordpress_1 docker-entrypoint.sh php-fpm Up 0.0.0.0:9000->9000/tcp

你可以使用 logs 指令顯示出容器的執行結果。

1
2
3
$ docker-compose logs nginx
$ docker-compose logs mysql
$ docker-compose logs wordpress

啟動 Wordpress

在這步驟之前,我們檢查系統上可用的端口是 80, 3306, 9000

1
$ netstat -plntu

顯示結果

1
2
3
4
5
6
7
8
9
10
11
docadmin@localhost:~/wordpress-compose$ netstat -plntu
(No info could be read for "-p": geteuid()=1000 but you should be root.)
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:39989 0.0.0.0:* LISTEN -
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN -
tcp6 0 0 :::9000 :::* LISTEN -
tcp6 0 0 :::3306 :::* LISTEN -
tcp6 0 0 :::80 :::* LISTEN -
tcp6 0 0 :::22 :::* LISTEN -
udp 0 0 0.0.0.0:68 0.0.0.0:* -

現在你可以打開瀏覽器輸入服務器的 ip 位置

1
http://yourserverIP/

你可以看到 wordpress 安裝頁面。選擇你的語言,請點選繼續

填入網站的詳細資訊,填寫完畢之後,就按下「安裝」

安裝完畢後,就會被導向到 wordpress 控制台

也可以造訪 wordpress 畫面,就完成安裝 wordpress 囉!

檢查 Docker Container

這個步驟是瞭解如何使用 docker-compose 容器的狀態

1
$ docker-compose ps

我們知道我們建立了三個容器,可以試著登入某一個容器,比如 nginx

1
$ docker-compose exec nginx bash
  • nginx: 屬於在 docker-compose.yml 的服務名稱
  • bash: 執行 bash shell 命令

此時你就進入到 nginx 容器裡了

1
2
docadmin@localhost:~/wordpress-compose$ docker-compose exec nginx bash
root@4b31983ffd28:/#

現在我們檢查一下 wordpress 虛擬主機的配置

1
$ cat /etc/nginx/conf.d/wordpress.conf

顯示結果

確認之後,結束時,輸入 exit 退出容器。

那麼繼續登入 mysql 容器

1
2
$ docker-compose exec mysql bash
$ mysql -u root -p

查詢資料庫列表

1
$ show databases;

最後在檢視 wordpress 容器

1
2
$ docker-compose exec wordpress bash
$ ls -lah

Done!

參考資料: