建置一個開發Web服務用的Docker環境 (I)

當我們要開發一個Web服務時,前後端通常會切割成不同的Service
例如,前端採用Angular;後端則是WildFly(前身為JBoss)跟MariaDB
未來如果有其他服務要新增
開發者就要在自有主機或VM上面架設對應的環境
不僅如此,開發中一旦檔案損毀或改錯需重新建構也是一大工程
因此,Docker等容器化技術就是在改善這類問題以減少開發者的負擔
也會有需要客製化Image的時候,就會需要撰寫Dockerfile
現在我們就以上述的情境來設計我們的Docker開發環境
Docker與專案開發的目錄結構如下
  • DockerProject
    主要是控制容器間的溝通邏輯
    .env主要是放一些容器間共用的參數或設定檔
    docker-compose.yml 設定檔大致如下
    version: "3.3"
    services:
      jboss-backend:
        image: jboss/wildfly:ytTest
        container_name: 'jboss_Backend'
        env_file: .env
        ports:
          - 8080:8080
        volumes:
          - ./JBoss:/${JBOSS_WORKING_DIR}
          - web-dist-volume:/opt/jboss/wildfly/angular-dist
        working_dir: /${JBOSS_WORKING_DIR}
    
      jenkins:
        image: jenkins/jenkins:ytTest
        container_name: 'jenkins'
        env_file: .env
        ports:
          - "18080:8080"
          - "50000:50000"
        volumes:
          - ./Jenkins:/${JENKINS_WORKING_DIR}
          - web-dist-volume:/angular-dist
        working_dir: /${JENKINS_WORKING_DIR}
    
      db:
        image: mariadb
        container_name: 'maria_db'
        env_file: .env
        environment:
          MYSQL_ROOT_PASSWORD: ${DB_ROOT_PASSWORD}
        ports:
          - 3306:3306
        restart: always
        volumes:
          - ./MariaDB:/${MARIADB_WORKING_DIR}
        working_dir: /${MARIADB_WORKING_DIR}
    
    volumes:
      web-dist-volume:
    
    services下就是要描述各容器的設定檔
    外層的volumes我們是用來宣告共用目錄的名字,並非DockerProject下的目錄
    主要參數說明:
    image:該容器要使用的image,此欄位必填。<NAME>:<TAG>,ytTest是我們自己建的image
    container_name:容器運行時的名稱,透過指令加這名稱可以進入容器操作
    env_file:該容器要參照的環境變數檔案
    envireonment:環境變數的 Key,Value,也可整併到.env裡面
    ports:要轉出docker machine與對應得容器port。<EXPOSE_PORT>:<CONTAINER_PORT>
    volumes:本地端與容器端要共用的目錄。<LOCAL_DIR>:<CONTAINER_DIR>
    working_dir:進入容器後的起始目錄,注意這並不一定等於容器的$HOME目錄
    為便於開發,我們有裝一些DBMS(e.g., phpmyadmin)串接MariaDB,但在這先聚焦主要元件
  • JBoss
    內部設定可以參考之前說的Docker Container 檔案共享,用來設定與Jenkins的共用目錄
  • MariaDB
    用來新增預設的使用者帳密、初始化資料庫與Schema
  • Jenkins
    主要是用來協助我們開發中甚至未來持續整合與發佈用的,Job的建置可以參考這篇
    .ssh/ 目錄裡頭放的是一個唯獨Repositories的ssh key供jenkins使用。沒有push code的權限
    plugins.txt 主要是用來宣告要預先安裝的套件,細節在這裡有討論到
    backup.tar.gz
      這類檔案除了備份用途,換句話說也是儲存Jenkins的狀態
      就能讓我們客製化image,不需要重新設定使用者資訊、Job等等,細節我們會在下一篇談
  • 前後端程式碼
    為了便於維護,前後端程式碼直接沒放在Docker目錄下
    如果只是想Build本地端的專案
    Docker可以掛載任意目錄,所以沒有影響
原則上Docker-compose.yml配置好,若有客製化的image建好之後
在DockerProject目錄下執行 docker-compose up 就可以開啟三個容器了
然而,如果沒有像Registry Server(e.g., DockerHub)儲存我們的image
協同開發的人,就必須得按照你提供的檔案與Dockerfile來建置image才能正常使用
我們下一篇會以Jenkins為例,說明這個部分。

留言