如何用Docker搭建Nginx+PHP+MySQL環境并部署WordPress

準備工作

?使用阿里云kelude

到 ?創建一個項目,如dockerfile。之后我們把wordpress環境的所有相關dockerfile及配置文件放置到centosbz目錄。

使用阿里云鏡像倉庫

阿里云docker鏡像倉庫地址為 ?,用來存放docker鏡像,可以在本地push鏡像上去,也可以從kelude拉取dockerfile自動構建鏡像。我們先登錄,然后新建一個namespace,如centos-bz,之后所有的nginx,php,mysql鏡像將存放在這個namespace下。

安裝docker-compose

需要在運行docker容器的主機上安裝docker-compose,可以參照官方文檔手動安裝,也可以使用ezhttp的一鍵安裝工具(推薦)安裝。如:

wget?centos.bz/ezhttp.zip ?unzip?ezhttp.zip ?cd?ezhttp-master ?./start.sh

之后會彈出一個菜單,輸入2選擇some useful tools,然后輸入18選擇安裝docker和compose。

編寫dockerfile

clone以上在阿里云kelude創建的dockerfile鏡像到本地,在此項目中創建centos.bz,然后在centos.bz目錄分別創建mysql,nginx,php目錄,用于存放它們各自dockerfile及配置文件。

這里我們還約定以下目錄:

/home/docker/nginx/logs/centos.bz:存放www.centos.bz網站的日志

/home/docker/nginx/www/centos.bz: 存放www.centos.bz網站的文件

/home/docker/php: 存放php-fpm的日志

/home/docker/mysql:mysql data目錄

nginx dockerfile

在nginx目錄創建dockerfile文件,寫入如下內容:

#?從debian:jessie鏡像基礎上安裝nginx from?debian:jessie ? #?聲明此dockerfile維護者的郵箱,有什么問題可以發到此郵件尋問 label?maintainer?"admin@centos.bz" ? #?定義軟件版本及編譯工具變量 env?nginx_version?1.10.3 env?openssl_version?1.0.2h env?zlib_version?1.2.11 env?pcre_version?8.40 env?concat_version?1.2.2 env?build_tools?wget?gcc?make?g++ env?src_dir?/opt/nginx ? #?切換到工作目錄 workdir?${src_dir} ? #?開始編譯nginx,我們這里使用編譯安裝nginx而不是使用官方提供的nginx鏡像是因為這里使用到了第三方的concat模塊,只能編譯了。 #?把所有的安裝命令都寫在一個run指令中是因為這樣可以減小鏡像層數,縮減鏡像大小。推薦使用反斜杠和&&把所有的安裝命令放置到一行中。 run?apt-get?update? ?&&?apt-get?-y?--no-install-recommends?install?ca-certificates?${build_tools}? ?&&?wget?http://nginx.org/download/nginx-${nginx_version}.tar.gz? ?&&?wget?https://www.openssl.org/source/openssl-${openssl_version}.tar.gz? ?&&?wget?http://www.zlib.net/zlib-${zlib_version}.tar.gz? ?&&?wget?https://ftp.pcre.org/pub/pcre/pcre-${pcre_version}.tar.gz? ?&&?wget?https://github.com/alibaba/nginx-http-concat/archive/${concat_version}.tar.gz?-o?nginx-http-concat-${concat_version}.tar.gz? ?&&?tar?xf?nginx-${nginx_version}.tar.gz? ?&&?tar?xf?openssl-${openssl_version}.tar.gz? ?&&?tar?xf?zlib-${zlib_version}.tar.gz? ?&&?tar?xf?pcre-${pcre_version}.tar.gz? ?&&?tar?xf?nginx-http-concat-${concat_version}.tar.gz? ?&&?cd?nginx-${nginx_version}? ?&&?./configure?--prefix=/usr/local/nginx?--with-pcre=../pcre-${pcre_version}? ????--with-zlib=../zlib-${zlib_version}? ????--with-http_ssl_module? ????--with-openssl=../openssl-${openssl_version}? ????--add-module=../nginx-http-concat-${concat_version}? ?&&?make?-j$(nproc)? ?&&?make?install? ?&&?rm?-rf?${src_dir}? ?&&?apt-get?purge?-y?--auto-remove?${build_tools}? ?&&?rm?-rf?/var/lib/apt/lists/* ? #?把構建上下文目錄conf,即dockerfile/centos.bz/nginx/conf目錄下的文件復制到容器的/usr/local/nginx/conf目錄。 copy?conf/?/usr/local/nginx/conf/ ? #?定義啟動容器時運行的命令 entrypoint?["/usr/local/nginx/sbin/nginx"] ? expose?80?443

對于conf目錄下的nginx配置文件,需要把日志,網站目錄更改為以下約定的目錄位置。

php-fpm dockerfile

創建dockerfile/centos.bz/php-fpm目錄,在此目錄下創建dockerfile文件,內容如下:

from?debian:jessie label?maintainer?"admin@centos.bz" ? #?定義軟件版本,編譯工具,依賴等變量 env?php_version?5.6.30 env?build_tools?m4? ????autoconf? ????autoconf2.13? ????openssl? ????wget? ????gcc? ????make ? env?build_deps?libcurl4-gnutls-dev? ????libxml2-dev? ????zlib1g-dev? ????libpcre3-dev? ????libjpeg-dev? ????libpng12-dev? ????libfreetype6-dev? ????libmhash-dev? ????libmcrypt-dev? ????libssl-dev? ????libtool ? env?php_location?/usr/local/php env?build_arg?--prefix=${php_location}? ????--with-config-file-path=${php_location}/etc? ????--enable-fpm? ????--enable-bcmath? ????--with-pdo_sqlite? ????--with-gettext? ????--with-iconv? ????--enable-ftp? ????--with-sqlite3? ????--enable-mbstring? ????--enable-sockets? ????--enable-zip? ????--enable-soap? ????--with-openssl? ????--with-zlib? ????--with-curl? ????--with-gd? ????--with-jpeg-dir? ????--with-png-dir? ????--with-freetype-dir? ????--with-mcrypt? ????--with-mhash? ????--with-mysql=mysqlnd? ????--with-mysqli=mysqlnd? ????--with-pdo-mysql=mysqlnd? ????--without-pear? ????--with-libdir=lib64? ????--enable-opcache? ????--disable-cgi ? env?src_dir?/opt/php ? workdir?${src_dir} ? #?開始編譯安裝php run?apt-get?update? ?&&?apt-get?-y?--no-install-recommends?install?${build_deps}?${build_tools}? ?&&?wget?http://php.net/distributions/php-${php_version}.tar.gz? ?&&?tar?xf?php-${php_version}.tar.gz? ?&&?cd?php-${php_version}? ?&&?ln?-s?/usr/lib/x86_64-linux-gnu/libssl.so?/usr/lib/libssl.so? ?&&?ln?-s?/usr/lib?/usr/lib64? ?&&?./configure?${build_arg}? ?&&?make?-j$(nproc)? ?&&?make?install? ?&&?cp?php.ini-production?${php_location}/etc/php.ini? ?&&?cp?${php_location}/etc/php-fpm.conf.default?${php_location}/etc/php-fpm.conf? ?&&?rm?-rf?${src_dir}? ?&&?apt-get?purge?-y?--auto-remove?${build_tools}? ?&&?rm?-rf?/var/lib/apt/lists/* ? ? workdir?${php_location}/etc/ ? #?配置php-fpm,即使用sed工具編輯php-fpm.conf和php.ini文件,這里的php-fpm相關配置命令不與上面的編譯命令合在一起來減小層數是因為 #?配置文件可能會改動比較多,這樣分開當配置文件更改時可以直接使用緩存跳過編譯步驟,加快構建速度。 run?set_php_variable(){? ??local?key=$1;? ??local?value=$2;? ??if?grep?-q?-e?"^$keys*="?php.ini;then? ???sed?-i?-r?"s#^$keys*=.*#$key=$value#"?php.ini;? ??else? ???sed?-i?-r?"s#;s*$keys*=.*#$key=$value#"?php.ini;? ??fi;? ??if?!?grep?-q?-e?"^$keys*="?php.ini;then? ???echo?"$key=$value"?>>?php.ini;? ??fi;? ?}? ?&&?base_dir=/home/docker/php? ?&&?set_php_variable?disable_functions?"dl,eval,assert,exec,popen,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open"? ?&&?set_php_variable?expose_php?off? ?&&?set_php_variable?error_log?${base_dir}/php_errors.log? ?&&?set_php_variable?request_order?"cgp"? ?&&?set_php_variable?cgi.fix_pathinfo?0? ?&&?set_php_variable?short_open_tag?on? ?&&?set_php_variable?date.timezone?asia/chongqing? ?&&?sed?-i?'s/^user?=.*/user?=?www-data/'?php-fpm.conf? ?&&?sed?-i?'s/^group?=.*/group?=?www-data/'?php-fpm.conf? ?&&?sed?-i?"s#;slowlog?=?log/$pool.log.slow#slowlog?=?${base_dir}/$pool.log.slow#"?php-fpm.conf? ?&&?sed?-i?'s/;request_slowlog_timeout?=?0/request_slowlog_timeout?=?5/'?php-fpm.conf? ?&&?sed?-i?'s/^pm.max_children.*/pm.max_children?=20/'?php-fpm.conf? ?&&?sed?-i?'s/^pm.start_servers.*/pm.start_servers?=5/'?php-fpm.conf? ?&&?sed?-i?'s/^pm.min_spare_servers.*/pm.min_spare_servers?=3/'?php-fpm.conf? ?&&?sed?-i?'s/^pm.max_spare_servers.*/pm.max_spare_servers?=8/'?php-fpm.conf? ?&&?sed?-i?'/[global]/adaemonize?=no'?php-fpm.conf? ?&&?sed?-i?'s/^listen.*/listen?=0.0.0.0:9000/'?php-fpm.conf? ?&&?echo?"[opcache]n? ???zend_extension=opcache.son? ???opcache.memory_consumption=128n? ???opcache.interned_strings_buffer=8n? ???opcache.max_accelerated_files=4000n? ???opcache.revalidate_freq=60n? ???opcache.fast_shutdown=1?n"?>>?php.ini ? entrypoint?["/usr/local/php/sbin/php-fpm"] ? expose?9000

mysql dockerfile

創建dockerfile/centos.bz/mysql/dockerfile文件,內容如下:

from?mysql:5.6 label?maintainer?"admin@centos.bz" copy?my.cnf?/etc/mysql/my.cnf

這個dockerfile非常簡單,直接使用了官方的mysql鏡像,唯一區別是我們使用自己定義的my.cnf配置文件。

對于my.cnf配置文件,需要把日志,data目錄指向/home/docker/mysql,一個my.cnf示例文件如下:

#?generated?by?ezhttp?at?2016-02-03?01:05:29 ? [mysql] ? #?client?# port???????=?3306 socket???????=?/home/docker/mysql/mysql.sock ? [mysqld] ? #?general?# port???????=?3306 user???????=?mysql default-storage-engine???=?innodb socket???????=?/home/docker/mysql/mysql.sock pid-file??????=?/home/docker/mysql/mysql.pid skip-name-resolve ? #?myisam?# key-buffer-size????=?32m ? #?innodb?# #innodb-flush-method???=?o_direct innodb-log-files-in-group??=?2 innodb-log-file-size???=?64m innodb-flush-log-at-trx-commit?=?2 innodb-file-per-table???=?1 innodb-buffer-pool-size??=?1g ? #?caches?and?limits?# tmp-table-size?????=?32m max-heap-table-size???=?32m query-cache-type????=?0 query-cache-size????=?0 max-connections????=?300 thread-cache-size????=?50 open-files-limit????=?1024 table-definition-cache???=?100 table-open-cache????=?400 ? ? #?safety?# max-allowed-packet????=?16m max-connect-errors????=?1000000 ? #?data?storage?# datadir??????=?/home/docker/mysql ? #?logging?# log-error??????=?/home/docker/mysql/mysql-error.log log-queries-not-using-indexes?=?1 slow-query-log?????=?1 slow-query-log-file???=?/home/docker/mysql/mysql-slow.log ? #?binary?logging?# log-bin?=?/home/docker/mysql/mysql-bin server-id?=?1 expire-logs-days?=?14 sync-binlog?=?1

構建鏡像

把上一步創建的文件推送到阿里云的kelude。然后我們登錄阿里云的docker鏡像倉庫cr.console.aliyun.com。這里以設置自動構建nginx鏡像為例,php和mysql鏡像構建設置類似。

1.點擊左側“鏡像列表”,在右側點擊倉庫鏡像,如圖:

如何用Docker搭建Nginx+PHP+MySQL環境并部署WordPress

2.在倉庫鏡像創建對話框中,說明如下:

地域:選擇離部署docker主機最近的位置,國內的話選擇華東1或華東2。

namespace和倉庫名稱:這里選擇centos-bz,nginx。

設置代碼源:我們這里選擇阿里云code。

構建設置:勾選代碼變更時自動構建鏡像,海外機器構建(因為國內主機apt-get安裝軟件時較慢),dockerfile路徑填/centos.bz/nginx

完成后點擊創建倉庫按鈕。

如圖:

如何用Docker搭建Nginx+PHP+MySQL環境并部署WordPress

3.回到鏡像列表,找到nginx鏡像,點擊管理。

4.左側點擊“構建”,右側點擊“立即構建”開始首次構建,之后我們更改dockerfile及配置文件到kelude之后就會自動構建了。

5.查看日志,查看構建進程。

然后繼續完成php,mysql的鏡像構建設置。

啟動環境

為了方便統一管理nginx,php,mysql的啟動,我們使用docker-compose工具。我們只需要編寫一個docker-compose.yml文件,然后使用docker-compose工具就可以快速啟動docker容器了。之后把docker-compose.yml傳輸到任意一臺支持docker環境的主機中就可以快速配置wordpress的運行環境。

docker-compose.yml

把docker-compose.yml文件放置在/home/docker目錄下。

version:?'3' #?定義三個服務nginx,php,mysql services: ?nginx: ??#?依賴php服務,意味著在啟動nginx之前先啟動php ??depends_on: ???-?php ??#?nginx鏡像的路徑 ??image:?registry.cn-hangzhou.aliyuncs.com/centos-bz/nginx ??#?容器的/home/docker/nginx目錄掛載主機中的/home/docker/nginx目錄, ??#?這樣使nginx容器把網站文件和目錄存放到主機目錄中,持久化和方便管理 ??volumes: ???-?/home/docker/nginx:/home/docker/nginx ??#?nginx意外退出時自動重啟 ??restart:?always ? ??#?映射80和443端口 ??ports: ???-?"80:80" ???-?"443:443" ? ??#?容器名稱 ??container_name:?nginx? ?php: ??depends_on: ???-?mysql ??image:?registry.cn-hangzhou.aliyuncs.com/centos-bz/php-fpm ??restart:?always ??volumes: ???-?/home/docker/nginx/www:/home/docker/nginx/www ???-?/home/docker/php:/home/docker/php ??container_name:?php? ? ?mysql: ??image:?registry.cn-hangzhou.aliyuncs.com/centos-bz/mysql ??volumes: ???-?/home/docker/mysql:/home/docker/mysql ??restart:?always ??#?設置mysql_root_password環境變量,這里是設置mysql的root密碼。這里為root。 ??environment: ???mysql_root_password:?root ??container_name:?mysql

啟動環境

在/home/docker目錄執行:

docker-compose?up

查看nginx,php,mysql是否正常啟動,如果正常,ctrl-c停止,再執行:

docker-compose?up?-d

這里compose命令就在后臺啟動了。

執行docker ps查看容器運行狀態。

連接問題

容器之間可以通過容器名稱來連接,如nginx配置文件中連接php的代碼fastcgi_pass php:9000,網站數據庫配置文件使用mysql:3306。

日常運維

?遷移

比如a主機遷移到b主機。只需要三步。

1.打包a主機的/home/docker目錄,傳輸到b主機相同位置

2.配置b主機docker環境

3.在b主機的/home/docker目錄下執行docker-compose up -d

導出導入數據庫

把centos.sql.gz數據庫文件導入到centos數據庫:

gunzip?<p>把centos數據庫導出到centos.sql.gz</p><pre class="brush:bash;">docker?exec?-i?mysql?mysqldump?-uroot?-proot?centos?|?gzip?&gt;?centos.sql.gz

備份

推薦使用ezhttp一鍵備份設置:

wget?centos.bz/ezhttp.zip unzip?ezhttp.zip cd?ezhttp-master ./start.sh

之后會彈出一個菜單,輸入2選擇some useful tools,然后輸入14選擇備份設置。需要注意的是在設置mysql使用mysqldump備份時,在提示輸入mysql bin directory時,輸入docker exec /usr/bin/。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享