7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. DevOps

Docker由零開始:使用容器,第一部

Scroll to top
Read Time: 3 mins
This post is part of a series called Docker from the Ground Up: Working with Containers.
Docker From the Ground Up: Working With Containers, Part 2

Chinese (Traditional) (中文(繁體)) translation by Qiang Ji (you can also view the original English article)

這是關於使用Docker容器的兩部分系列的第一部分。在這部分,我們將專注於運行鏡像的多種方法和選項,以及主機如何與Docker容器進行交互。

在第二部分中,我們將介紹如何列出,啟動,停止和重新啟動容器以及執行運行容器的命令。 Docker鏡像是部署的基礎單位。 運行鏡像時,你實例化一個Docker容器,該容器在其獨立的文件系統,網絡和進程樹環境中運行一個單一的進程。

Docker容器非常靈活,它有許多的應用實例,而很多其它技術如虛擬機和裸機服務器在這些應用實例中的運用則太重,複雜和昂貴。

在我們開始之前,請確保Docker被正確地安裝在你的環境中。根據安裝方式和當前用戶,你可能需要用sudo的權限運行它。我會跳過sudo。

運行一個鏡像

你通過運行鏡像啟動Docker容器。有幾種運行容器的方法,不同的方法會影響到管理所有容器的容易程度。 當容器啟動時,它通常運行Dockerfile中定義的命令。以下是hello-world容器的Dockerfile:

該命令只是運行在構建鏡像時復製到容器根目錄的“hello”二進製文件。

前台運行與分離運行

容器可以在前台進行排它性運行直到進程退出且容器停止運行。 在前台運行模式下,容器將其輸出打印到控制台,並可讀取標準輸入。在分離運行模式下(當你提供-d參數時),控件立即返回。

運行一個無名的容器

運行容器最簡單的方法:docker run <image id or name>

當你使用此命令運行一個容器,Docker將賦予它一個名字,這個名字是由兩個隨機的單詞組成。比如:docker run hello-world

如果你已經有叫hello-world的鏡像,那麼Docker將會運行它。如果沒有,它將從官方的DockerHub庫拉取並運行它。運行輸出的結果應如下所示:

hello程序在顯示此信息後退出,它終止在容器內部運行的進程並且結束容器的運行。 如果你想再次連接容器,檢查容器日誌或做其它任何與容器有關的事情,容器依然還在那裡。你可以運行下面的命令去查看容器:

稍後我將會解釋怎樣列出容器和所有相關的選項。現在,讓我們關注容器名稱部分。 Docker自動生成“clever_liskov”的名字,我必須使用它或者容器的ID去引用此容器,以用於重啟動,刪除容器或執行一個命令。

運行一個有名字的容器

有時候使用容器的ID或自動生成的名字並不是很方便。如果你需要經常與一個你需要重複創建的容器交互,你每次都將得到一個不同的ID和自動生成的名字。這個名字還是隨機的。

Docker通過提供一個“--name”命令行參數讓你在運行容器的時候對它們命名。在簡單的情況下,每個鏡像只能被用來運行一個容器,你可以在運行鏡像之後命名容器:docker run --name hello-world hello-world

現在,如果我們看一下當前的容器線程(我之前刪除了clever_liskov容器)我們將看到容器被命名為hello-world:

一個有名字的容器有以下的好處:

  • 你給容器一個固定的名字,你可在命令行交互式地使用這些名字,也可在腳本中使用它們。
  • 你能選一個有意義的名字。
  • 你能選一個短點的名字,這會在命令行與它們交互時提供方便。
  • 它會防止你意外地使用多個用同樣鏡像創建的容器(只要你始終提供相同的名字)。

讓我們看一下最後的選項。如果我再次運行同樣的帶有相同"hello-world"名字的命令,我會得到一個明確的報錯消息。

運行一個會自動刪除的鏡像

在默認的情況下,容器是不會被自動刪除的。但有些時候,你真的不需要它們了。你能夠讓容器自動被刪除而不是手動去刪除它們。 --rm命令行參數就是乾這個的:docker run --rm hello-world

運行一個不同的命令

在默認情況下,Docker運行在Dockerfile中指定的命令去創建一個鏡像(或直接在進入點運行如果在Dockerfile中沒找到命令)。 你可以隨時通過在運行命令的末尾提供自己的命令來覆蓋它。讓我們對busybox鏡像運行ls -lahello-world鏡像沒有ls可執行文件)。

與主機交互

Docker容器在它們自己的小世界裡運行獨立的進程。但是我們常常需要讓主機對它們訪問。

向一個容器傳遞環境變量

Docker容器不會自動繼承運行它們的那些主機進程的環境。 當你使用-e命令行參數運行容器的時候,你需要明確地向容器提供一個環境變量。你可以傳遞多個環境變量。這裡有一個例子:

第一行命令用來運行busybox容器,傳遞一個ENV_FROM_HOST變量,然後在容器內運行env顯示出ENV_FROM_HOST變量已被正確地賦值。

你也可以使用主機的環境變量。下面的命令創建了一些主機環境變量並且在運行容器的命令中使用它們。

它們都可以在容器內被使用。

安裝主機目錄

最有用的一個與容器的交互就是安裝主機目錄。這允許幾個有趣的用例:

  • 在一台主機上運行的多個容器可以共享存儲空間。
  • 使用主機中的工具在主機環境中瀏覽和編輯文件並在容器中使用那些文件。
  • 主機環境擁有的持續性與容器的生命週期無關。

我在主機上創建了一個文件:$ echo "Yeah, it works!" > ~/data/1.txt

然後我運行busybox鏡像,把主機的~/data目錄安裝到容器的/data目錄,並在屏幕上顯示文件的內容。

我在這裡使用了cat /data/1.txt命令。

向主機公開端口

如果你在Dockerfile裡使用EXPOSE公開一個端口,這個端口只能被其它docker容器訪問。 為了讓此端口能被主機訪問,你需要使用-p命令行參數。它的語法是-p <host port>:<exposed container port>

這裡正在運行一個nginx鏡像,它公開了80端口並使用-p命令行參數使其可以通過主機9000端口被訪問。

請注意,不像之前那些運行一些任務然後結束的命令,nginx容器將保持運行並偵聽來訪的請求。 我們來驗證一下nginx是否正常運行,並響應端口9000上的請求。為了從命令行訪問網頁服務器和服務,對於使用curl我更喜歡使用優秀的httpie Http客戶端。

總結

有許多的選項和方法可以通過運行Docker鏡像去創建Docker容器。每個方法和選項的組合支持一個特別的用例。 在使用Docker容器去完全掌控細節並使用最佳方法啟動容器時,這是非常有用的。

此外,安裝主機目錄和對主機公開並發布端口,這允許容器與主機的緊密集成和大量使用場景。在第二部分中,我們將深入探討如何管理一些容器,並充分利用Docker提供的全部功能。

关注我们的公众号
Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.