docker

優化加速 docker build 的秘訣 —— 使用 Cache mounts

現代開發應用(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

Python x VSCode x Docker

現在不少人都會選擇 VSCode 作為開發的文字編輯器使用,除了有各式各樣的擴充(extension)可以使用之外,還可以用 GitHub Copilot 加速開發。 不過好像比較少文

Posted on  Aug 2, 2023  by  Amo Chen  ‐ 1 min read

用 Docker 編譯並匯出執行檔 (compile & export)

最近在 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

trivy - 你的資安守門員

資訊安全除了程式的漏洞之外,最常見的就是不當設定(misconfiguration),例如授予一般使用者最高權限,就是很常見的一種漏洞。 不當

Posted on  Apr 3, 2023  by  Amo Chen  ‐ 1 min read

什麼?你還沒用過 K8s ?

隨著容器化(containeriziation)的盛行,也越來越多企業導入 Kubernetes (或稱 K8s ),將各種容器化的服務運行在 K8s 叢集內,除了能讓部署(de

Posted on  Mar 30, 2023  by  Amo Chen  ‐ 1 min read

優化 Python Docker Image Size - 從 multi-stage builds 到 distroless

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 Redis 架設教學

Redis 幾乎是現今大型網路應用(Application)都會使用的 in-memory 資料庫(database),可應用在實作快取(cache), message broker 等功能,目前絕大多數都使用 Redis 作為快取後端(backend), 該服務也經常會與 memcached 相提並論,不過 Redis 支援的功能更加多元,例如 Redis 提供多種不同的 data types (set, lists, hashes 等)、支援 transaction 等用法,如果運用得當,不僅可以簡化程式邏輯,也能帶來系統效率提升。

本文記錄如何在本機(localhost)環境以 Docker 架設 Redis 以供開發使用。

Posted on  Sep 14, 2022  in  用 Docker 架設服務  by  Amo Chen  ‐ 2 min read

Docker volumes 教學 - 從不熟到略懂

談到 Docker 容器的資料儲存(storage)問題,基本直覺就是透過掛載 Volumes, 不過 Docker 的 Volumes 其實有 3 種不同類型(types):

  1. Bind mount
  2. Volume
  3. tmpfs mount

大家常用的 -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