天天看點

如何在 Docker 容器中架設一個完整的 WordPress 站點

今天,我們會在 docker 容器上部署最新的 wordpress 軟體包,包括需要的前提條件,例如 nginx web 伺服器、php5、mariadb 伺服器等。下面是在運作在 docker 容器上成功安裝 wordpress 的簡單步驟。

<a target="_blank"></a>

在我們真正開始之前,我們需要確定在我們的 linux 機器上已經安裝了 docker。我們使用的主機是 centos 7,是以我們用下面的指令使用 yum 管理器安裝 docker。

<code># yum install docker</code>

如何在 Docker 容器中架設一個完整的 WordPress 站點

安裝 docker

<code># systemctl restart docker.service</code>

我們需要建立用于自動安裝 wordpress 以及其前置需求的 dockerfile。這個 dockerfile 将用于建構 wordpress 的安裝鏡像。這個 wordpress dockerfile 會從 docker registry hub 擷取 centos 7 鏡像并用最新的可用更新更新系統。然後它會安裝必要的軟體,例如 nginx web 伺服器、php、mariadb、open ssh 伺服器,以及其它保證 docker 容器正常運作不可缺少的元件。最後它會執行一個初始化 wordpress 安裝的腳本。

<code># nano dockerfile</code>

然後,我們需要将下面的配置行添加到 dockerfile中。

<code>from centos:centos7</code>

<code>maintainer the centos project &lt;[email protected]&gt;</code>

<code></code>

<code>run yum -y update; yum clean all</code>

<code>run yum -y install epel-release; yum clean all</code>

<code>run yum -y install mariadb mariadb-server mariadb-client nginx php-fpm php-cli php-mysql php-gd php-imap php-ldap php-odbc php-pear php-xml php-xmlrpc php-magickwand php-magpierss php-mbstring php-mcrypt php-mssql php-shout php-snmp php-soap php-tidy php-apc pwgen python-setuptools curl git tar; yum clean all</code>

<code>add ./start.sh /start.sh</code>

<code>add ./nginx-site.conf /nginx.conf</code>

<code>run mv /nginx.conf /etc/nginx/nginx.conf</code>

<code>run rm -rf /usr/share/nginx/html/*</code>

<code>run /usr/bin/easy_install supervisor</code>

<code>run /usr/bin/easy_install supervisor-stdout</code>

<code>add ./supervisord.conf /etc/supervisord.conf</code>

<code>run echo %sudo all=nopasswd: all &gt;&gt; /etc/sudoers</code>

<code>add http://wordpress.org/latest.tar.gz /wordpress.tar.gz</code>

<code>run tar xvzf /wordpress.tar.gz</code>

<code>run mv /wordpress/* /usr/share/nginx/html/.</code>

<code>run chown -r apache:apache /usr/share/nginx/</code>

<code>run chmod 755 /start.sh</code>

<code>run mkdir /var/run/sshd</code>

<code>expose 80</code>

<code>expose 22</code>

<code>cmd ["/bin/bash", "/start.sh"]</code>

如何在 Docker 容器中架設一個完整的 WordPress 站點

wordpress docker 檔案

我們建立了 dockerfile 之後,我們需要建立用于運作和配置 wordpress 安裝的腳本,名稱為 start.sh。它會為 wordpress 建立并配置資料庫和密碼。用我們喜歡的文本編輯器打開 start.sh。

<code># nano start.sh</code>

打開 start.sh 之後,我們要添加下面的配置行到檔案中。

<code>#!/bin/bash</code>

<code>__check() {</code>

<code>if [ -f /usr/share/nginx/html/wp-config.php ]; then</code>

<code>exit</code>

<code>fi</code>

<code>}</code>

<code>__create_user() {</code>

<code># 建立用于 ssh 登入的使用者</code>

<code>ssh_userpass=`pwgen -c -n -1 8`</code>

<code>useradd -g wheel user</code>

<code>echo user:$ssh_userpass | chpasswd</code>

<code>echo ssh user password: $ssh_userpass</code>

<code>__mysql_config() {</code>

<code># 啟用并運作 mysql</code>

<code>yum -y erase mariadb mariadb-server</code>

<code>rm -rf /var/lib/mysql/ /etc/my.cnf</code>

<code>yum -y install mariadb mariadb-server</code>

<code>mysql_install_db</code>

<code>chown -r mysql:mysql /var/lib/mysql</code>

<code>/usr/bin/mysqld_safe &amp;</code>

<code>sleep 10</code>

<code>__handle_passwords() {</code>

<code># 在這裡我們生成随機密碼(多虧了 pwgen)。前面兩個用于 mysql 使用者,最後一個用于 wp-config.php 的随機密鑰。</code>

<code>wordpress_db="wordpress"</code>

<code>mysql_password=`pwgen -c -n -1 12`</code>

<code>wordpress_password=`pwgen -c -n -1 12`</code>

<code># 這是在日志中顯示的密碼。</code>

<code>echo mysql root password: $mysql_password</code>

<code>echo wordpress password: $wordpress_password</code>

<code>echo $mysql_password &gt; /mysql-root-pw.txt</code>

<code>echo $wordpress_password &gt; /wordpress-db-pw.txt</code>

<code># 這裡原來是一個包括 sed、cat、pipe 和 stuff 的很長的行,但多虧了</code>

<code># @djfiander 的 https://gist.github.com/djfiander/6141138</code>

<code># 現在沒有了</code>

<code>sed -e "s/database_name_here/$wordpress_db/</code>

<code>s/username_here/$wordpress_db/</code>

<code>s/password_here/$wordpress_password/</code>

<code>/'auth_key'/s/put your unique phrase here/`pwgen -c -n -1 65`/</code>

<code>/'secure_auth_key'/s/put your unique phrase here/`pwgen -c -n -1 65`/</code>

<code>/'logged_in_key'/s/put your unique phrase here/`pwgen -c -n -1 65`/</code>

<code>/'nonce_key'/s/put your unique phrase here/`pwgen -c -n -1 65`/</code>

<code>/'auth_salt'/s/put your unique phrase here/`pwgen -c -n -1 65`/</code>

<code>/'secure_auth_salt'/s/put your unique phrase here/`pwgen -c -n -1 65`/</code>

<code>/'logged_in_salt'/s/put your unique phrase here/`pwgen -c -n -1 65`/</code>

<code>/'nonce_salt'/s/put your unique phrase here/`pwgen -c -n -1 65`/" /usr/share/nginx/html/wp-config-sample.php &gt; /usr/share/nginx/html/wp-config.php</code>

<code>__httpd_perms() {</code>

<code>chown apache:apache /usr/share/nginx/html/wp-config.php</code>

<code>__start_mysql() {</code>

<code># systemctl 啟動 mysqld 服務</code>

<code>mysqladmin -u root password $mysql_password</code>

<code>mysql -uroot -p$mysql_password -e "create database wordpress; grant all privileges on wordpress.* to 'wordpress'@'localhost' identified by '$wordpress_password'; flush privileges;"</code>

<code>killall mysqld</code>

<code>__run_supervisor() {</code>

<code>supervisord -n</code>

<code># 調用所有函數</code>

<code>__check</code>

<code>__create_user</code>

<code>__mysql_config</code>

<code>__handle_passwords</code>

<code>__httpd_perms</code>

<code>__start_mysql</code>

<code>__run_supervisor</code>

如何在 Docker 容器中架設一個完整的 WordPress 站點

啟動腳本

增加完上面的配置之後,儲存并關閉檔案。

現在,我們需要建立 nginx web 伺服器的配置檔案,命名為 nginx-site.conf。

<code># nano nginx-site.conf</code>

然後,增加下面的配置資訊到配置檔案。

<code>user nginx;</code>

<code>worker_processes 1;</code>

<code>error_log /var/log/nginx/error.log;</code>

<code>#error_log /var/log/nginx/error.log notice;</code>

<code>#error_log /var/log/nginx/error.log info;</code>

<code>pid /run/nginx.pid;</code>

<code>events {</code>

<code>worker_connections 1024;</code>

<code>http {</code>

<code>include /etc/nginx/mime.types;</code>

<code>default_type application/octet-stream;</code>

<code>log_format main '$remote_addr - $remote_user [$time_local] "$request" '</code>

<code>'$status $body_bytes_sent "$http_referer" '</code>

<code>'"$http_user_agent" "$http_x_forwarded_for"';</code>

<code>access_log /var/log/nginx/access.log main;</code>

<code>sendfile on;</code>

<code>#tcp_nopush on;</code>

<code>#keepalive_timeout 0;</code>

<code>keepalive_timeout 65;</code>

<code>#gzip on;</code>

<code>index index.html index.htm index.php;</code>

<code># load modular configuration files from the /etc/nginx/conf.d directory.</code>

<code># see http://nginx.org/en/docs/ngx_core_module.html#include</code>

<code># for more information.</code>

<code>include /etc/nginx/conf.d/*.conf;</code>

<code>server {</code>

<code>listen 80;</code>

<code>server_name localhost;</code>

<code>#charset koi8-r;</code>

<code>#access_log logs/host.access.log main;</code>

<code>root /usr/share/nginx/html;</code>

<code>#error_page 404 /404.html;</code>

<code># redirect server error pages to the static page /50x.html</code>

<code>#</code>

<code>error_page 500 502 503 504 /50x.html;</code>

<code>location = /50x.html {</code>

<code>root html;</code>

<code># proxy the php scripts to apache listening on 127.0.0.1:80</code>

<code>#location ~ \.php$ {</code>

<code># proxy_pass http://127.0.0.1;</code>

<code>#}</code>

<code># pass the php scripts to fastcgi server listening on 127.0.0.1:9000</code>

<code>location ~ \.php$ {</code>

<code>try_files $uri =404;</code>

<code>fastcgi_pass 127.0.0.1:9000;</code>

<code>fastcgi_index index.php;</code>

<code>fastcgi_param script_filename $document_root$fastcgi_script_name;</code>

<code>include fastcgi_params;</code>

<code># deny access to .htaccess files, if apache's document root</code>

<code># concurs with nginx's one</code>

<code>#location ~ /\.ht {</code>

<code># deny all;</code>

如何在 Docker 容器中架設一個完整的 WordPress 站點

nginx 配置

現在,建立 supervisor.conf 檔案并添加下面的行。

<code># nano supervisord.conf</code>

然後,添加以下行。

<code>[unix_http_server]</code>

<code>file=/tmp/supervisor.sock ; (the path to the socket file)</code>

<code>[supervisord]</code>

<code>logfile=/tmp/supervisord.log ; (main log file;default $cwd/supervisord.log)</code>

<code>logfile_maxbytes=50mb ; (max main logfile bytes b4 rotation;default 50mb)</code>

<code>logfile_backups=10 ; (num of main logfile rotation backups;default 10)</code>

<code>loglevel=info ; (log level;default info; others: debug,warn,trace)</code>

<code>pidfile=/tmp/supervisord.pid ; (supervisord pidfile;default supervisord.pid)</code>

<code>nodaemon=false ; (start in foreground if true;default false)</code>

<code>minfds=1024 ; (min. avail startup file descriptors;default 1024)</code>

<code>minprocs=200 ; (min. avail process descriptors;default 200)</code>

<code>; the below section must remain in the config file for rpc</code>

<code>; (supervisorctl/web interface) to work, additional interfaces may be</code>

<code>; added by defining them in separate rpcinterface: sections</code>

<code>[rpcinterface:supervisor]</code>

<code>supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface</code>

<code>[supervisorctl]</code>

<code>serverurl=unix:///tmp/supervisor.sock ; use a unix:// url for a unix socket</code>

<code>[program:php-fpm]</code>

<code>command=/usr/sbin/php-fpm -c /etc/php/fpm</code>

<code>stdout_events_enabled=true</code>

<code>stderr_events_enabled=true</code>

<code>[program:php-fpm-log]</code>

<code>command=tail -f /var/log/php-fpm/php-fpm.log</code>

<code>[program:mysql]</code>

<code>command=/usr/bin/mysql --basedir=/usr --datadir=/var/lib/mysql --plugin-dir=/usr/lib/mysql/plugin --user=mysql --log-error=/var/log/mysql/error.log --pid-file=/var/run/mysqld/mysqld.pid --socket=/var/run/mysqld/mysqld.sock --port=3306</code>

<code>[program:nginx]</code>

<code>command=/usr/sbin/nginx</code>

<code>[eventlistener:stdout]</code>

<code>command = supervisor_stdout</code>

<code>buffer_size = 100</code>

<code>events = process_log</code>

<code>result_handler = supervisor_stdout:event_handler</code>

如何在 Docker 容器中架設一個完整的 WordPress 站點

supervisord 配置

添加完後,儲存并關閉檔案。

現在,完成了建立配置檔案和腳本之後,我們終于要使用 dockerfile 來建立安裝最新的 wordpress cms(譯者注:content management system,内容管理系統)所需要的容器,并根據配置檔案進行配置。做到這點,我們需要在對應的目錄中運作以下指令。

<code># docker build --rm -t wordpress:centos7 .</code>

如何在 Docker 容器中架設一個完整的 WordPress 站點

建構 wordpress 容器

現在,執行以下指令運作新建構的容器,并為 nginx web 伺服器和 ssh 通路打開88 和 22号相應端口 。

<code># cid=$(docker run -d -p 80:80 wordpress:centos7)</code>

如何在 Docker 容器中架設一個完整的 WordPress 站點

運作 wordpress docker

運作以下指令檢查程序以及容器内部執行的指令。

<code># echo "$(docker logs $cid )"</code>

運作以下指令檢查端口映射是否正确。

<code># docker ps</code>

如何在 Docker 容器中架設一個完整的 WordPress 站點

docker 狀态

如何在 Docker 容器中架設一個完整的 WordPress 站點

啟動wordpress

現在,我們将通過 web 界面為 wordpress 面闆設定 wordpress 的配置、使用者名和密碼。

如何在 Docker 容器中架設一個完整的 WordPress 站點

wordpress 歡迎界面

然後,用上面使用者名和密碼輸入到 wordpress 登入界面。

如何在 Docker 容器中架設一個完整的 WordPress 站點

wordpress 登入

我們已經成功地在以 centos 7 作為 docker os 的 lemp 棧上建構并運作了 wordpress cms。從安全層面來說,在容器中運作 wordpress 對于宿主系統更加安全可靠。這篇文章介紹了在 docker 容器中運作的 nginx web 伺服器上使用 wordpress 的完整配置。如果你有任何問題、建議、回報,請在下面的評論框中寫下來,讓我們可以改進和更新我們的内容。非常感謝!enjoy :-)

<b></b>

<b>原文釋出時間為:2015-06-03</b>

<b>本文來自雲栖社群合作夥伴“linux中國”</b>