十二月 19, 2016 | 伺服器和Devops
使用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.conf與drupal2.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容器,並且可以享受到每個容器自己的獨立性,用這種方式來打造伺服器環境,不僅輕巧,更是彈性。若有其他更好的想法與建議,歡迎大家一起討論,一起打造一個彈性的伺服器環境吧。