1. 程式人生 > >Docker 之 基於LNMP容器部署WordPress

Docker 之 基於LNMP容器部署WordPress

轉載於http://blog.51cto.com/ghbsunny/2155046

LAMP的網路連線,有兩個方法

第一: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的啟動指令碼

[[email protected] 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容器

[[email protected] ~]# 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"]

建立映象

[[email protected] fpm]# docker build -t fpm:v1 ./

啟動容器,如果fpm運行於前臺,則啟動成功

[[email protected] fpm]# docker run --rm --name fpm fpm:v1

 

準備nginx映象

注意,這裡的VOLUME要和fpm裡的VOLUME保持一致即可,實際上和fpm的VOLUME目前沒有直接的聯絡,是兩個不同的VOLUME,但是為了方便區分,把VOLUME命名為一樣,啟動後,可通過--volume-from選項來確保卷路徑一致

[[email protected] ~]# 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下面

 

[[email protected] 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;"]

建立映象

[[email protected] nginx]# docker build -t nginx:v1 ./

執行容器,使用-P暴露埠

[[email protected] nginx]# docker run --rm -P --name nginx nginx:v1

 

到這裡,三個基本可用的容器已經準備好了。

首先啟動nginx容器

[[email protected] nginx]# docker run -it --rm -P --name nginx nginx:v1

啟動fpm容器,並把網路加入到nginx容器,且卷直接複製nginx容器,確保使用同一路徑

[[email protected] 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

[[email protected] nginx]# cd /var/lib/docker/volumes/22363fc6ba24150932b445ec84414b83706146dfbc3668b573d4a461379eda0e/_data

[[email protected] _data]# vim index.php

 

<?php

        phpinfo();

?>

儲存退出後,檢視nginx暴露的埠

[[email protected] _data]# docker port nginx

80/tcp -> 0.0.0.0:32788

[[email protected] _data]#

在瀏覽器上輸入http://10.10.10.72:32788/ ,如果能夠看到php的測試頁資訊,則表示nginx能正確的把php請求排程到容器fpm裡處理,這裡測試成功,成功後可以把測試頁index.php刪掉,後面這裡會存放WordPress的檔案

 

啟動mariadb資料庫

注意,正常情況下,在編輯dockerfile檔案時,最好是能把mariadb啟動的初始化設定,如果沒有設定,可以在啟動mariadb容器後,連線mariadb容器進行初始化,主要是因為mariadb不做初始化,預設賬號root僅能本地連線,這裡不做演示,而是將mariadb容器的網路加入到fpm裡,實現本地連線的場景

啟動mariadb容器

[[email protected] _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下面,然後通過瀏覽器訪問進行相關初始化配置寫入

[[email protected] ~]# tar xf wordpress-4.7.4-zh_CN.tar.gz

[[email protected] ~]# cd wor

wordpress/ workshop/ 

[[email protected] ~]# cd wordpress/

[[email protected] 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

[[email protected] wordpress]# mv * /var/lib/docker/volumes/22363fc6ba24150932b445ec84414b83706146dfbc3668b573d4a461379eda0e/_data

[[email protected] wordpress]# cd /var/lib/docker/volumes/22363fc6ba24150932b445ec84414b83706146dfbc3668b573d4a461379eda0e/_data

[[email protected] _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目錄,更改目錄的所有者和所屬組

[[email protected] _data]# docker inspect -f {{.Mounts}} db1

[{volume ffed5c72badc05ded96f1f32467e7a51440fd26e45e945f8b9a0294afa13b1f8 /var/lib/docker/volumes/ffed5c72badc05ded96f1f32467e7a51440fd26e45e945f8b9a0294afa13b1f8/_data /var/lib/mysql local  true }]

[[email protected] _data]# cd

[[email protected] ~]#

[[email protected] ~]# cd /var/lib/docker/volumes/ffed5c72badc05ded96f1f32467e7a51440fd26e45e945f8b9a0294afa13b1f8/_data

[[email protected] _data]# ls

aria_log.00000001  aria_log_control  ibdata1  ib_logfile0  ib_logfile1  mysql  mysql.sock  performance_schema  test

[[email protected] _data]# mkdir wordpress

[[email protected] _data]# chown -R 27:27 wordpress/

 

到這裡完成後,在瀏覽器輸入http://10.10.10.72:32788/ ,會自動跳轉到初始化配置頁,根據頁面提示,將網頁生成配置wp-config.php目錄直接寫入,完成初始化,wordpress基於LNMP架構的容器執行成功。

這個例子中,後期要完善的有,mariadb的初始化,以及容器編排問題