Docker 之 基於LAMP容器部署WordPress
第一:nginx需要兩個網卡,一個面向客戶端,一個面向fpm,而fpm也要有兩個網卡,一個面向nginx,一個面向mysql
第二,nginx和fpm,mariadb都在同一docker0橋,只需把nginx端口暴露就可以
準備三個鏡像,用於nignx,fpm,mariadb。
mkdir -pv /root/lnmp/{nginx,fpm,mariadb}
使用綁定掛載的卷,目的明確,但是不能保證後期運行這些容器的宿主機上也有這些卷存在,因此,建議使用docker管理的卷,後期啟動容器,不用考慮卷的問題,但是docker管理的卷的路徑需要通過命令查看才知道
準備mariadb數據庫
可以現在其他主機上安裝mariadb-server,安裝後可以查看/usr/lib/systemd/system/mariadb.service這個文件,看看啟動要運行什麽命令,然後再編寫Dockerfile進行鏡像制作
cd /root/lnmp/mariadb
編寫dockerfile
vim Dockerfile
#for mairadb container
FROM centos:7.3.1611
MAINTAINER "sunny <[email protected]>"
COPY start-db.sh /etc/init.d
VOLUME "/var/lib/mysql"
RUN yum -y install mariadb-server;\
yum clean all;
CMD ["/etc/init.d/start-db.sh"]
準備/root/lnmp/start-db.sh,作為mysql的啟動腳本
[root@docker mariadb]# vim /root/lnmp/mariadb/start-db.sh
#!/bin/bash
/usr/libexec/mariadb-prepare-db-dir
/usr/bin/mysqld_safe --basedir=/usr
chmode a+x /root/lnmp/mariadb/start-db.sh
制作鏡像
docker build -t mariadb:v1 ./
把鏡像運行為容器,並查看是否有報錯,如果沒有報錯,且mariadb運行於前臺,則mariadb準備完成
docker run --rm --name db1 mariadb:v1
準備php-fpm容器
[root@docker ~]# cd /root/lnmp/fpm/
vim Dockerfile
#for php-fpm container
FROM centos:7.3.1611
MAINTAINER "sunny [email protected]"
RUN yum -y install php-fpm php-mbstring php-mysql;\
yum clean all;\
rm -rf /var/cache/yum;
VOLUME "/webapp/wordpress"
CMD ["/usr/sbin/php-fpm","--nodaemonize"]
創建鏡像
[root@docker fpm]# docker build -t fpm:v1 ./
啟動容器,如果fpm運行於前臺,則啟動成功
[root@docker fpm]# docker run --rm --name fpm fpm:v1
準備nginx鏡像
註意,這裏的VOLUME要和fpm裏的VOLUME保持一致即可,實際上和fpm的VOLUME目前沒有直接的聯系,是兩個不同的VOLUME,但是為了方便區分,把VOLUME命名為一樣,啟動後,可通過--volume-from選項來確保卷路徑一致
[root@docker ~]# cd /root/lnmp/nginx/
需要把nginx的配置指向fpm,因此需要準備一個配置文件,nginx.conf,啟用php的配置段
vim nginx.conf
#更改http配置段兩個內容,其他保持不變
location / {
root /webapp/wordpress;
index index.php index.html index.htm;
}
location ~ \.php$ {
root /webapp/wordpress;
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
由於nginx為編譯安裝,且安裝後路徑為/usr/local/nginx/conf/,因此在dockerfile中,要把這個更改後的nginx.conf復制到/usr/local/nginx/conf下面
[root@docker nginx]# vim Dockerfile
#For nginx container
FROM centos:7.3.1611
MAINTAINER "sunny <[email protected]>"
ENV nginx_ver=1.14.0
ENV nginx_url=http://nginx.org/download/nginx-${nginx_ver}.tar.gz
VOLUME "/webapp/wordpress"
WORKDIR "/usr/local/src"
EXPOSE 80/tcp
ADD ${nginx_url} /usr/local/src/
RUN tar xf nginx-${nginx_ver}.tar.gz && yum -y install gcc pcre-devel openssl-devel make \
&& cd nginx-${nginx_ver} && ./configure && make && make install
COPY nginx.conf /usr/local/nginx/conf/
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]
創建鏡像
[root@docker nginx]# docker build -t nginx:v1 ./
運行容器,使用-P暴露端口
[root@docker nginx]# docker run --rm -P --name nginx nginx:v1
到這裏,三個基本可用的容器已經準備好了。
首先啟動nginx容器
[root@docker nginx]# docker run -it --rm -P --name nginx nginx:v1
啟動fpm容器,並把網絡加入到nginx容器,且卷直接復制nginx容器,確保使用同一路徑
[root@docker nginx]# docker run --name fpm -d --volumes-from nginx --net container:nginx fpm:v1
php啟動成功後,在nginx容器對應的目錄/webapp/wordpress/目錄下準備一個文件index.php測試php反代是否成功
通過以下inspect命令查看卷/webapp/wordpress在本地的路徑,進入路徑後編輯index.php測試頁
docker inspect -f {{.Mounts}} nginx
[root@docker nginx]# cd /var/lib/docker/volumes/22363fc6ba24150932b445ec84414b83706146dfbc3668b573d4a461379eda0e/_data
[root@docker _data]# vim index.php
<?php
phpinfo();
?>
保存退出後,查看nginx暴露的端口
[root@docker _data]# docker port nginx
80/tcp -> 0.0.0.0:32788
[root@docker _data]#
在瀏覽器上輸入http://10.10.10.72:32788/ ,如果能夠看到php的測試頁信息,則表示nginx能正確的把php請求調度到容器fpm裏處理,這裏測試成功,成功後可以把測試頁index.php刪掉,後面這裏會存放WordPress的文件
啟動mariadb數據庫
註意,正常情況下,在編輯dockerfile文件時,最好是能把mariadb啟動的初始化設置,如果沒有設置,可以在啟動mariadb容器後,連接mariadb容器進行初始化,主要是因為mariadb不做初始化,默認賬號root僅能本地連接,這裏不做演示,而是將mariadb容器的網絡加入到fpm裏,實現本地連接的場景
啟動mariadb容器
[root@docker _data]# docker run --name db1 -d --net container:fpm mariadb:v2
到這裏,nginx,php-fpm,mariadb的容器都啟動成功,其容器網絡使用加入式網絡,接下來把wordpress應用軟件放到共享卷/webapp/wordpress下面
軟件包:wordpress-4.7.4-zh_CN.tar.gz
解壓軟件包,並把解壓後的wordpress文件放到共享卷/webapp/wordpress下面,然後通過瀏覽器訪問進行相關初始化配置寫入
[root@docker ~]# tar xf wordpress-4.7.4-zh_CN.tar.gz
[root@docker ~]# cd wor
wordpress/ workshop/
[root@docker ~]# cd wordpress/
[root@docker wordpress]# ls
index.php wp-blog-header.php wp-includes wp-settings.php
license.txt wp-comments-post.php wp-links-opml.php wp-signup.php
readme.html wp-config-sample.php wp-load.php wp-trackback.php
wp-activate.php wp-content wp-login.php xmlrpc.php
wp-admin wp-cron.php wp-mail.php
[root@docker wordpress]# mv * /var/lib/docker/volumes/22363fc6ba24150932b445ec84414b83706146dfbc3668b573d4a461379eda0e/_data
[root@docker wordpress]# cd /var/lib/docker/volumes/22363fc6ba24150932b445ec84414b83706146dfbc3668b573d4a461379eda0e/_data
[root@docker _data]# ls
index.php wp-blog-header.php wp-includes wp-settings.php
license.txt wp-comments-post.php wp-links-opml.php wp-signup.php
readme.html wp-config-sample.php wp-load.php wp-trackback.php
wp-activate.php wp-content wp-login.php xmlrpc.php
wp-admin wp-cron.php wp-mail.php
註意,wordpress安裝需要指定一個數據庫,如果沒有數據庫,可以在db1容器對應的卷下面創建一個wordpress目錄,作為後面要wordpress的數據庫,另外,如果數據庫沒有初始化,默認用戶root,密碼為空。
查找數據庫的卷路徑,創建wordpress目錄,更改目錄的所有者和所屬組
[root@docker _data]# docker inspect -f {{.Mounts}} db1
[{volume ffed5c72badc05ded96f1f32467e7a51440fd26e45e945f8b9a0294afa13b1f8 /var/lib/docker/volumes/ffed5c72badc05ded96f1f32467e7a51440fd26e45e945f8b9a0294afa13b1f8/_data /var/lib/mysql local true }]
[root@docker _data]# cd
[root@docker ~]#
[root@docker ~]# cd /var/lib/docker/volumes/ffed5c72badc05ded96f1f32467e7a51440fd26e45e945f8b9a0294afa13b1f8/_data
[root@docker _data]# ls
aria_log.00000001 aria_log_control ibdata1 ib_logfile0 ib_logfile1 mysql mysql.sock performance_schema test
[root@docker _data]# mkdir wordpress
[root@docker _data]# chown -R 27:27 wordpress/
到這裏完成後,在瀏覽器輸入http://10.10.10.72:32788/ ,會自動跳轉到初始化配置頁,根據頁面提示,將網頁生成配置wp-config.php目錄直接寫入,完成初始化,wordpress基於LNMP架構的容器運行成功。
這個例子中,後期要完善的有,mariadb的初始化,以及容器編排問題
Docker 之 基於LAMP容器部署WordPress