如何用Docker搭建Nginx+PHP+MySQL环境并部署WordPress
今天小編給大家分享一下如何用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的一鍵安裝工具(推薦)安裝。如:
wgetcentos.bz/ezhttp.zip unzipezhttp.zip cdezhttp-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
fromdebian:jessie
#聲明此dockerfile維護者的郵箱,有什么問題可以發到此郵件尋問
labelmaintainer"admin@centos.bz"
#定義軟件版本及編譯工具變量
envnginx_version1.10.3
envopenssl_version1.0.2h
envzlib_version1.2.11
envpcre_version8.40
envconcat_version1.2.2
envbuild_toolswgetgccmakeg++
envsrc_dir/opt/nginx
#切換到工作目錄
workdir${src_dir}
#開始編譯nginx,我們這里使用編譯安裝nginx而不是使用官方提供的nginx鏡像是因為這里使用到了第三方的concat模塊,只能編譯了。
#把所有的安裝命令都寫在一個run指令中是因為這樣可以減小鏡像層數,縮減鏡像大小。推薦使用反斜杠和&&把所有的安裝命令放置到一行中。
runapt-getupdate\
&&apt-get-y--no-install-recommendsinstallca-certificates${build_tools}\
&&wgethttp://nginx.org/download/nginx-${nginx_version}.tar.gz\
&&wgethttps://www.openssl.org/source/openssl-${openssl_version}.tar.gz\
&&wgethttp://www.zlib.net/zlib-${zlib_version}.tar.gz\
&&wgethttps://ftp.pcre.org/pub/pcre/pcre-${pcre_version}.tar.gz\
&&wgethttps://github.com/alibaba/nginx-http-concat/archive/${concat_version}.tar.gz-onginx-http-concat-${concat_version}.tar.gz\
&&tarxfnginx-${nginx_version}.tar.gz\
&&tarxfopenssl-${openssl_version}.tar.gz\
&&tarxfzlib-${zlib_version}.tar.gz\
&&tarxfpcre-${pcre_version}.tar.gz\
&&tarxfnginx-http-concat-${concat_version}.tar.gz\
&&cdnginx-${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)\
&&makeinstall\
&&rm-rf${src_dir}\
&&apt-getpurge-y--auto-remove${build_tools}\
&&rm-rf/var/lib/apt/lists/*
#把構建上下文目錄conf,即dockerfile/centos.bz/nginx/conf目錄下的文件復制到容器的/usr/local/nginx/conf目錄。
copyconf//usr/local/nginx/conf/
#定義啟動容器時運行的命令
entrypoint["/usr/local/nginx/sbin/nginx"]
expose80443
對于conf目錄下的nginx配置文件,需要把日志,網站目錄更改為以下約定的目錄位置。
php-fpm dockerfile
創建dockerfile/centos.bz/php-fpm目錄,在此目錄下創建dockerfile文件,內容如下:
fromdebian:jessie
labelmaintainer"admin@centos.bz"
#定義軟件版本,編譯工具,依賴等變量
envphp_version5.6.30
envbuild_toolsm4\
autoconf\
autoconf2.13\
openssl\
wget\
gcc\
make
envbuild_depslibcurl4-gnutls-dev\
libxml2-dev\
zlib1g-dev\
libpcre3-dev\
libjpeg-dev\
libpng12-dev\
libfreetype6-dev\
libmhash-dev\
libmcrypt-dev\
libssl-dev\
libtool
envphp_location/usr/local/php
envbuild_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
envsrc_dir/opt/php
workdir${src_dir}
#開始編譯安裝php
runapt-getupdate\
&&apt-get-y--no-install-recommendsinstall${build_deps}${build_tools}\
&&wgethttp://php.net/distributions/php-${php_version}.tar.gz\
&&tarxfphp-${php_version}.tar.gz\
&&cdphp-${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)\
&&makeinstall\
&&cpphp.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-getpurge-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相關配置命令不與上面的編譯命令合在一起來減小層數是因為
#配置文件可能會改動比較多,這樣分開當配置文件更改時可以直接使用緩存跳過編譯步驟,加快構建速度。
runset_php_variable(){\
localkey=$1;\
localvalue=$2;\
ifgrep-q-e"^$key\s*="php.ini;then\
sed-i-r"s#^$key\s*=.*#$key=$value#"php.ini;\
else\
sed-i-r"s#;\s*$key\s*=.*#$key=$value#"php.ini;\
fi;\
if!grep-q-e"^$key\s*="php.ini;then\
echo"$key=$value">>php.ini;\
fi;\
}\
&&base_dir=/home/docker/php\
&&set_php_variabledisable_functions"dl,eval,assert,exec,popen,system,passthru,shell_exec,escapeshellarg,escapeshellcmd,proc_close,proc_open"\
&&set_php_variableexpose_phpoff\
&&set_php_variableerror_log${base_dir}/php_errors.log\
&&set_php_variablerequest_order"cgp"\
&&set_php_variablecgi.fix_pathinfo0\
&&set_php_variableshort_open_tagon\
&&set_php_variabledate.timezoneasia/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\]/a\daemonize=no'php-fpm.conf\
&&sed-i's/^listen.*/listen=0.0.0.0:9000/'php-fpm.conf\
&&echo"[opcache]\n\
zend_extension=opcache.so\n\
opcache.memory_consumption=128\n\
opcache.interned_strings_buffer=8\n\
opcache.max_accelerated_files=4000\n\
opcache.revalidate_freq=60\n\
opcache.fast_shutdown=1\n">>php.ini
entrypoint["/usr/local/php/sbin/php-fpm"]
expose9000
mysql dockerfile
創建dockerfile/centos.bz/mysql/dockerfile文件,內容如下:
frommysql:5.6 labelmaintainer"admin@centos.bz" copymy.cnf/etc/mysql/my.cnf
這個dockerfile非常簡單,直接使用了官方的mysql鏡像,唯一區別是我們使用自己定義的my.cnf配置文件。
對于my.cnf配置文件,需要把日志,data目錄指向/home/docker/mysql,一個my.cnf示例文件如下:
#generatedbyezhttpat2016-02-0301: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 #cachesandlimits# 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 #datastorage# 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 #binarylogging# 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.點擊左側“鏡像列表”,在右側點擊倉庫鏡像,如圖:
2.在倉庫鏡像創建對話框中,說明如下:
地域:選擇離部署docker主機最近的位置,國內的話選擇華東1或華東2。
namespace和倉庫名稱:這里選擇centos-bz,nginx。
設置代碼源:我們這里選擇阿里云code。
構建設置:勾選代碼變更時自動構建鏡像,海外機器構建(因為國內主機apt-get安裝軟件時較慢),dockerfile路徑填/centos.bz/nginx
完成后點擊創建倉庫按鈕。
如圖:
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-composeup
查看nginx,php,mysql是否正常啟動,如果正常,ctrl-c停止,再執行:
docker-composeup-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<centos.sql.gz|dockerexec-imysqlmysql-uroot-prootcentos
把centos數據庫導出到centos.sql.gz
dockerexec-imysqlmysqldump-uroot-prootcentos|gzip>centos.sql.gz
備份
推薦使用ezhttp一鍵備份設置:
wgetcentos.bz/ezhttp.zip unzipezhttp.zip cdezhttp-master ./start.sh
之后會彈出一個菜單,輸入2選擇some useful tools,然后輸入14選擇備份設置。需要注意的是在設置mysql使用mysqldump備份時,在提示輸入mysql bin directory時,輸入docker exec /usr/bin/。
總結
以上是生活随笔為你收集整理的如何用Docker搭建Nginx+PHP+MySQL环境并部署WordPress的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux unshare命名的一些例子
- 下一篇: 医疗保险怎么缴费网上