Docker Concept and Best Practice

Docker


參考 GitBook - Docker Practice

鏡像(Image)和容器(Container)的關係,就像是 OOP (Object-oriented Programming) 中的 class 和 instance 一樣, Image 是靜態的定義, Container 是 Image 運行時的實體。容器可以被創建、啟動、停止、刪除、暫停等。

基本的運作方式像這樣, 參考 這份PPT


Developer Best Practice

Keep Images Small

確保 Images 越小越好, 跟 layers 越少越好, 這樣啟動的速度就越快.
Layers 指的是在 Dockerfile 的每一行指令, 代表一個 layer, 例如下面這份 Dockfile 就代表 6 Layers.

FROM ubuntu:15.04
COPY . /app
RUN apt-get -y update
RUN apt-get install -y python
RUN make /app
CMD python /app/app.py

可以修改為 4 layers.

FROM ubuntu:15.04
COPY . /app
RUN apt-get -y update && apt-get install -y python && make /app
CMD python /app/app.py

Layers 的說明: 參考



  • JDK 的開發者, 可以考慮 Docker 官方建議的 OpenJDK Image, 官方目前不支援 oracle-jdk 呦。
  • Multiple Build, 在一份 Dockerfile 同時使用不同來源的 image, 可以避免同時維護多個 dockerfiles, 參考:用 Docker Multi-Stage 編譯出 Go 語言最小 Image
  • 如果有多個 images 擁有相同的 common, 可以考慮建立一個 base image, 類似父層級的 image, docker 會協助做快取來加速其他 image 的啟動.
  • 在建立多個 images 時, 可以透過 tags 的指令做管理, 不要依賴 latest 的 tag.


Where and how to persist application data

  • 避免將資料存到 container 裡面, 這會導致 I/O 效率降低.
  • 建議使用 volumes, 將 host 的目錄或檔案掛載(mounted)到 docker 容器裡。
  • 敏感的資訊, 或 config 相關設定, 請考慮 docker secret

Differences between -v and --mount behavior

在閱讀文件的時候, 剛好看到自己的疑問, -v--mount 的差異,

  • -v - 永遠都會做 created direcotry 這個動作。
  • --mount - 如果檔案或目錄不存在, docker 會拋出 error。
透過 docker inspect devtest 可以看到詳細的差異。

volume 用法


docker run -d \
  -it \
  --name devtest \
  -v "$(pwd)"/src:/app \ 
  nginx:latest

mount 用法


docker run -d \
  -it \
  --name devtest \
  --mount type=bind,source="$(pwd)"/src,target=/app \ 
  nginx:latest

Use swarm services when possible

這部分主要是建議以 群集(SWARM) 的架構使用 container, 目前還沒有深入的需求, 沒有深入研究



沒有留言:

張貼留言