簡介

Docker 在 2013 年釋出,它把 container 標準化,有效降低使用 container 的難度,很快就成為一個火紅的技術。

更多資訊可以上維基百科查詢,在這裡提一下 Docker 帶來的好處:

  • Docker 讓環境統一變得更容易,這有助於設計持續整合、持續部署的架構。
  • 只要雲端服務或機器支援 Docker,就能運行 Docker 包裝好的服務。
  • Docker 使用 Dockerfile 的純文字檔做為建置 image 的來源,這代表 Docker 實現了環境即程式碼(Infrastructure-as-code,IaC),環境資訊可以被版控系統記錄。
  • 同為虛擬化技術,Docker(或指 container)的資源使用率較 VM 好,它直接跟底層共用作業系統,不需中間再隔一層作業系統虛擬層,因此啟動 container 非常快。
  • Docker 應用場景橫跨開發與維運,也是 DevOps 熱門技能之一。

小弟運氣很好,在 2015 年遇到了 Docker 並開始學習,算很早就趕上這班車。當時因為對 Docker 特性不理解而踩過非常多雷,這些都對了解 Docker 基本特性有非常大的幫助。

未來將會用入門學習 Docker 的角度來跟大家分享,三十天會拆成三個階段各十天如下:

  • 熟悉 Docker 基礎的十天 - 了解如何操作 Docker 完成簡單任務。
  • 創造 Docker Image 的十天 - 網路上找到 Image 不滿意嗎?那就自己建一個!
  • 深入了解 Docker 的十天 - 遇到越複雜的情境,就越需要更加基礎的知識。

本作定位為教學系列文,每篇文章固定有一個特殊段落為今日自我回顧,裡面是以讀者角度撰寫出來的行為,讓讀者可以快速了解自己是否了解該文章的內容。

Docker 是一個學無止盡的技術,只靠三十天是無法說明完,因此今天會先列出本系列文章的範圍與限制。

前置技能

類似 Laravel 原始碼分析,閱讀未來三十天的文章,會預期讀者已具備以下基礎知識:

  • 使用常見指令操作 Linux
  • 了解在 Linux 如何控制 process 的狀態
  • 網路底層相關知識,包含 router、mask
  • 常見 server 的運作原理,如 NAT、DHCP、DNS 等
  • 了解 HTTP 與 TLS 應用

以 Linux + CLI 為主

以 Linux 為主的原因是,Docker 應用在 Linux 相較還是比較成熟;另一個原因則是:我沒有 Windows 電腦可以測試。

以 CLI 為主的理由則跟學習 git 的狀況很類似,GUI 的背後都有對應的指令,因此了解指令還是非常重要的。如果文章有提到新指令或新參數,會在當天最後加上指令補充說明的段落,讓讀者可以查詢或複習。

如果對 GUI 有興趣的可以參考下面的連結:

當對 Docker 原理了解清楚後,但又想在 CLI 方便管理 Docker 的話,則可以使用下面這個套件:

術語表

在介紹 Docker 原理時,會有非常多專有術語,下面是一個簡單的英中對照表(英文字母序):

英文 中文
build 建置
container 容器
host 本機、主機、宿主
image 映像檔
registry 倉庫註冊伺服器 [1]
repository 倉庫 [1]
volume 資料卷 [2]

提供英中對照表的目的,是為了讓讀者在查詢資訊時,可以有不一樣的關鍵字選擇。

未來三十天的文章裡,若有要使用上面的術語,會盡可能使用英文。

[1]: 參考《Docker —— 從入門到實踐》正體中文版翻譯
[2]: 參考《Docker —— 從入門到實踐》正體中文版翻譯

Docker 版本參考

文章裡的範例都是有試驗並成功的。Docker 有些功能不一定會向下相容,如果測試遇到問題時,建議可以先來對一下版本資訊。

$ docker version
Client: Docker Engine - Community
Version: 19.03.12
API version: 1.40
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:41:33 2020
OS/Arch: darwin/amd64
Experimental: false

Server: Docker Engine - Community
Engine:
Version: 19.03.12
API version: 1.40 (minimum version 1.12)
Go version: go1.13.10
Git commit: 48a66213fe
Built: Mon Jun 22 15:49:27 2020
OS/Arch: linux/amd64
Experimental: false
containerd:
Version: v1.2.13
GitCommit: 7ad184331fa3e55e52b890ea95e65ba581ae3429
runc:
Version: 1.0.0-rc10
GitCommit: dc9208a3303feef5b3839f4323d9beb36df0a9dd
docker-init:
Version: 0.18.0
GitCommit: fec3683

$ docker-compose version
docker-compose version 1.26.2, build eefe0d31
docker-py version: 4.2.2
CPython version: 3.7.7
OpenSSL version: OpenSSL 1.1.1g 21 Apr 2020