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, 目前還沒有深入的需求, 沒有深入研究
沒有留言:
張貼留言