Docker入門


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](/Users/mr.l/Library/Application Support/typora-user-images/image-20190812221942603.png)

也可以通過 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即可獲取


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM