本文由ilanniweb提供友情贊助,首發于爛泥行天下
jenkins技術分享QQ群:571981257
這幾天抽了個時間,終于把自己阿裡雲ecs的os更新到了centos7,是以也打算把部落格wordpress也更新下,同時還要使用現在比較火的docker技術。
下面把相關wordpress遷移到docker中的相關步驟記錄下。
PS:強烈建議OS使用3.0以上核心。
一、備份wordpress資料
在正式遷移wordpress之前,我們需要備份wordpress的相關資料,包括資料庫、圖檔以及主題。
有關wordpress資料庫的備份,就是個仁者見仁智者見智的事情了,你通過什麼方法都可以備份的。我這邊的做法是在本地的一個環境上,使用navicat這個mysql資料庫管理工具,把資料傳輸到本地的環境上。
wordpress圖檔和主題都在wp-content這個目錄下,我們隻需要備份這個目錄即可。
二、安裝docker及其相關軟體
wordpress相關資料備份完畢後,我們現在開始安裝docker及其相關軟體。
docker的安裝我們可以分為使用腳本快速安裝和配置yum源安裝,下面分别介紹下。
docker的安裝比較簡單,我們可以直接使用官方提供的腳本快速安裝指令進行安裝,如下:
curl -fsSL https://get.docker.com/ | sh
當然我們也可以使用國内提供的腳本快速安裝指令,如下:
curl -sSL https://get.daocloud.io/docker | sh
通過配置yum源方式安裝docker就比較簡單,隻需要在本地配置yum倉庫配置即可。在此我們使用的中科大的docker倉庫,配置如下:
vim /etc/yum.repos.d/docker.repo
[dockerrepo]
name=Docker Repository
baseurl=https://yum.dockerproject.org/repo/main/centos/7
enabled=1
gpgcheck=1
gpgkey=https://yum.dockerproject.org/gpg
yum倉庫配置完畢後,我們現在開始安裝docker,如下:
yum -y install docker-engine
如果我們想讓普通使用者也具有使用docker權限,隻需要把該使用者添加到docker使用者組即可。現在以ilanni這個使用者為例,如下:
cat /etc/group |grep docker
sudo usermod -aG docker ilanni
su – ilanni
docker ps
預設情況下docker是沒有開機啟動的,使用下面指令使docker開機啟動,如下:
systemctl start docker && systemctl enable docker
因為wordpress需要使用多個docker鏡像,是以在此我們使用docker-compose編排工具,進行管理。
安裝docker-compose,使用如下指令:
curl -L https://github.com/docker/compose/releases/download/1.13.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose
chmod +x /usr/local/bin/docker-compose
docker-compose –version
centos7預設情況使用的是firewalld作為防火牆,但是對firewalld很是不熟悉,是以還是打算使用iptables。
下面安裝iptables,使用如下指令:
yum -y install iptables-services iptables
把iptables加入到系統服務,使用如下指令:
cp /usr/libexec/iptables/iptables.init /etc/init.d/iptables
/etc/init.d/iptables start
/etc/init.d/iptables status
把iptables設定為開機啟動,使用如下指令:
systemctl enable iptables
systemctl list-unit-files | grep iptables
關閉firewalld服務,使用如下指令:
systemctl disable firewalld.service
systemctl status firewalld.service
PS:docker及其相關軟體安裝完畢後,強烈建議重新開機伺服器。
三、下載下傳鏡像
在本次wordpress遷移到docker中,我們需要兩個鏡像mysql鏡像和wordpress鏡像。其中wordpress鏡像中包含apache、php和wordpress,而mysql鏡像提供資料庫服務。
PS:無論是wordress鏡像還是mysql鏡像都提供了多個版本,比如:wordpress鏡像中有的隻提供wordpress功能,沒有提供php功能等等。
但是這次為了遷移的友善,我們隻使用wordpress提供的全部功能。
除此之外,考慮到衆所周知的原因,我們使用國内網易的蜂巢docker。
因為我現在wordpress的資料庫使用的mysql5.5版本,是以我們也要下載下傳mysql5.5的docker鏡像,使用如下指令:
docker pull hub.c.163.com/library/mysql:5.5
如果要使用官方提供的mysql5.5鏡像,使用如下指令:
docker pull mysql:5.5
wordpress鏡像我們使用最新的版本即可,下載下傳最新版本的鏡像指令如下:
docker pull hub.c.163.com/library/wordpress
如果要使用官方提供的wordpress鏡像,使用如下指令:
docker pull wordpress
對于wordpress提供的多個版本,我們使用的是包含有apache、php、php-fpm的latest版本。
對于隻提供wordpress功能的版本,我們會在以後的文章進行相關講解。
四、編寫docker-compose.yml檔案
為了管理容器的友善在此我們使用的是docker-compose來進行的,當然你也可以對每個docker鏡像單獨來運作。
但是在這為了遷移的友善,我們在這直接使用docker-compose來進行管理。
對于docker-compose,我們隻需要編寫docker-compose.yml檔案,即可。示例如下:
vim docker-compose.yml
version: '2'
services:
mysqldb:
p_w_picpath: hub.c.163.com/library/mysql:5.5
container_name: ilanni_mysql
ports:
- "33033:3306"
volumes:
- ./data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: 123456
MYSQL_DATABASE: ilanni
MYSQL_USER: wwwilanni
MYSQL_PASSWORD: ilanni123
wordpress:
depends_on:
- mysqldb
p_w_picpath: hub.c.163.com/library/wordpress
container_name: ilanni_wordpress
- "80:80"
WORDPRESS_DB_HOST: ilanni_mysql:3306
WORDPRESS_DB_NAME: ilanni
WORDPRESS_DB_USER: wwwilanni
WORDPRESS_DB_PASSWORD: ilanni123
- ./wp-content/themes/xiu_ilanni:/var/www/html/wp-content/themes/xiu_ilanni
- ./wp-content/plugins:/var/www/html/wp-content/plugins
- ./wp-content/uploads:/var/www/html/wp-content/uploads
- ./favicon.ico:/var/www/html/favicon.ico
- ./alivv.txt:/var/www/html/alivv.txt
上述的docker-compose.yml檔案中,我們建立了兩個容器ilanni_mysql和ilanni_wordpress,其中- ./data:/var/lib/mysql的意思是把容器中的/var/lib/mysql目錄映射到本地的data目錄下。
- ./alivv.txt:/var/www/html/alivv.txt意思是把本地的alivv.txt檔案挂載到容器為/var/www/html/alivv.txt檔案。
- "33033:3306"意思是把容器中的3306端口映射為本地33033端口。
depends_on意思是一個容器依賴與另外一個容器。
docker-compose.yml檔案編寫完畢後,我們就可以啟動容器了。使用如下指令:
docker-compose up -d
通過上圖我們可以很明顯的看出,ilanni_mysql和ilanni_wordpress這個容器已經建立完畢。
PS:上述docker-compose.yml檔案相關的環境變量中,我們都可以在對應docker鏡像中看到對應的函數。
mysql鏡像的對應變量,可以通過如下連接配接進行檢視:
https://hub.docker.com/r/library/mysql/
wordpress鏡像的對應變量,可以通過如下連接配接進行檢視:
https://hub.docker.com/r/library/wordpress/
五、導入wordpress備份資料
通過上述章節,我們可以看到ilanni_mysql容器已經正常啟動了。
現在我們把wordpress備份的資料導入到新的資料庫中,使用navicat進行資料傳輸如下:
通過上圖,我們可以看到wordpress資料已經被恢複到新的資料庫ilanni_mysql中了。
其他的備份資料,我們隻需要複制到對應的目錄下即可。
六、啟動容器
其實我們在前面已經啟動了容器,之是以我們再次說要啟動容器,是因為我們在第五章節中剛剛把原來備份的資料恢複到新的環境中。
現在我們隻需要重新開機容器即可,使用如下指令:
docker-compose restart
現在我們來通路下剛剛恢複資料後的wordpress,如下:
通過上圖,我們可以看出wordpress已經全部遷移過去了。
七、配置iptables規則
因為沒有啟用firewalld服務,是以這個牽涉到有關iptables規則的配置。
下面是正确配置的iptables規則,如下:
cat /etc/sysconfig/iptables
*nat
:PREROUTING ACCEPT [263:15384]
:INPUT ACCEPT [135:7704]
:OUTPUT ACCEPT [104:6272]
:POSTROUTING ACCEPT [232:13952]
:DOCKER - [0:0]
-A PREROUTING -m addrtype --dst-type LOCAL -j DOCKER
-A OUTPUT ! -d 127.0.0.0/8 -m addrtype --dst-type LOCAL -j DOCKER
-A POSTROUTING -s 172.17.0.1/16 ! -o docker0 -j MASQUERADE
COMMIT
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
-A INPUT -i br-eaa791e079d2 -j ACCEPT
-A FORWARD -o br-eaa791e079d2 -j DOCKER
-A FORWARD -o br-eaa791e079d2 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i br-eaa791e079d2 ! -o br-eaa791e079d2 -j ACCEPT
-A FORWARD -i br-eaa791e079d2 -o br-eaa791e079d2 -j ACCEPT
-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p icmp -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 80 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 22022 -j ACCEPT
-A INPUT -j REJECT --reject-with icmp-host-prohibited
-A FORWARD -j REJECT --reject-with icmp-host-prohibited
上述iptables規則中,我們需要關注nat規則和filter規則,對于nat規則中我們隻需要關注POSTROUTING中ip位址即可。
該ip位址就是docrer0網卡的ip位址,我們可以通過ip a指令進行檢視,如下:
ip add
對于filter規則中,需要我們關注如下規則:
-A FORWARD -o br-d63b827b6fc9 -j DOCKER
-A FORWARD -o br-d63b827b6fc9 -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A FORWARD -i br-d63b827b6fc9 ! -o br-d63b827b6fc9 -j ACCEPT
-A FORWARD -i br-d63b827b6fc9 -o br-d63b827b6fc9 -j ACCEPT
其中br-d63b827b6fc9為docker所在機器的橋接網卡位址,如果docker所在機器有多塊網卡的話,我們可以通過登入進入docker容器檢視ip位址,就可以得到該容器運作時所使用的主控端的網卡。
示例如下:
docker exec -it ilanni_mysql /bin/bash
ip a
八、配置wordpress上傳圖檔權限
按照上述步驟遷移完畢後,在釋出文章時,你會發現wordpress提示你沒有上傳圖檔的權限。
這個應該是wordpress鏡像的一個bug,需要我們修改wordpress鏡像的upload目錄的權限,如下:
docker exec -it ilanni_wordpress /bin/bash
chown www-data:www-data -R wp-content/uploads/
