Docker入門

c旋兒 發表於2019-08-13

Docker入門

上一節中,我們瞭解到了Docker 的一些基本知識點,它的一些核心概念,Docker的使用安裝等。此篇文章我們對 Docker 進行入門講解

Docker 基本指令

檢視Docker 基本資訊

首先,我們會檢視Docker 是否能夠正常執行

使用 docker info 檢視 Docker 程式是否存在,功能是否正常

上面我們使用了 docker info 指令,該命令會返回所有容器和映象的數量、Docker 使用的執行驅動和儲存驅動,以及Docker 的基本配置

Docker 是基於客戶端-伺服器架構的。它有一個 Docker 程式,既能作為客戶端,又能作為服務端。作為客戶端時,docker 程式向 Docker 守護程式傳送請求,然後再對返回的請求結果進行處理。

執行容器

現在,我們嘗試啟動第一個容器,我們可以使用docker run方法建立容器,docker run 提供了容器的建立到啟動的過程。docker run 的執行流程如下圖所示:

現在我們開始執行一條指令docker run -i -t ubuntu /bin/bash,-i 標誌保證容器中的 STDIN 時開啟的,儘管我們並沒有附著到容器中。持久的標準輸入時互動式shell 的"半邊天",-t 標誌則是另外"半邊天",它告訴 Docker 為要建立的容器分配一個 tty 終端。這樣,docker 才能提供一個互動式的 shell 。示例中的 ubuntu 是一個常備映象,也被稱為基礎映象,它由Docker 公司提供並儲存在 Docker Hub Registry 上。

隨後,Docker 在檔案系統內部利用這個映象建立了一個新的容器。該容器擁有自己的網路、IP地址,以及一個用來和宿主機通訊的橋接網路介面。最後,我們告訴 Docker 在新容器內要執行什麼命令,我們在容器中運用 /bin/bash 建立了一個 Bash Shell。

使用容器

現在,我們已經切換到了新的容器中

容器ID 是@18178c34cd5a,這是一個完整的 ubuntu 系統,下面我們就來研究一下這個系統,你可以使用

hostname獲取主機名

你會發現主機名和 root 後面的字串一致,也就是說root 後面其實跟的是主機ID。

我們再來看看 /etc/hosts 檔案,如下所示

還可以檢視容器中執行的程式,ps -aux用於查詢容器中的進行程式

接下來我們要幹什麼?安裝一個軟體包?安裝一下 vim 軟體吧,使用apt-get update && apt-get install vim 進行安裝。通過上述命令,我們可以在Ubuntu宿主機上使用 vim 口令和語法了。

當你想退出時,直接使用 exit 就退回宿主機的命令列了。

那麼這個容器怎麼樣了?容器現在已經停止執行,只有在制定的/bin/bash 處於執行狀態時,容器才會處於執行狀態。一旦退出,容器也就停止了執行。

但是容器還是存在的,你可以使用 docker ps -a檢視系統中的容器列表

預設情況下,使用 docker ps 能夠列出所有正在執行的容器列表,使用 docker ps -a 列出系統出所有的容器列表包括正在執行的和已經停止的。

容器命名

Docker 會為我們建立的每個容器自動生成一個隨機的名稱。例如我們上面建立的 /bin/bash 的名稱,如果想要指定名稱,通過 --name 標誌實現,例如sudo docker --name cxuan_container -i -t ubuntu /bin/bash

上述命令會為你建立一個 cxuan_container 的ubuntu 映象,你可以使用 docker ps -a 來檢視最近的一個映象。

容器的名稱必須是唯一的,而且有效的名稱能夠幫助我們理清楚上下級關係,所以明明很重要!!!

重新啟動已經停止的容器

例如,我使用docker ps命令沒有發現容器正在啟動

但是你可以使用 docker start cxuan_container 啟動指定的container。

重新使用 docker ps 檢視活躍的docker 容器

也可以直接根據container id進行啟動,我先用 docker ps -a 檢視一下所有的container

比如我想啟動containerId 為 18178c34cd5a 這個容器,就直接使用 docker start 18178c34cd5a,啟動完成後會直接輸出 containerId。

重新查詢現在正在執行的 docker container ,發現兩個都在執行了

附著到容器上

Docker 容器重新啟動的時候,會沿用docker run 命令時指定的引數來執行,因此我們容器重新啟動後會執行一個互動式會話shell。此外,我們也可以用 docker attach命令,重新附著該容器到會話上

image-20190812221942603

也可以通過 docker attach containerId 的方式附著到會話上,如下所示

如果退出 shell 程式,容器也會隨之停止執行

建立守護式容器

除了這些互動式執行的容器,我們也可以建立長期執行的容器。守護式容器沒有互動式會話,非常適合執行應用程式和服務。大多數情況下我們需要以守護式來執行我們的容器。下面我們建立一個守護式容器

上面的示例中使用了 -d ,因此 Docker 會將容器放在後臺進行。

我們還在容器要執行的命令列裡使用了一個 while 迴圈,該迴圈會一致列印 hello world 直到容器或者程式停止執行。

容器內部都在幹什麼

上面的示例我們建立了一個 docker 的守護式程式,程式裡面一直在使用 while 進行迴圈輸出 hello world,為了探究容器內部都在做什麼,我們使用docker logs 命令來獲取容器的日誌,如下

可以看到,其內部一直在做while 迴圈並輸出 hello world,Docker 會輸出最後幾條日誌並返回,我們可以使用 -f 引數來監控Docker 的日誌,這與 tail -f 命令非常像

我們在日誌的迴圈輸出中加了幾個空行,能讓你直觀的感受到我們正在監控 docker 日誌的執行過程,你可以使用 control + c 來退出監控。

我們也可以跟蹤日誌的某一片段,例如,可以使用 docker logs --tail 10 daemon_dave獲取日誌的最後10行內容。另外,也可以使用 docker logs --tail 0 -f daemon_dave 命令來追蹤某個容器的最新日誌而不必讀取整個日誌檔案

追蹤最新日誌:

其實可以看到,日誌一直在迴圈輸出,沒有顯示之前的日誌資訊。

為了讓除錯更加簡單,我們可以使用 -t 來為每條日誌加上時間戳,如下

檢視容器內的程式

除了容器的日誌,我們也可以檢視容器內部執行的程式,為了做到這一點,我們使用docker top命令

執行命令後,我們看到容器內的所有程式,執行程式的使用者,時間,執行指令

容器內部執行程式

在 Docker 1.3 之後,我們可以通過 docker exec 命令在容器內部額外啟動新程式。可以在容器內部執行的程式有兩種型別: 後臺任務和互動式任務。後臺任務在容器內部執行並且沒有互動需求,而互動式任務保持在前臺執行。對於需要在容器內部開啟的 shell 任務,互動式任務還是很實用的,下面是一個後臺任務的例子

這裡的標誌 -d 表示是一個後臺程式。-d 標誌之後,跟的是要在內部建立程式的名字以及要執行的命令,上面的例子會在daemon_dave 之後建立了一個新檔案,檔名為/etc/new_configP_file ,通過 docker exec 後臺命令,我們可以在正在執行的容器中進行維護、監控以及任務管理。

我們也可以在容器內部開啟一個互動式任務,如下

因此你也可以很直觀的看出互動式任務後臺任務之間的區別:互動式任務可以進行執行環境的切換,而後臺任務一旦執行無法切換,只能進行停止或者開始

上面的-t-i 標誌為我們的執行建立了 TTY 並捕捉 STDIN。接著我們指定了要在容器內部執行的名稱以及要執行的命令,在上面的例子中,這條命令會在 daemon_dave 容器中建立一個新的 bash 會話,有了這個會話,我們就可以在該容器中執行其他命令了。

tty(終端裝置的統稱):
在UNIX系統中,計算機顯示器通常被稱為控制檯終端(Console)。它模擬了型別為Linux的一種終端(TERM=Linux),並且有一些裝置特殊檔案與之相關聯:tty0、tty1、tty2等。這些檔案賦予了linux同時處理多工,多視窗切換的能力。

STDIN是標準輸入,一般指鍵盤輸入到緩衝區裡的東西。

其他還有

stdout(Standardoutput)標準輸出

stderr(Standarderror)標準錯誤

停止守護式程式

要停止守護式程式,需要執行 docker stop命令,例如

也可以停止指定的 containerId,例如

Docker stop 命令會像 Docker 容器程式傳送 SIGTERM 訊號,如果你想快速停止某個容器,也可以使用 docker kill 命令來向程式傳送 SIGKILL 訊號。

可以使用 docker ps來檢視正在執行中的 docker 容器,還有一個很實用的命令 docker ps -n x,該命令會顯示最後 x 個容器,不論這些容器是正在執行還是已經停止。

自動重啟容器

由於某種錯誤而導致容器停止執行,可以使用 --restart 命令來重啟容器。--restart 會檢查容器的退出程式碼,並據此來決定是否要重啟容器。預設的行為是 Docker 不會重啟容器。

docker run --restart=always --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1;done"

--restart 標誌被設定為 always。無論容器的退出程式碼是什麼,Docker 都會自動重啟該容器。除了 always,我們可以將這個標誌設定為 on-failure,這樣,只有當容器的退出程式碼為非0 的時候,才會自動重啟。另外,on-failure 還接受一個可選的重啟次數,如 : --restart=on-failure:5

深入容器

除了使用 docker ps 命令獲取正在執行的容器資訊,還可以使用 docker inspect 來獲取更多的容器資訊

下面還有很多資訊

我們還可以使用 -f 或者 --format 標誌選定檢視結果。

刪除容器

如果容器已經不在使用,可以使用 docker rm來刪除,如下

目前,還沒有辦法刪除所有的容器,不過可以通過下面的小技巧來刪除所有的容器

注意:正在執行的docker 容器是無法刪除的,你必須先停止容器的執行,使用 docker stop 或者 docker kill 停止容器,然後才可以刪除。

總結

本能文章作為Docker 的入門,主要包括Docker對容器的一些基本用法:

  • 檢視Docker 基本資訊
  • 如何執行一個容器
  • 給容器命名
  • 重啟啟動容器
  • 附著容器
  • 建立守護式容器
  • 容器日誌
  • 容器內部執行容器
  • 容器停止
  • 自動重啟容器
  • 容器刪除

下一篇文章我們會介紹使用 Docker 映象和倉庫

公眾號提供 優質Java資料 以及CSDN免費下載 許可權,歡迎你關注我

文章參考:

http://www.cloud.tencent.com/developer/article/1341777

《第一本Docker書》

想要獲取電子書連結?關注上面公眾號,回覆002即可獲取