[微服務] Docker基礎(8) - 讓Docker進入實務的專案(二)

前言

我們會延續第七篇的內容,創造一個真實實務的Docker體系,包含

  • 開發
  • 測試
  • 部屬

工具

在這個實務專案我們會用到

  • GitHub (Free)
    • 包含master和feature觀念
  • Travis CI (Free)
    • 由GitHub提供的CI工具
  • AWS (有免費專案)
    • 我們會將AWS的服務當作最終生產環境
  • React
    • 我們只單純的使用React的初始APP不會做太多的React Code主要是要看到他的畫面

流程

Dev

  • 創建/更新code 在feature branch中
  • 將code merge到master中

Test

  • 將code push到Travis CI中
  • 測試程式碼

Prod

  • 將PR merge進master中
  • 測試
  • 部屬到AWS Beanstalk中

這篇文章會著重於,將Code推上GitHub透過Travis部屬至AWS平台

讓你的專案和GitHub連接

先到你的GitHub創立一個Repository
在到上篇文章的React app和GitHub連接

git init
git add .
git commit -m "First commit"
git remote add origin 你的.git連結
git push origin master

就完成專案和GitHub的連接了

Travis

直接用GitHub的SSO登入Travis,並且透過官方的基本操作將目標Repository拉到Travis工作區

接下來我們要

  • 透過Travis跑我們的Docker.dev環境
  • 告訴Travis我們要跑測試

只要在上一篇(七)的文章中我們前置作業做好的React App資料夾中加上.travis.yml檔案就可以開始使用travis的功能

將GitHub的專案拉到Trais工作區
登入Travis後點擊右上角的帳號setting就可以將自己的範例專案拉到工作區,如下點擊我們這範例的Docker react專案

接下來Travis只要新增下面的檔案到自己專案的根目錄,每次push上去就會幫你建置搂!

.travis.yml

sudo: required
services:
    - docker

before_install:
    - docker build -t charlie/docker-react -f Dockerfile.dev .

script:
    -  docker run charlie/docker-react npm run test -- --coverage
  • sudo是告訴Travis要用根權限操作
  • services是宣告會用到那些服務
  • berfore_install當執行我們要做的script前我們要先做那些操作
  • script是我們要做哪些事情
    • 這裡我們多了-- --coverage是要透過npm幫我們看單元測試的覆蓋率

記得要將此檔案推到GitHub上
推上Github後,更新Travis的畫面,就可以看到我們的單元測試開始跑了!

AWS

我們這裡會使用到AWS的Elastic Beanstalk,在控制台尋找Elastic Beanstalk簡單的輸入專案名稱並且宣告自己使用是Docker platform,其他使用預設就好

在這裡不深入探討如何使用Elastic Beanstalk,之後會再增加介紹文章

新增EBS一個新的Server,並且選擇Docker專案

透過AWS使用介面尋找S3的服務並且記錄S3的bucket name

我們要對Elastic Beanstalk做甚麼呢?

  • 我們要將我們的Docker容器放進去並且啟動
  • 我們要進入S3我們EBS(Elastic Beanstalk)拿取我們的Bucketname
  • 進入IAM特別開一個專屬於這個EBS的部屬帳號(記得打開EBS權限),並且拿取Access和Secret ID
  • 設定我們的.travis.yml檔的部屬設置

過程結束後我們的.travis.yml會長這個樣子

sudo: required
services:
    - docker

before_install:
    - docker build -t charlie/docker-react -f Dockerfile.dev .

script:
    -  docker run charlie/docker-react npm run test -- --coverage

deploy:
    provider: elasticbeanstalk
    region: "us-east-1" 
    app: docker-react
    env: "DockerReact-env"
    bucket_name: "從S3拿到的BucketName"
    bucket_path: "docker-react"
    on:
        branch: master
    access_key_id: $AWS_ACCESS_KEY
    secret_access_key:
        secure: "$AWS_SECRET_KEY"
  • deploy 是告訴travis我要如何部屬
    • provider 標明我們要部屬在EBS中
    • region 是我們EBS所在的區域
    • app 就是我們EBS所開的專案名稱
    • env 此專案所在的環境
    • bucket_name 從S3得到和這個EBS連接的儲存裝置名稱
    • bucket_path 打上我們的專案名稱(他會直接幫你以專案名稱作為App的根目錄資料夾)
    • on
      • branch 我要針對哪一個branch變動時作部署
    • access_key_id 我們要連進EBS的進入金鑰
      • 裡面的$AWS_ACCESS_KEY是透過travis專案裡面setting的environment設定
    • secret_access_ley
      • secre 同上透過環境變數設定

再來是記得打開我們Dockfile Nginx的port,因為EBS上我們不能透過docker run -p的方法設定要打開的port,所以只能透過docker裡面設定

dockerfile

FROM node:alpine as builder

WORKDIR '/app'

COPY package.json .
RUN npm install

COPY . .
RUN npm run build

FROM nginx
EXPOSE 80
COPY --from=builder /app/build /usr/share/nginx/html

再將這次更動push到我們的github上,等一下部屬時間,就可以看到我們的react app成功發布到AWS EBS上,恭喜你完成第一個簡單的實戰應用,之後如果要在上面開發你已經做到了第一個CI/CD搭配Docker的自動架構了

結論

這兩篇文章從打包React到Docker,設定Dockerfile/Dockerfile.dev還有travis的自動化測試,以及最後將整個App部屬至AWS上

留言

這個網誌中的熱門文章

Java Lambda Map篇

(InterviewBit) System Design - Design Cache System

設計模式 - 享元模式 (Structural Patterns - Flyweight Design Pattern)