歡迎光臨
每天分享高質量文章

Docker教程:玩轉容器

如果你是Docker的新手,看一下你應該學習的一些基礎命令,以便開始管理容器。
Docker對軟體開發生命周期產生了巨大影響,使得大規模軟體部署變得簡單而且安全。這個教程將介紹運行、啟動、停止和刪除Docker容器的基礎知識。
Docker使得在不同的操作系統上使用不同的編程語言很容易,而所有這些都在同一主機上實現。
在Docker之後部署你的軟體變得更加容易,你不必擔心錯過系統配置或先決條件。

Docker與虛擬機

如果你正使用虛擬運行你的軟體,為什麼還需要Docker來取代呢?
它們之間的主要區別在於Docker是一個在你的本機操作系統中運行的獨立行程,而虛擬機是一個完整的隔離操作系統,它在主機操作系統之上運行,需要更多時間來加載。所以Docker比虛擬機有更多優勢,例如:
  • 加載速度與虛擬機不同,所需的硬體資源很少。

  • 在同一操作系統上同時運行多個Docker容器。

  • 你可以修改容器並對其進行部署,或將Docker檔案定義提供給朋友,以便在同一環境中工作。

實際上,Docker不是虛擬機的替代品,而是解決特定問題。
假設你的應用程式需要3個或更多在不同操作系統上運行的服務,那麼你可以在同一主機上平穩運行3個容器,而不是在同一主機上運行3個虛擬機。聽起來很棒!
運行你的容器

在開始之前,請確保已正確安裝Docker並準備好接受命令。在新的終端視窗中鍵入以下命令:
$ docker -v

以上命令輸出PC上安裝的Docker版本:
Docker version 17.12.0-ce-rc2build f9cde63

是時候開始運行容器了:
$ docker container run alpine echo "Hello World"

當您第一次運行上述命令時,你應該在終端視窗中看到與此類似的輸出:
Unable to find image 'alpine:latest' locally

latest: Pulling from library/alpine

2fdfe1cd78c2: Pull complete

Digest: sha256:ccba511b...

Status: Downloaded newer image for alpine:latest

Hello World

這很容易,不是嗎?嘗試再次運行相同的命令:

$ docker container run alpine echo "Hello World"

運行上述命令的第二,第三或第n次,你應該只在終端中看到此輸出:
Hello World

現在你已成功運行容器,現在是時候分析究竟發生了什麼。查看以下命令:
$ docker container run alpine echo "Hello World"

該命令包含多個部分。首先,你有“docker”這個詞。這是Docker命令列界面(CLI)的名稱,用於與負責運行容器的Docker引擎進行交互。
接下來,您有單詞“container”,它表示你正在使用的背景關係。
再下一步是 實際要執行的命令run。
現在,還需要告訴Docker運行哪個容器。在這裡,運行的是 alpine 容器。
最後,需要定義在容器運行時,應在容器內執行的行程或任務型別。這是命令的最後一部分,echo “Hello World”。
在容器內運行行程

既然已經瞭解了運行容器的命令的各個部分,請嘗試在另一個容器中運行不同的行程:
$ docker container run centos ping -c 5 127.0.0.1

輸出如下:
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
85432449fd0f: Pull complete
Digest: sha256:3b1a65e9a05...
Status: Downloaded newer image for centos:latest
PING 127.0.0.1 (127.0.0.156(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.022 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.019 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.029 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.030 ms
64 bytes from 127.0.0.1: icmp_seq=5 ttl=64 time=0.029 ms

--- 127.0.0.1 ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4103ms

在前面的示例中,使用的容器鏡像是CentOS,並且在CentOS容器內執行的行程是ping -c 5 127.0.0.1,它將環回地址ping五次直到它停止。
第一行如下:
Unable to find image 'centos:latest' locally

這告訴你Docker沒有在系統的本地快取中找到名為centos:latest的鏡像。因此,Docker知道它必須從儲存容器的某個鏡像源中提。
預設情況下,Docker環境配置為從hub.docker.com的Docker Hub中提取鏡像。這由第二行表示如下:

latest: Pulling from library/centos

接下來的三行輸出如下:
85432449fd0fPull completeDigestsha256:3b1a65e9a05...Status:

這告訴您Docker已成功從Docker Hub中提取了鏡像centos:latest。
後續的輸出都是由容器內運行的行程生成的,這裡運行的是ping工具。
你可能還註意到latest這個關鍵字出現了幾次。每個映像都有一個版本(也稱為標記),如果沒有明確指定版本,則Docker會自動其視為最新版本。
如果在系統上再次運行這個容器,將不會輸出之前的五行,因為Docker將在本地快取容器映像,因此不必先下載它。試試是不是這樣。
運行一個隨機取用容器

為了運行隨機陳述句容器,需要一個生成隨機陳述句的演算法。可以在此處[1]找到生成這些隨機陳述句的API。
現在的標的是要在容器內運行一個行程,每5秒生成一條隨機陳述句,並且輸出到STDOUT:

while : 
do 
    wget -qO- https://talaikis.com/api/quotes/random 
    printf 'n' 
    sleep 5 
done

按Ctrl + C停止腳本。這是輸出:

{"quote":"Martha Stewart is extremely talented. Her designs are picture perfect. Our philosophy is life is messy, and rather than being afraid of those messes we design products that work the way we live.","author":"Kathy Ireland","cat":"design"}{"quote":"We can reach our potential, but to do so, we must reach within ourselves. We must summon the strength, the will, and the faith to move forward - to be bold - to invest in our future.","author":"John Hoeven","cat":"faith"}

每個響應都是一個JSON格式的字串,包含引號,作者及其類別。
現在,讓這個容器後臺運行。為此,需要將前面的腳本縮成一行,並使用 /bin/sh -c “…” 來執行。Docker 的運算式如下:
$ docker container run -d --name quotes alpine \   /bin/sh -c "while :; do wget -qO- https://talaikis.com/api/quotes/random; printf '\n'; sleep 5; done"

上面的運算式,你使用了兩個命令列引數,-d 和–name。-d告訴Docker以一個Linux守護行程的方式運行容器。-name引數用於為容器指定顯式名稱。
如果您未指定顯式容器名稱,Docker將自動為容器分配一個隨機但唯一的名稱。這個名字將由一位著名科學家的名字和一個形容詞組成。
諸如,“boring_borg”或“angry_goldberg”。相當幽默,不是嗎?
一個重要的方面是容器名稱必須是唯一的。確保引號容器已啟動並正在運行:
$ docker container ls -l

前面輸出的重要部分是STATUS列,此例中,它顯示UP 16 seconds。這意味著容器已經啟動並運行了16秒。
隨著時間的推移繼續運行容器,你的系統也許會產生很多容器。要查找主機上當前正在運行的容器,可以使用container ls命令,如下所示:
$ docker container ls

這將列出所有當前運行的容器。
預設情況下,Docker輸出七列,含義如下:

描述
Container ID 唯一的容器 ID 。它是SHA-256.
Image 所以用的鏡像
Status 容器的狀態(created,restarting,running,removing,paused,exited,or dead)
Ports 映射到宿主機的端口
Names 分配到容器的名字 (可以是多個名字的)
如果要列出系統上定義的所有容器,可以使用命令列引數 -a 或 -all,如下所示:
$ docker container ls -a

這將列出任何狀態的容器,無論是創建,運行還是退出。
有時,可能只想列出所有容器的ID。為此,你有 -q 引數:
$ docker container ls -q

你可能想知道這有什麼用。這裡有個例子:
$ docker container rm -f $(docker container ls -a -q)

上面的命令刪除當前在系統上定義的所有容器,包括已停止的容器。rm命令代表刪除,將在本教程中進一步解釋。
在上一節中,您在list命令中使用了-l引數。嘗試使用Docker幫助找出-l引數代表什麼。您可以為list命令呼叫help,如下所示:
$ docker container ls -h

停止和啟動容器

有時,你可能需要暫時停止正在運行的容器。試試以下這個容器:
$ docker container run -d --name quotes alpine \   /bin/sh -c "while :; do wget -qO- https://talaikis.com/api/quotes/random; printf '\n'; sleep 5; done"

現在,你可以使用以下命令停止此容器:

$ docker container stop quotes

當你嘗試暫停容器時,可能會註意到它需要一段時間(大約10秒)才能執行完成。為什麼會這樣? Docker將 Linux SIGTERM信號發送到容器內運行的主行程。
在上面的命令中,容器的名稱用於指定要停止的容器。也可以使用容器ID。

你如何獲得容器ID?

有幾種方法可以做到這一點。手動方法是列出所有正在運行的容器,併在串列中找到您要查找的容器。只需從那裡複製其ID。
更自動化的方法是使用shell腳本和環境變數。例如,如果要獲取引號容器的ID,這是一個示例:
$ export CONTAINER_ID = $(docker container ls | grep quotes | awk '{print $1}')

這裡我們使用AWK獲取第一個欄位,即容器ID。現在,您可以在運算式中使用$CONTAINER_ID變數,而不是使用容器名稱:
$ docker container stop $CONTAINER_ID

一旦停止容器後,其狀態將更改為“已退出”。
你可以使用docker container start命令重新啟動已停止的容器。
移除容器

運行docker container ls -a命令時,您可以看到很多處於“已退出”狀態的容器。
如果您不再需要這些容器,最好將它們從記憶體中刪除;否則,他們會占用寶貴的資源。刪除容器的命令如下:
$ docker container rm <container ID>

或者,也可以使用此命令:
$ docker container rm <container name>

有時,無法刪除正在運行的容器;如果要強制刪除,可以使用命令列引數 -f 或 -force。
容器化改變了行業運行方式,將維護成本降低了50%以上,並將產品上市時間縮短了約90%。此外,相對於容器外運行,容器使應用程式更安全。
如果你發現本教程有用並希望瞭解有關 Docker 容器的更多信息,可以閱讀《Docker 的基礎知識 – Docker 18.x 的基礎知識[2]》,其中介紹了與容器化和編排相關的所有關鍵概念。
相關鏈接:
  1. https://talaikis.com/random_quotes_api/

  2. https://amzn.to/2LgQZmN

原文鏈接:https://dzone.com/articles/docker-tutorial-play-with-containers-simple-exampl

Kubernetes實戰培訓

Kubernetes應用實戰培訓將於2018年10月12日在深圳開課,3天時間帶你系統學習Kubernetes本次培訓包括:容器基礎、Docker基礎、Docker進階、Kubernetes架構及部署、Kubernetes常用物件、Kubernetes網絡、儲存、服務發現、Kubernetes的調度和服務質量保證、監控和日誌、Helm、專案實踐等,點擊下方圖片查看詳情。

赞(0)

分享創造快樂