Docker Compose 架設 MongoDB clusters / replica sets / 叢集
本文紀錄如何用 Docker 與 Docker Compose 架設 MongoDB replica set (或稱 MongoDB 叢集/Cluster) 。
Posted on Dec 30, 2023 in Docker by Amo Chen ‐ 3 min read
本文紀錄如何用 Docker 與 Docker Compose 架設 MongoDB replica set (或稱 MongoDB 叢集/Cluster) 。
Posted on Dec 30, 2023 in Docker by Amo Chen ‐ 3 min read
本文將介紹 3+1 個 docker compose 的指令,讓我們能夠在執行 docker compose up
指令之前提早偵錯 docker compose file 可能存在的問題與 docker 預定的容器啟動程序,以及以指令繪製出容器之間的相依關係。
Posted on Dec 21, 2023 in Docker by Amo Chen ‐ 3 min read
使用 Docker compose 架設開發環境真的十分方便,但是隨著容器數量增多,很容易遇到多個容器都有共通設定的問題,例如多個容器都使用同一套環境變數,每新增 1 個容器,又要再重新複製貼上⋯⋯,如下列範例:
services:
web:
image: "nginx"
environment:
- DEBUG=true
- API_VERSION=v1
redis:
image: "redis:alpine"
environment:
- DEBUG=ture
- API_VERSION=v1
不過 YAML 的規格其實有針對這個問題提出解決辦法,該功能稱為 YAML anchors & aliases 這個功能可以讓我們把共通/共用的設定變成 1 個可引用的區塊,然後如果後續需要使用這些共通/共用的設定時,可以用特殊語法直接告訴 Docker compose 去複製/引用該區塊的設定。
真的相當方便,一起來看怎麼使用吧!
Posted on Dec 16, 2023 in Docker by Amo Chen ‐ 4 min read
在使用 docker compose 架設開發環境時,會遇到所謂的服務相依性問題(service dependencies), 舉個簡單的例子,通常資料庫的容器(container)ㄧ定要先正常啟動,後端 API server 的容器才能接著啟動,因為 API server 可能在啟動時需要與資料庫連線建立 connection pool 之後,才會提供 API 服務,否則就會發生錯誤並退出執行,導致容器啟動失敗。
在這個情況下, API server 容器依賴資料庫容器的正常運作,這就是服務相依性。如果沒有理解服務相依性的問題,那麼在使用 docker compose 的時候,將會很容易遇到時而啟動成功,時而啟動失敗的問題,因為有時相依的服務會剛好準時或提早起動成功,有時則還沒準備好。
為此, docker compose 也有提供解決服務相依性的設定,那就是 depends_on 設定。
本文將教導如何使用 depends_on
設定。
Posted on Dec 14, 2023 in Docker by Amo Chen ‐ 5 min read
現代開發應用(application)或多或少都會使用到第三方套件,不僅減少自行開發的成本,也加速開發應用的速度,所以各種程式語言都會有所謂的 package manager, 幫助開發者安裝/管理各種第三方套件與套件相依性,例如 npm, yarn, pip, go mod 等等,甚至作業系統也有 package manager 例如著名的 APT(Advanced Packaging Tool), Homebrew 等等。
但是隨著第三方套件越用越多,每次重新編譯(build) Docker 映像檔(image)的時間也會越來越長,因為每次重新 build docker image 都要花費不少時間重新下載並安裝第三方套件⋯⋯。
針對這個問題, Docker 官方文件有提到可以使用 Cache mounts 優化 build 的速度。
一起認識什麼是 Cache mounts 吧!
Posted on Nov 26, 2023 in Docker by Amo Chen ‐ 3 min read
最近在 macOS 用 Go 語言開發專案,不過遇到一些 Cross-Compiling 無法運作的問題,礙於時間壓力只得想辦法避開 Cross-Compiling 的問題,最直覺的方式就是直接在最終需要部署的作業系統中編譯,所以決定暫時用相同作業系統版本的 Docker container 以進行編譯,再將 Docker image 內最終編譯完成的執行檔匯出即可。
Docker 官方也提供文件指引如何匯出檔案,但是過程可能會遇到讀寫的問題,所以本文重新以比較簡單的方式介紹如何匯出 Docker image 內的檔案。
Posted on Jun 16, 2023 in Docker by Amo Chen ‐ 2 min read
Docker multi-stage builds 教學 一文介紹以 Golang 作為範例,示範如何用 Docker multi-stage builds 的功能,優化編譯 Docker image 的過程,以減少 Docker Image 的 size 。
Multi-stage builds 並不局限於 Golang 這類的編譯(compiled)語言才能使用,腳本(script)語言也能夠運用類似的技巧降低 Docker image size, 例如 Javascript, Python 等開發生態系也都能夠使用。
只是腳本語言需透過直譯器(interpreter)執行的天性,因此其 Docker image 終究難以像 Golang 這類編譯語言所產生的 image 來得小,但這並不代表 Python, Javascript 這類的 Docker image 並不值得使用 multi-stage builds, 優化 Docker image size 仍可以為部署(deployment)速度帶來優勢,同時也能減少網路傳輸所需付出的費用成本。
本文的 multi-stage builds 以 Python 範例出發,一路介紹到如何使用 Google 所提供 distroless 進一步優化 Docker image size 與安全性。
Posted on Jan 6, 2023 in Docker , Python 程式設計 - 高階 by Amo Chen ‐ 5 min read
談到 Docker 容器的資料儲存(storage)問題,基本直覺就是透過掛載 Volumes, 不過 Docker 的 Volumes 其實有 3 種不同類型(types):
大家常用的 -v <Host 路徑>:<Container 路徑>
參數其實就是使用 bind mount, 例如以下指令:
$ docker run -it -v /home/user:/data debian /bin/bash
簡而言之,使用 bind mount 的 volume 其實就是透過 host machine 的檔案系統(filesystem)提供容器儲存的能力。
雖然不清楚 volume 的類型,並不會對日常使用上造成任何問題,不過理解其差異仍有其必要,因爲這些差異很可能會在 production 環境上產生重大影響。
Posted on Apr 1, 2022 in Docker by Amo Chen ‐ 5 min read