您在這裡

使用Nginx+Docker 打造多個Drupal容器的彈性環境

圖片來自於Using nginx as reverse proxy (for containered Ghost)

前言

Docker是一個現在最火紅的輕量級虛擬化技術,如何將Docker運用在自己的伺服器,並且提供服務給所有的客戶更是重要的學問,這篇文章主要是分享如何使用Nginx Reverse Proxy搭配Docker容器,來建立以Docker為Based的伺服器環境。若您還不熟悉Docker,可以參考這兩篇文章教你一次學會安裝 Docker 開始玩轉 Container 容器世界今天開始Drupal環境就用Docker Container來建立,相信在閱讀這篇文章時,可以更清楚與明白。

基本環境

這裡介紹的環境為Ubuntu16.04與Ubuntu14.04,並且Docker環境已經安裝完畢的狀況下,若您還不會安裝Docker,可以參考官方的教學文章如何安裝Docker。這裡也可以使用直接提供好的Docker環境。例如:Rancher OS、Azure提供的Ubuntu+Docker環境等等均可。

需要的影像檔

由於要建立一個Drupal環境,所需要的包涵了以下兩個主要環境。1. 網頁伺服器WebServer。 2. 資料庫 Database。 因此,在這裡請跟著小編一起下載以下這兩個影像檔。Docker語法的部分這裡就不多做詳細說明了,在今天開始Drupal環境就用Docker Container來建立都有詳細的介紹。

1.網頁伺服器

這個部分可以直接使用Drupal官方的倉庫Pull下來。Drupal的官方公共倉庫裡面提供了不同網頁伺服器跟Drupal最新的版本影像檔,可以供您直接選擇。

語法如下:

$ docker pull drupal:tag

若這裡要使用Nginx+Drupal7.53的伺服器環境,則下載影像檔就可以使用

$ docker pull drupal:7.53-fpm

2.資料庫

資料庫的部分Drupal支援多種資料庫格式,當然最常用的還是MySql囉,Mysql官方也是有提供Docker的官方倉庫,可以直接Pull下來。

語法如下:

$ docker pull mysql:tag

這裡的Tag可以換成自己想要的版本,詳細的版本請參考這裡,若這裡要下載的是5.7.16,則可以使用下方的語法來下載。

$ docker pull mysql:5.7.16

建立容器

有了影像檔之後,當然就要開始建立容器來作為基本服務囉。首先需要先建立資料庫的容器,作為Drupal的資料庫。

建立Mysql容器

這裡建立一個以版本為5.7.16的Mysql容器作為服務,並且將這個容器命名為mysql-5-7。

$ docker run --name mysql-5-7 --restart always -v /home/hellosanta/mysql/conf:/etc/mysql/conf.d -v /home/hellosanta/mysql/db:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw -d mysql:5.7.16

參數說明

  • name:可以針對容器來取名字,這個名字可以用在容器與容器之間。
  • restart:這個參數當下always的時候,可以在重新開機的時候,容器可以自動開啟,在以容器來建立Drupal環境的狀況下,這個參數是很重要的。
  • v:利用這個參數,可以將Mysql的資料庫與設定檔同步出來
  • e:設定Mysql的密碼

備註:若需要更詳細的資料,可以參考Mysql的官方Hub

建立Drupal容器

這裡建立二個Drupal環境的容器,分別為不同的Drupal網站。這裡需要特別注意,需要將這個容器連結到Mysql的容器,並且要將本機的Port分別指到容器的80Port。

第一個Drupal網站

$ docker run --name my-first-drupal --link mysql-5-7:mysql -p 127.0.0.1:8000:80 -d drupal:7.53-fpm

第二個Drupal網站

$ docker run --name my-second-drupal --link mysql-5-7:mysql -p 127.0.0.1:9000:80 -d drupal:7.53-fpm

參數說明

  • link:這個參數可以將兩個容器連結,在Drupal的容器內,可以直接打mysql就連線到mysql-5-7這個容器IP
  • p:這個主要是將主機的Port對應到container的port,為了要讓一台主機,可以連線多個容器,這裡需要搭配本機的不同port來指到容器的80port。因此,這裡將本機的8000 port對應到第一個Drupal網站的80port,而9000 port對應到第二個Drupal網站。

今天開始Drupal環境就用Docker Container來建立這篇文章裡,是使用本機的80port指到容器的80port,這裡需要更換才行。

建立Nginx環境

這裡假設您的本機已經安裝完畢Ngxin環境,若您尚未安裝完畢,可以考慮用以下語法,或參考Nginx的官方安裝教學

安裝最新Nginx語法

$  sudo apt-get install software-properties-common python-software-properties  -y
$  sudo apt-get install python-software-properties -y
$  sudo add-apt-repository ppa:nginx/stable -y
$  sudo apt-get update -y
$  sudo apt-get upgrade -y
$  sudo apt-get install nginx  -y

建立Nginx Reverse Proxy

由於一台伺服器,往往需要放不只一個網站,過去會使用Virtual Host來將不同的Domain來指到對應的網站資料夾,這裡則使用Nginx Reverse Proxy來處理不同domain指到對應的容器。

Step1.建立Domain設定檔
在Nginx的設定裡,要建立不同Domain的設定檔是要在【/etc/nginx/conf.d】下建立,這裡因為要連線到兩個不同的網站。所以建立兩個設定檔案。如果網址為drupal1.tw 與 drupal2.tw這兩個網址,設定檔可以分別建立為drupal1.tw.confdrupal2.tw.conf

Step2.設定檔內容撰寫

  • drupal1.tw.conf 內容
server {
    listen 80;
    server_name drupal1.tw;
    proxy_connect_timeout       300;
    proxy_send_timeout          300;
    proxy_read_timeout          300;
    send_timeout                300;
    location ~ / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
         ##這裡將drupal1.tw網址,導入到本機的8000port
        proxy_pass http://127.0.0.1:8000;
    }
}
  • drupal2.tw.conf 內容
server {
    listen 80;
    server_name drupal2.tw;
    proxy_connect_timeout       300;
    proxy_send_timeout          300;
    proxy_read_timeout          300;
    send_timeout                300;
    location ~ / {
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header Host $http_host;
        proxy_set_header X-NginX-Proxy true;
         ##這裡將drupal1.tw網址,導入到本機的8000port
        proxy_pass http://127.0.0.1:9000;
    }
}

Step3. 重新啟動 Nginx

$ sudo service nginx reload

若您也順利走到了這一步,重新啟動之後,就可以讓不同網址,連線到不同的container了。

結論

通過了Nginx Reverse Proxy的特性,可以讓我們輕鬆的連線到不同的Drupal容器,並且可以享受到每個容器自己的獨立性,用這種方式來打造伺服器環境,不僅輕巧,更是彈性。若有其他更好的想法與建議,歡迎大家一起討論,一起打造一個彈性的伺服器環境吧。