Hazel Wu | 22'mm

為現有 Wordpress 架 Docker 在本機

2019-05-23

為現有 Wordpress 架 Docker 在本機

This topic will teach you how to using docker to migrate existing wordpress.
目的:將現有的WordPress 網站整個移到 Docker 容器內開啟,不再藉由 MAMP,在本機上架設環境。
筆者環境為 MacOS 10.14.2 ,已安裝好 Docker、也設定好用ssh連線到Server。現況是在Server端上有Wordpress網站,因此資料庫、Wordpress整包檔案都會從Server上抓,Server是租Digital Ocean的。

步驟

  1. 從Server上抓取Wordpress整包檔案、Wordpress 資料庫備份(.sql)
  2. 撰寫及設定 DockerCompose
  3. Run docker

設立專案環境

設定專案環境,在桌面上建立資料夾叫wp-docker,並在wp-docker目錄內建立docker-compose.yml檔及data資料夾。之後會設定docker-compose.yml設定容器、在data資料夾下放資料(.sql檔)

1
2
3
4
5
cd ~/Desktop
mkdir wp-docker
cd wp-docker
touch docker-compose.yml
mkdir data

抓整包Wordpress

我租用的主機是Digital Ocean,主機預設Wordpress放的資料夾是在/var/www/html內,可以根據實際Wordpress放的目錄更改資料夾。
scp 指令是透過 ssh 安全且加密連線傳輸檔案,加上-r參數才能夠copy整個資料夾下來。

1
scp -r [email protected]主機ip:/var/www/html ~/Desktop/wp-site

在local端輸入這行指令,會將主機上的/var/www/html資料夾下載到local端的桌面/wp-site資料夾,也就是把整包wordpress檔案從伺服器上抓到Desktop/wp-site上

抓資料

倒出資料

mysqldump是 mysql 將資料庫倒出來的指令,-u參數表示user,-p參數表示選擇哪個資料庫。我會習慣加上備份資料的日期,比較好區分。
如果不知道wordpress連線的是哪一個資料庫,可以去查主機裡的wordpress資料夾的wp-config.php檔,上面會顯示連接的資料庫名稱、帳號及密碼。

1
2
ssh wordpress
mysqldump -u root -p wordpress > ./wp-20190523.sql

這行指令的意思是:連線到wordpress主機後,將wordpress的資料庫倒出來,放在目前目錄下並命名檔案為wp-20190523.sql
打完指令後會發現目錄下產生一個叫wp-20190523.sql檔案。

1
2
3
exit # 離開遠端連線,回到local端
cd ~/Desktop/wp-docker
scp -r [email protected]主機IP:wp-20190523.sql ./data

離開主機連線,回到local端後,我們移動到專案資料夾wp-docker,並再次從主機上抓剛剛dump出來的資料,下載到/Desktop/wp-docker/data內。
我們完成了步驟一,從Server上抓取Wordpress整包檔案、Wordpress 資料庫備份(.sql)
如果都沒有問題的話,電腦的桌面上應該會有wp-site資料夾,裡面是整包Wordpress檔,還有wp-docker資料夾,wp-docker/data內有wp-20190523.sql

撰寫及設定 DockerCompose

開啟 Desktop/wp-docker/docker-compose.yml檔,並複製貼上
以下的設定採自Wordpress官方的設定檔,額外小小修改了一下,做的設定是將容器資料庫的資料、本地wordpress檔copy到容器內,都是透過Docker Volumes。
總共載入了兩個image,分別是mysql:5.7、wordpress:latest,如果本機上沒有,Docker會很貼心自動幫你下載。
在mysql的volumes(掛載資料)設定./data/wp_20190523.sql連到容器內的/docker-entrypoint-initdb.d/wp_20190523.sql,而wordpress整包檔案也是利用volumes,將../wp-site/資料夾整包 Copy到 wordpress 容器內的/var/www/html

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
version: '3.3'

services:
db:
image: mysql:5.7
volumes:
# - db_data:/var/lib/mysql
- ./data/wp_20190523.sql:/docker-entrypoint-initdb.d/wp_20190523.sql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress

wordpress:
depends_on:
- db
image: wordpress:latest
volumes:
- ../wp-site/:/var/www/html
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306
WORDPRESS_DB_USER: wordpress
WORDPRESS_DB_PASSWORD: wordpress
WORDPRESS_DB_NAME: wordpress
volumes:
db_data: {}

運行 Docker

設定完後,在終端機上打上指令

1
docker-compose up -d

開啟瀏覽器:localhost:8000,便會看到畫面啦!
如果跑不出來畫面需要debugger,將-d參數取消即可,參數-d表示在背景下run

1
2
# debuger 用
docker-compose up

如果覺得每次輸入docker-compose指令太長,可以透過 alias來簡化設定,我設定成up、down,單字實在太長,打得很崩潰XD

1
2
3
4
5
vi ~/.zshrc
# 在空白處加上
alias up="docker-compose up"
alias down="docker-compose down"
:wq

我的終端機是使用 zsh,如果你是bash,可以改為 ~/.bashrc 去修改。存檔後,以後在終端機上輸入up就會啟動docker-compose,down則代表docker-compose down,設定好之後,筆者覺得神快速!!

Docker Compose 指令

介紹相關Docker Compose指令
將容器運行

1
docker-compose up

將容器移除

1
docker-compose down

途中遇到的問題

  1. 如何在 docker-compose 複製 wp-config.php檔到容器內?
    docker-compose有設定環境變數,例如像是:
    1
    2
    3
    environment:
    WORDPRESS_DB_HOST: db:3306
    WORDPRESS_DB_NAME: wordpress

導致無法複製wp-config.php,但會代入你設定的變數。所以乾脆一勞永逸,把整個wordpress專案都複製到container裡面的/var/www/html

  1. 查詢 Digital Ocean Mysql密碼
    1
    2
    ssh wordpress
    cat /root/.digitalocean_password

便會印出Mysql root password、Wordpress database。
不過設定docker-compose最終結果是,不需要同步與伺服器的database設定一樣。

  1. MySQL Connection Error: (1045) Access denied for user ‘root‘@’192.168.0.1’ (using password: YES)
    遠端ssh連線到Server後,用mysql dump備份並用scp copy到本機,用docker-compose匯入,出現的錯誤訊息:MySQL Connection Error: (1045) Access denied for user 'root'@'192.168.0.1' (using password: YES)

如果有更改docker-compose的密碼且不是第一次 run container,需要重新下這個指令

1
docker-compose rm -v

輸入此指令會刪除所有的設定,並重新再跑一次 container
如果直接輸入docker-compose up docker會避免額外的工作,儲存volumes的資料。

Reference

閱讀量