Docker 映像檔介紹

一個 Docker 映像檔就是一個 容器的模板。 一切始於一個 Docker 映像檔。 當你告訴 Docker 使用 docker run 從映像檔建立一個容器時,它會執行相應的操作(建立檔案系統、初始化相依性等),然後容器就會被建立。 映像檔是透過使用 docker build 命令從 Dockerfile 構建,並可以儲存在本地或發佈到像 Docker Hub 這樣的 Docker 註冊表中,你可以在其中儲存公開和私有映像檔。 如果你訪問 https://hub.docker.com/,你會看到許多映像檔,你可以自由使用而不必建立自己的映像檔。 通常這些映像檔都是由特定技術背後的開發團隊官方製作的。 舉個例子,這是官方的 Node.js Docker 映像檔:https://registry.hub.docker.com/_/node。 我們很快就會談到如何使用映像檔和容器的更多細節。

Dockerfiles

什麼是 Dockerfile 以及如何使用它 Dockerfile 是建構 Docker 映像檔的配方。 這是工作流程:首先建立一個 Dockerfile,然後使用 docker build 從中建立一個 Docker 映像檔,最後從映像檔執行容器。 Dockerfile 是一個包含建構映像檔指令的文字檔案。 這些指令是部分組態語言,其中包含 FROM、LABEL、RUN、COPY、ENTRYPOINT、CMD、EXPOSE、ENV 等關鍵字。 讓我們建立我們的第一個 Dockerfile: 假設你有一個包含簡單 Node.js 應用程式的資料夾,由一個 app.js 檔案組成,該檔案列出了在運行應用程式之前需要安裝的幾個相依性,以及 package-lock.json。 在其中,創建一個名為 Dockerfile 的純文字檔案,不要加上副檔名,並包含以下內容: FROM node:14 WORKDIR /usr/src/app COPY package\*.json app.js ./ RUN npm install EXPOSE 3000 CMD ["node", "app.js"] 注:CMD 行中使用雙引號。單引號會導致錯誤。 在第一行中,我們指定要從哪個映像檔開始。這將是我們的基底映像檔。在這個案例中,它將使用基於 Alpine Linux 的官方 Node.js 映像檔,使用 Node 14。當從 Dockerfile 建立容器時,Docker 將從 Docker Hub 獲取該映像檔。 接下來,我們將工作目錄設定為 /usr/src/app,這意味著我們的所有命令都將在該資料夾中執行,直到我們再次更改它。這是我們已知在 Node 映像檔中存在的資料夾。 我們複製位於當前資料夾中的 package.json、package-lock.json(使用星號萬用字元)和 app.js 檔案到工作目錄中。...

Docker介紹

Docker是一個改變我們部署應用程式和分發應用程式方式的工具之一。 它是一項非常受歡迎且廣受大多數使用者喜愛的技術,將其列入履歷中是一件很棒的事情。 使用Docker,我們可以創建一個封裝整個應用程式的容器。 不僅如此,它可以封裝整個應用程式並保存為映像以便輕鬆複製。 在這裡,複製是關鍵詞。使用Docker,我們可以創建運行在你的電腦、客戶的電腦、你的服務器等任何地方的獨立環境,並使用我們想要運行的軟體的特定版本。 這有助於解決從配置錯誤和不同環境之間版本不匹配導致的各種問題。 Docker很複雜,但我認為它用相對用戶友好的方式處理了許多複雜的問題。 這就是為什麼"理解它"可以從你作為開發者和作為軟體使用者的生活中減少很多複雜性的原因。 不再有"但在我的電腦上運行正常"這樣的問題了。你不再需要這樣說,別人也不需要再這樣對你說了。 我們都知道調試是困難的,當某些東西在你測試過的所有環境中運行正常,但在某些奇怪的配置上卻不正常時,這就更難了。有太多的變動部分。 Docker也非常適合分發你創建的軟體,但你不想應對來自於試圖在所有可能的Web伺服器和配置上安裝它的人們所提出的無數支援請求。 我知道受歡迎的論壇應用程式Discourse在很大程度上依賴於Docker。我現在找不到參考資料,但我敢肯定我讀過他們只會支援運行官方Docker映像的安裝問題。我在這裡可能錯了,但這個想法聽起來並不是無稽之談: 如果你作為一個程式設計師可以創建一個在任何你可以部署Docker容器的地方運行的映像,那麼作為一個使用者,你絕對應該利用這一點。 Docker的另一個重大好處是能夠運行不同版本同一套軟體堆疊的多個應用程式,如果沒有類似的解決方案,這將變得困難或至少令人困惑。 在接下來的教程中,我們將介紹幾個Docker的概念,並探索如何使用以下內容: Docker映像 Docker容器 Dockerfile 基於Docker映像更新已部署容器 如何提交更改到Docker映像 如何在Docker容器外部訪問檔案 在Docker Hub上共享Docker映像 從命令行操作Docker映像 從命令行操作Docker容器 如果Docker容器立即退出該怎麼辦 從頭開始創建一個簡單的Node.js Hello World Docker容器 使用Docker Desktop管理容器 安裝Docker後的第一步 在macOS上安裝Docker 等等!

使用Docker Desktop管理容器

使用Docker容器后,如果您点击工具栏中的Docker图标并选择Dashboard,您将在Docker Desktop中看到它: 现在,将鼠标悬停在容器上,您将看到5个按钮: 它们是: 在浏览器中打开 CLI 停止 重启 删除 您可以通过这些按钮管理您的容器生命周期。 点击列表中的容器名称,将会展示更多数据,包括日志管理器: 告诉您有关容器的有用信息的检查器: 以及有关容器CPU、内存、网络和磁盘使用情况的统计数据: 返回并点击“在浏览器中打开”按钮,http://localhost/tutorial URL将打开(在该应用程序中,http://localhost 会重定向到 http://localhost/tutorial): 这是我们示例镜像提供的网站内容。现在返回Docker Desktop并点击停止按钮: 然后刷新页面,它将不再工作: 回到Docker Desktop,点击开始按钮,它将再次工作。 尝试点击CLI按钮。一个新的终端窗口将打开,您将自动连接到Docker容器,作为“root”用户: 在上图中,whoami 命令返回当前用户名。

使用命令行操作 Docker 容器

Docker Desktop 应用程序非常方便地通过图形界面操作容器。 您并不需要使用它,您也可以使用命令行工具操作。 docker ps 命令可以列出当前正在运行的容器: 这与运行 docker container ls 命令相同。 在这个例子中,容器名称为 node-app,ID 为 739037a911e0,由镜像 examplenode 创建,创建时间为 4分钟前,启动时间为 4分钟,并且主机机器的端口80映射到容器端口3000,使用的是TCP协议。 当您知道容器的 ID 时,可以通过运行以下命令停止容器: docker container stop <ID> 容器停止后,可以使用 docker container ls -a 命令查看它: 您可以使用 docker container rm 命令删除它: docker container rm <ID> 您可以使用 docker inspect 命令查看容器的所有详细信息: 另一个非常有用的命令是 docker info,它可以提供有关当前 Docker 安装状态的大量信息,包括容器和镜像的数量。

使用命令行操作 Docker 鏡像

使用以下命令可以列出您已下載或安裝的所有鏡像: docker images -a 執行這個命令的結果如下所示: 您可以使用 docker rmi 命令並指定要刪除的鏡像名稱來移除一個鏡像。這將刪除該鏡像。 執行以下命令可以移除當前測試和開發中的一些已成為懸空狀態(未標記)的鏡像,以釋放磁碟空間: docker images -f dangling=true 執行結果如下所示: 使用以下命令可以清除這些鏡像: docker rmi $(docker images -f dangling=true -q) 此命令只會刪除已放置在容器中的懸空鏡像,即使它們目前未運行。 docker system prune -a 是另一個常用的刪除鏡像的方法,它也會移除未被任何容器引用的鏡像,這可能會刪除您想保留的鏡像,即使只是為了回滾到鏡像的先前版本。 如果您想清除所有鏡像,可以使用以下命令: docker rmi $(docker images -a -q) 這在您進行首次測試和 Docker 實驗時可能非常有用。

如何修復Homebrew錯誤“Permission denied @ apply2files”

在運行brew upgrade node以升級我的macOS上的Node.js安裝之後,Homebrew決定自動運行brew cleanup。 它正在進行清理,一直Removing:/Users/.....,直到我遇到了錯誤: Error: Permission denied @ apply2files - /usr/local/lib/docker/cli-plugins 看到路徑中的“docker”嗎? 原來是最近刪除了Docker,這導致了錯誤。我解決問題的方法是重新創建了一個Docker應用的文件夾: mkdir -p /Applications/Docker.app/Contents/Resources/cli-plugins 然後運行 brew cleanup 問題得以解決。 你的問題可能是由於其他缺少的庫引起的,而不是Docker,所以在這種情況下,你可以搜索你遇到的具體錯誤消息,看看是否有其他人遇到了相同的問題並解決了它。但這是一個開始。

如何在 Docker 容器外訪問檔案

如果容器是隔離的,那麼它們如何與主機進行通信,例如存儲數據?因為當我們從映像創建容器時,容器被移除時生成的任何數據都會丟失。 因此,我們需要一種方式來實現永久性存儲。 我們可以使用 Bind Mounts 和 Volumes 來實現。 兩者之間沒有太大的區別,除了 Bind Mounts 可以指向主機計算機上的任意文件夾,並且不由 Docker 直接管理。 讓我們首先看看 Bind Mounts。一個典型的例子是日誌文件。假設您的應用在容器內的 /usr/src/app/logs 文件夾中創建了一個日誌文件,您可以使用 docker run 命令的 -v(與 --volume 相同)選項將其映射到主機計算機上的一個文件夾中,例如 -v ~/logs:/usr/src/app/logs。 這將把該文件夾映射到用戶的主目錄下的 logs 子文件夾中。 注意:-m 或 --mount 選項的使用方法非常相似。 以下是我們以前創建的 examplenode 映像的命令示例: docker run -d -p 80:3000 -v ~/logs:/usr/src/app/logs --name node-app examplenode 現在我們可以運行我們的 Node 應用程序,並將任何日誌存儲在主機計算機中,而不是 Docker 容器內部。 請注意,examplenode 應用程序不會在 /usr/src/app/logs 中生成任何日誌,這只是一個示例,您需要首先設置該日誌。 有關該卷的詳細信息將在運行 docker inspect 命令時列出,可以在容器名稱下的“Mounts”部分找到: "Mounts": [ { "Type": "bind", "Source": "/Users/flavio/logs", "Destination": "/usr/src/app/logs", "Mode": "", "RW": true, "Propagation": "rprivate" } ], 您能看到 "Type": "bind" 嗎?這表示我們創建了一個 bind mount。...

如何提交更改到Docker映像

當你部署應用程式後,發現有個 bug 需要修復,或者只是想要發佈更新,該怎麼辦? 執行 docker ps 命令可以取得正在運行的容器的 ID,然後使用 docker commit 來從中創建一個新的標籤: docker commit <id> <username>/<imagename>:<tagname> 你還可以在新版本中添加一個變更日誌訊息,列出新版本中的變更內容: docker commit --change "description" <id> <username>/<imagename>:<tagname>

如果Docker容器立即退出該怎麼辦

如果你使用docker run命令運行一個容器後,容器立即退出,並且每次在Docker Desktop中點擊啟動按鈕後容器都立即退出,這表示存在問題。 解決問題的方法是運行docker logs命令,並在命令的末尾添加容器的名稱: docker logs <container_name> 你也可以在Docker Desktop中點擊容器的名稱,它會顯示一個日誌列表。 在這種情況下,通過快速的谷歌搜索,我意識到我在CMD命令中使用了單引號。 需要注意的是,為了解決這樣的問題,你需要刪除容器,同時刪除映像並重新構建。