【實(shí)踐】8.DOCKER之操作容器

1. 摘要

本文介紹Docker 的容器container的操作,包括創(chuàng)建、啟動(dòng)和停止等。容器是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用,以及它們的運(yùn)行態(tài)環(huán)境。對(duì)應(yīng)的,虛擬機(jī)可以理解為模擬運(yùn)行的一整套操作系統(tǒng)(提供了運(yùn)行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用。

2. 內(nèi)容

2.1 啟動(dòng)

啟動(dòng)容器有兩種方式,一種是基于鏡像新建一個(gè)容器并啟動(dòng),另外一個(gè)是將在終止?fàn)顟B(tài)(exited)的容器重新啟動(dòng)。
因?yàn)?Docker 的容器實(shí)在太輕量級(jí)了,很多時(shí)候用戶都是隨時(shí)刪除和新創(chuàng)建容器。

2.1.1 新建并啟動(dòng)

所需要的命令主要為 docker run。

例如,下面的命令輸出一個(gè) “Hello World”,之后終止容器。


$ docker run ubuntu:18.04 /bin/echo 'Hello world'

Hello world

這跟在本地直接執(zhí)行 /bin/echo 'hello world' 幾乎感覺不出任何區(qū)別。

下面的命令則啟動(dòng)一個(gè) bash 終端,允許用戶進(jìn)行交互。


$ docker run -t -i ubuntu:18.04 /bin/bash

root@af8bae53bdd3:/#

其中,-t 選項(xiàng)讓Docker分配一個(gè)偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上, -i 則讓容器的標(biāo)準(zhǔn)輸入保持打開。

在交互模式下,用戶可以通過所創(chuàng)建的終端來輸入命令,例如


root@af8bae53bdd3:/# pwd

/

root@af8bae53bdd3:/# ls

bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var

當(dāng)利用 docker run 來創(chuàng)建容器時(shí),Docker 在后臺(tái)運(yùn)行的標(biāo)準(zhǔn)操作包括:

  • 檢查本地是否存在指定的鏡像,不存在就從 registry 下載

  • 利用鏡像創(chuàng)建并啟動(dòng)一個(gè)容器

  • 分配一個(gè)文件系統(tǒng),并在只讀的鏡像層外面掛載一層可讀寫層

  • 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個(gè)虛擬接口到容器中去

  • 從地址池配置一個(gè) ip 地址給容器

  • 執(zhí)行用戶指定的應(yīng)用程序

  • 執(zhí)行完畢后容器被終止

2.1.2 啟動(dòng)已終止容器

可以利用 docker container start 命令,直接將一個(gè)已經(jīng)終止(exited)的容器啟動(dòng)運(yùn)行。
容器的核心為所執(zhí)行的應(yīng)用程序,所需要的資源都是應(yīng)用程序運(yùn)行所必需的。除此之外,并沒有其它的資源??梢栽趥谓K端中利用 ps 或 top 來查看進(jìn)程信息。

root@ba267838cc1b:/# ps
  PID TTY          TIME CMD
    1 ?        00:00:00 bash
   11 ?        00:00:00 ps

可見,容器中僅運(yùn)行了指定的 bash 應(yīng)用。這種特點(diǎn)使得 Docker 對(duì)資源的利用率極高,是貨真價(jià)實(shí)的輕量級(jí)虛擬化。

2.2 守護(hù)態(tài)運(yùn)行

更多的時(shí)候,需要讓 Docker 在后臺(tái)運(yùn)行而不是直接把執(zhí)行命令的結(jié)果輸出在當(dāng)前宿主機(jī)下。此時(shí),可以通過添加 -d 參數(shù)來實(shí)現(xiàn)。
下面舉兩個(gè)例子來說明一下。
如果不使用 -d 參數(shù)運(yùn)行容器。

$ docker run ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
hello world
hello world
hello world
hello world

容器會(huì)把輸出的結(jié)果 (STDOUT) 打印到宿主機(jī)上面
如果使用了 -d 參數(shù)運(yùn)行容器。

$ docker run -d ubuntu:18.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
77b2dc01fe0f3f1265df143181e7b9af5e05279a884f4776ee75350ea9d8017a

此時(shí)容器會(huì)在后臺(tái)運(yùn)行并不會(huì)把輸出的結(jié)果 (STDOUT) 打印到宿主機(jī)上面(輸出結(jié)果可以用 docker logs 查看)。
注: 容器是否會(huì)長久運(yùn)行,是和 docker run 指定的命令有關(guān),和 -d 參數(shù)無關(guān)。
使用 -d 參數(shù)啟動(dòng)后會(huì)返回一個(gè)唯一的 id,也可以通過 docker container ls 命令來查看容器信息。

$ docker container ls
CONTAINER ID  IMAGE         COMMAND               CREATED        STATUS       PORTS NAMES
77b2dc01fe0f  ubuntu:18.04  /bin/sh -c 'while tr  2 minutes ago  Up 1 minute        agitated_wright

要獲取容器的輸出信息,可以通過 docker container logs 命令。

$ docker container logs [container ID or NAMES]
hello world
hello world
hello world
. . .

2.3 終止

可以使用 docker container stop 來終止一個(gè)運(yùn)行中的容器。
此外,當(dāng) Docker 容器中指定的應(yīng)用終結(jié)時(shí),容器也自動(dòng)終止。
例如對(duì)于上一章節(jié)中只啟動(dòng)了一個(gè)終端的容器,用戶通過 exit 命令或 Ctrl+d 來退出終端時(shí),所創(chuàng)建的容器立刻終止。
終止?fàn)顟B(tài)的容器可以用 docker container ls -a 命令看到。例如

$ docker container ls -a
CONTAINER ID        IMAGE                    COMMAND                CREATED             STATUS                          PORTS               NAMES
ba267838cc1b        ubuntu:18.04             "/bin/bash"            30 minutes ago      Exited (0) About a minute ago                       trusting_newton

處于終止?fàn)顟B(tài)的容器,可以通過 docker container start 命令來重新啟動(dòng)。
此外,docker container restart 命令會(huì)將一個(gè)運(yùn)行態(tài)的容器終止,然后再重新啟動(dòng)它。

2.4 進(jìn)入容器

在使用 -d 參數(shù)時(shí),容器啟動(dòng)后會(huì)進(jìn)入后臺(tái)。
某些時(shí)候需要進(jìn)入容器進(jìn)行操作,包括使用 docker attach 命令或 docker exec 命令,推薦大家使用 docker exec 命令,原因會(huì)在下面說明。

attach 命令

下面示例如何使用 docker attach 命令。

$ docker run -dit ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550

$ docker container ls
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
243c32535da7        ubuntu:latest       "/bin/bash"         18 seconds ago      Up 17 seconds                           nostalgic_hypatia

$ docker attach 243c
root@243c32535da7:/#

注意: 如果從這個(gè) stdin 中 exit,會(huì)導(dǎo)致容器的停止。

exec 命令

-i -t 參數(shù)

docker exec 后邊可以跟多個(gè)參數(shù),這里主要說明 -i -t 參數(shù)。

只用 -i 參數(shù)時(shí),由于沒有分配偽終端,界面沒有我們熟悉的 Linux 命令提示符,但命令執(zhí)行結(jié)果仍然可以返回。

當(dāng) -i -t 參數(shù)一起使用時(shí),則可以看到我們熟悉的 Linux 命令提示符。


$ docker run -dit ubuntu

69d137adef7a8a689cbcb059e94da5489d3cddd240ff675c640c8d96e84fe1f6

$ docker container ls

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES

69d137adef7a        ubuntu:latest "/bin/bash" 18 seconds ago      Up 17 seconds                           zealous_swirles

$ docker exec -i 69d1 bash

ls

bin

boot

dev

...

$ docker exec -it 69d1 bash

root@69d137adef7a:/#

如果從這個(gè) stdin 中 exit,不會(huì)導(dǎo)致容器的停止。這就是為什么推薦大家使用 docker exec 的原因。

更多參數(shù)說明請(qǐng)使用 docker exec --help 查看。

2.5 導(dǎo)出和導(dǎo)入

導(dǎo)出容器

如果要導(dǎo)出本地某個(gè)容器,可以使用 docker export 命令。


$ docker container ls -a

CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                    PORTS               NAMES

7691a814370e        ubuntu:18.04 "/bin/bash" 36 hours ago        Exited (0) 21 hours ago test

$ docker export 7691a814370e > ubuntu.tar

這樣將導(dǎo)出容器快照到本地文件。

導(dǎo)入容器快照

可以使用 docker import 從容器快照文件中再導(dǎo)入為鏡像,例如

$ cat ubuntu.tar | docker import - test/ubuntu:v1.0
$ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
test/ubuntu         v1.0                9d37a6082e97        About a minute ago   171.3 MB

此外,也可以通過指定 URL 或者某個(gè)目錄來導(dǎo)入,例如

$ docker import http://example.com/exampleimage.tgz example/imagerepo

注:用戶既可以使用 docker load 來導(dǎo)入鏡像存儲(chǔ)文件到本地鏡像庫,也可以使用 docker import 來導(dǎo)入一個(gè)容器快照到本地鏡像庫。這兩者的區(qū)別在于容器快照文件將丟棄所有的歷史記錄和元數(shù)據(jù)信息(即僅保存容器當(dāng)時(shí)的快照狀態(tài)),而鏡像存儲(chǔ)文件將保存完整記錄,體積也要大。此外,從容器快照文件導(dǎo)入時(shí)可以重新指定標(biāo)簽等元數(shù)據(jù)信息。

2.6 刪除

刪除容器

可以使用 docker container rm 來刪除一個(gè)處于終止?fàn)顟B(tài)的容器。例如


$ docker container rm trusting_newton

trusting_newton

如果要?jiǎng)h除一個(gè)運(yùn)行中的容器,可以添加 -f 參數(shù)。Docker 會(huì)發(fā)送 SIGKILL 信號(hào)給容器。

清理所有處于終止?fàn)顟B(tài)的容器

docker container ls -a 命令可以查看所有已經(jīng)創(chuàng)建的包括終止?fàn)顟B(tài)的容器,如果數(shù)量太多要一個(gè)個(gè)刪除可能會(huì)很麻煩,用下面的命令可以清理掉所有處于終止?fàn)顟B(tài)的容器。


$ docker container prune

3.參考

(1)操作容器 https://yeasy.gitbook.io/docker_practice/container

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 容器是鏡像的一個(gè)運(yùn)行實(shí)例。比較大的不同的是,鏡像是靜態(tài)的只讀文件,而容器帶有運(yùn)行時(shí)需要的可寫文件層。 本文記錄容器...
    wean_a23e閱讀 1,126評(píng)論 0 1
  • 容器是 Docker 又一核心概念。簡(jiǎn)單的說,容器是獨(dú)立運(yùn)行的一個(gè)或一組應(yīng)用,以及它們的運(yùn)行態(tài)環(huán)境。對(duì)應(yīng)的,虛擬機(jī)...
    傲劍天涯閱讀 340評(píng)論 0 0
  • 容器是 Docker 的另一個(gè)核心概念. 簡(jiǎn)單來說, 容器是鏡像的一個(gè)運(yùn)行實(shí)例. 所不同的是, 鏡像是靜態(tài)的只讀文...
    我相信你愛過gg閱讀 742評(píng)論 0 0
  • 操作容器 一、啟動(dòng) 基于鏡像新建一個(gè)容器啟動(dòng) 重新啟動(dòng)終止?fàn)顟B(tài)的容器 1. 新建并啟動(dòng) 命令主要是docker r...
    snai1閱讀 176評(píng)論 0 1
  • 0x1 Docker概述 1)Docker介紹 Docker 是一個(gè)開源的應(yīng)用容器引擎,基于 Go 語言 并遵從 ...
    我是李小胖閱讀 1,401評(píng)論 0 4

友情鏈接更多精彩內(nèi)容