您在這裡

Docker-Compose將Drupal網站跟環境設定一次搞定

(圖片來自於:http://activelamp.com/blog/devops/drupal-8-development-in-docker-redux/)

前言

由於不管是開發環境還是正式一直以來都是麻煩要處理的問題,尤其是處理伺服器的環境,若是用別人處理好的還好,若要自己處理,每次都要面臨什麼套件要安裝,什麼套件不安裝,安裝了以後,有用的套件當然好,但不好的該如何?要移除嗎?移除之後也不知道伺服器是否有問題,很頭大很頭大。那麼剛好,由於docker的特性,方便我們建立、移除、搬移,所以這篇文章想說來分享一下,如何搭配Docker-compose來將網站環境一次搞定。

安裝docker

這個部分可以直接參考docker官方的教學文件,裡面有提到如何在各種作業系統上面安裝,當然很佛心的現在也支援Windows了:)

安裝Docker-compose

docker-compose主要是一個控制容器的工具,可以讓我們通過一個簡單的yml設定檔案,就可以通過docker-compose的指令,一次控制多個容器,這裡我就跳過了docker-compose的相關介紹了,如果說有人有興趣瞭解docker-compose的相關介紹,可以參考以下官方文件。以下簡單帶過安裝過程。

第一步: 下載

curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

第二步:給予執行權限

sudo chmod +x /usr/local/bin/docker-compose

概念

Drupal是非常強大的工具,但開發的環境還有正式的環境,對於做網站來說,是不想理他又不行的議題。因此,如果利用docker-compose的來寫一個drupal的環境配置,再加上好的資料夾結構,就可以做到環境還有資料庫全部帶者走,不僅方便備份,更方便升級,當然,再不同工程師之間開發,更不用擔心環境不一樣的問題了。

第一步:一個資料夾全部東西放裡面

建立一個資料夾(這裡以drupal資料夾為例),配置如下:

  1. conf資料夾:
    裡面主要是放作業系統環境需要的設定檔案,例如:Nginx設定檔案、Apache設定檔案、Mysql設定檔案等等

  2. mysql資料夾: 這個裡面主要是放所有的資料庫。

  3. www資料夾: 這個裡面主要放所有的程式,也就是一堆php檔案。

  4. docker-compose.yml 檔案 這個檔案就是裡面最重要的檔案,裡面會描述所有需要用的伺服器資源還有版本設定(都是從docker hub上抓下來),所以完全不用自己安裝,超輕鬆Der,下面介紹怎麼寫。

第二步: 撰寫docker-compose.yml

寫yml的格式個人覺得是非常的龜毛,多一個空白少一個空白都會出錯,沒法執行。不過好處是,有工程師開發了yml validator,可以直接拿來使用,看看是否有問題。

  • docker-compose.yml
version: "2"
services:
  web:
    image:  nginx:1.13 
    ports:
      - "80:80"
    volumes:
      - ./www:/var/www/html/
      - ./conf/site.conf:/etc/nginx/conf.d/site.conf
    links:
      - php
  php:
    image: hellosanta/php4drupal:php7.0-fpm
    volumes:
      - ./www:/var/www/html/
    restart: always
    links:
      - db
  db:
    image: mysql:5.7.18
    volumes:
      - ./mysql/db:/var/lib/mysql
    environment:
      - MYSQL_USER=drupal
      - MYSQL_PASSWORD=drupal
      - MYSQL_DATABASE=drupal
      - MYSQL_ROOT_PASSWORD=drupal

上面的寫法主要分成三個部分,第一個部分是針對Webserver的部分,這裡是使用Nginx的映像檔,讓Nginx來跑我放在drupal資料夾裡面的www。然後預設將系統的80port對應到這個容器服務的80port。

第二部分則是php的服務,由於也是要跑這個資料夾裡面的程式檔案,因此,在Volumes的部分就將www一樣同步進去對應的資料夾,並且將php這個服務跟底下的資料庫服務進行連結。

最後一個部分就是資料庫的描述檔案囉,我將所有的資料庫,全部寫到drupal這個資料夾裡面的mysql資料夾。

上述配置都好了以後,恭喜啦,一切就緒

最後一步: 一句指令所有環境一切就緒

接下來只需要打docker-compose的指令就一切都安裝起來囉。

啟動

docker-compose up -d

下面附上可能需要用到的其他指令:

停止

docker-compose stop

停止加上移除容器

docker-compose down

切換版本/打包 以秒計算

今天若是用docker-compose.yml來處理環境的話,很方便的就是所有環境的設定都在yml裡面撰寫,所以今天如果要切換php版本或nginx版本或mysql版本。只需要把tag進行更改,重新啟動即可。(例如:nginx:1.12 -> nginx:1.13)

另外,打包整個環境包含資料庫超級簡單,由於全部都在drupal這個資料夾中,所以可以直接用tar打包,帶走唷~

結論

由於docker的特性,讓環境建立變得非常容易,再加上用容器的效能已經接近原生的程式了,所以當然要使用docker來建立所有的drupal環境囉。用上述的寫法不僅方便測試不同環境跟升級,更能夠在備份上面容易許多。工程師間的開發,也可以因此解決很多環境間的同步問題,是個不錯的解決方法囉。給大家參考~