跳到主要內容

Appendix B: Docker 基本安裝和使用

本書包含許多在 Docker 容器中運行的範例,以便在不同作業系統之間實現標準化。

本節將幫助你安裝 Docker 並熟悉一些最常用的 Docker 命令,以便你可以運行本書的範例容器。

B.1. 安裝 Docker

在我們開始之前,你應該在電腦上安裝 Docker 容器系統。Docker 是一個開放系統,作為_社群版_免費分發給許多不同的作業系統,包括 Windows、macOS 和 Linux。Windows 和 Macintosh 版本稱為 Docker Desktop,由 GUI 桌面應用程式和命令列工具組成。Linux 版本稱為 Docker Engine,由伺服器守護程式和命令列工具組成。我們將使用命令列工具,這些工具在所有平台上都是相同的。

請按照 Docker 網站的「Get Docker」說明為你的作業系統安裝 Docker。

從列表中選擇你的作業系統並按照安裝說明進行操作。

如果你在 Linux 上安裝,請遵循安裝後的說明,以確保你可以以普通使用者而非 root 使用者身分運行 Docker。否則,你需要在所有 docker 命令前加上 sudo,以 root 身分運行它們,例如:sudo docker。

安裝 Docker 後,你可以通過運行演示容器 hello-world 來測試你的安裝,如下所示:

$ docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

[...]

B.2. 基本 Docker 命令

在本附錄中,我們會經常使用 Docker。我們將使用以下 Docker 命令和參數。

B.2.1. 構建容器

docker build [-t tag] [directory]

__tag__ 是我們如何識別我們正在構建的容器,__directory__ 是容器的上下文(資料夾和檔案)和定義檔案(Dockerfile)所在的位置。

B.2.2. 運行容器

docker run -it [--network netname] [--name cname] tag

__netname__ 是 Docker 網路的名稱,__cname__ 是我們為這個容器實例選擇的名稱,__tag__ 是我們構建容器時給它的名稱標籤。

B.2.3. 在容器中執行命令

docker exec cname command

__cname__ 是我們在 run 命令中給容器的名稱,__command__ 是我們想要在容器內運行的可執行檔案或腳本。

B.2.4. 停止和啟動容器

在大多數情況下,如果我們在_互動式_和_終端機_模式下運行容器,即設定了 i 和 t 標誌(組合為 -it),可以通過按 Ctrl-C 或使用 exit 或 Ctrl-D 退出 shell 來停止容器。如果容器沒有終止,你可以從另一個終端機這樣停止它:

docker stop cname

要恢復一個已經存在的容器,使用 start 命令如下:

docker start cname

B.2.5. 按名稱刪除容器

如果你給容器命名而不是讓 Docker 隨機命名,你不能重複使用該名稱,直到容器被刪除。Docker 會返回這樣的錯誤:

docker: Error response from daemon: Conflict. The container name "/bitcoind" is already in use...

要解決這個問題,刪除容器的現有實例:

docker rm cname

__cname__ 是分配給容器的名稱(錯誤訊息範例中的 bitcoind)。

B.2.6. 列出運行中的容器

docker ps

此命令顯示當前運行的容器及其名稱。

B.2.7. 列出 Docker 映像

docker image ls

此命令顯示已在你的電腦上構建或下載的 Docker 映像。

B.3. 結論

這些基本的 Docker 命令將足以讓你入門,並允許你運行本書中的所有範例。


1. 維基百科 賽局理論條目 提供了更多資訊。
2. Joseph Poon and Thaddeus Dryja. "The Bitcoin Lightning Network: Scalable Off-Chain Instant Payments." DRAFT Version 0.5.9.2. January 14, 2016. https://lightning.network/lightning-network-paper.pdf.
1. Andreas M. Antonopoulos, Mastering Bitcoin, 2nd Edition, Chapter 1 (O’Reilly)
2. ACINQ:Eclair Mobile 閃電網路錢包的開發者。
3. 通常不建議為多筆付款重複使用同一個比特幣地址,因為所有比特幣交易都是公開的。 經過的好奇者可能會掃描 Alice 的 QR 碼,並在比特幣區塊鏈上看到 Alice 已經收到了多少小費到這個地址。 幸運的是,閃電網路為此提供了更私密的解決方案,將在本書後面討論!
4. Eclair 錢包不提供自動計算必要費用並將最大資金分配給通道的選項,所以 Alice 必須自己計算。
1. 雖然原始閃電網路白皮書描述了由兩個通道夥伴注資的通道,但截至 2020 年的當前規範假設只有一個夥伴向通道承諾資金。截至 2021 年 5 月,雙重注資閃電網路通道在 c-lightning 閃電網路實現中處於實驗階段。
2. George Danezis and Ian Goldberg, "Sphinx: A Compact and Provably Secure Mix Format," in IEEE Symposium on Security and Privacy (New York: IEEE, 2009), 269–282.
3. 「洋蔥」一詞最初由 Tor 專案使用。此外,Tor 網路也被稱為洋蔥網路,該專案使用洋蔥作為其標誌。Tor 服務在網際網路上使用的頂級域名是 onion
1. George Danezis and Ian Goldberg, "Sphinx: A Compact and Provably Secure Mix Format," in IEEE Symposium on Security and Privacy (New York: IEEE, 2009), 269–282.
1. HODL 這個詞來自論壇中一個興奮的拼寫錯誤,將 "HOLD"(持有)誤拼,用來鼓勵人們不要在恐慌中出售比特幣。
1. 回想一下,找零不必是交易中的最後一個輸出,實際上與其他輸出無法區分。
2. 第一個參數(0)沒有任何意義,但由於比特幣多重簽章實作中的一個錯誤而需要。這個問題在《精通比特幣》https://github.com/bitcoinbook/bitcoinbook/blob/develop/ch07.asciidoc[第 7 章
3. 來自 BOLT #3