【實踐】8.DOCKER之操作容器

1. 摘要

本文介紹Docker 的容器container的操作赴精,包括創(chuàng)建完沪、啟動和停止等息尺。容器是獨立運行的一個或一組應(yīng)用携兵,以及它們的運行態(tài)環(huán)境。對應(yīng)的掷倔,虛擬機可以理解為模擬運行的一整套操作系統(tǒng)(提供了運行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用眉孩。

2. 內(nèi)容

2.1 啟動

啟動容器有兩種方式,一種是基于鏡像新建一個容器并啟動勒葱,另外一個是將在終止狀態(tài)(exited)的容器重新啟動浪汪。
因為 Docker 的容器實在太輕量級了,很多時候用戶都是隨時刪除和新創(chuàng)建容器凛虽。

2.1.1 新建并啟動

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

例如,下面的命令輸出一個 “Hello World”凯旋,之后終止容器呀潭。


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

Hello world

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

下面的命令則啟動一個 bash 終端,允許用戶進行交互钠署。


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

root@af8bae53bdd3:/#

其中糠聪,-t 選項讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標準輸入上, -i 則讓容器的標準輸入保持打開谐鼎。

在交互模式下舰蟆,用戶可以通過所創(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

當利用 docker run 來創(chuàng)建容器時狸棍,Docker 在后臺運行的標準操作包括:

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

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

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

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

  • 從地址池配置一個 ip 地址給容器

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

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

2.1.2 啟動已終止容器

可以利用 docker container start 命令草戈,直接將一個已經(jīng)終止(exited)的容器啟動運行塌鸯。
容器的核心為所執(zhí)行的應(yīng)用程序,所需要的資源都是應(yīng)用程序運行所必需的唐片。除此之外丙猬,并沒有其它的資源∏4ィ可以在偽終端中利用 ps 或 top 來查看進程信息淮悼。

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

可見,容器中僅運行了指定的 bash 應(yīng)用揽思。這種特點使得 Docker 對資源的利用率極高袜腥,是貨真價實的輕量級虛擬化。

2.2 守護態(tài)運行

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

$ 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

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

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

此時容器會在后臺運行并不會把輸出的結(jié)果 (STDOUT) 打印到宿主機上面(輸出結(jié)果可以用 docker logs 查看)肪凛。
注: 容器是否會長久運行,是和 docker run 指定的命令有關(guān),和 -d 參數(shù)無關(guān)。
使用 -d 參數(shù)啟動后會返回一個唯一的 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 來終止一個運行中的容器汉匙。
此外拱烁,當 Docker 容器中指定的應(yīng)用終結(jié)時生蚁,容器也自動終止。
例如對于上一章節(jié)中只啟動了一個終端的容器戏自,用戶通過 exit 命令或 Ctrl+d 來退出終端時邦投,所創(chuàng)建的容器立刻終止。
終止狀態(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

處于終止狀態(tài)的容器尼摹,可以通過 docker container start 命令來重新啟動。
此外剂娄,docker container restart 命令會將一個運行態(tài)的容器終止,然后再重新啟動它玄呛。

2.4 進入容器

在使用 -d 參數(shù)時阅懦,容器啟動后會進入后臺。
某些時候需要進入容器進行操作徘铝,包括使用 docker attach 命令或 docker exec 命令耳胎,推薦大家使用 docker exec 命令,原因會在下面說明惕它。

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:/#

注意: 如果從這個 stdin 中 exit,會導致容器的停止淹魄。

exec 命令

-i -t 參數(shù)

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

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

-i -t 參數(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:/#

如果從這個 stdin 中 exit缸废,不會導致容器的停止包蓝。這就是為什么推薦大家使用 docker exec 的原因。

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

2.5 導出和導入

導出容器

如果要導出本地某個容器测萎,可以使用 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

這樣將導出容器快照到本地文件梁钾。

導入容器快照

可以使用 docker import 從容器快照文件中再導入為鏡像绳泉,例如

$ 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 或者某個目錄來導入姆泻,例如

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

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

2.6 刪除

刪除容器

可以使用 docker container rm 來刪除一個處于終止狀態(tài)的容器蟀架。例如


$ docker container rm trusting_newton

trusting_newton

如果要刪除一個運行中的容器,可以添加 -f 參數(shù)榆骚。Docker 會發(fā)送 SIGKILL 信號給容器片拍。

清理所有處于終止狀態(tài)的容器

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


$ docker container prune

3.參考

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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市碉钠,隨后出現(xiàn)的幾起案子纲缓,更是在濱河造成了極大的恐慌,老刑警劉巖喊废,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件祝高,死亡現(xiàn)場離奇詭異,居然都是意外死亡污筷,警方通過查閱死者的電腦和手機工闺,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來瓣蛀,“玉大人斤寂,你說我怎么就攤上這事【镜耄” “怎么了遍搞?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長器腋。 經(jīng)常有香客問我溪猿,道長,這世上最難降的妖魔是什么纫塌? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任诊县,我火速辦了婚禮,結(jié)果婚禮上措左,老公的妹妹穿的比我還像新娘依痊。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布胸嘁。 她就那樣靜靜地躺著瓶摆,像睡著了一般。 火紅的嫁衣襯著肌膚如雪性宏。 梳的紋絲不亂的頭發(fā)上群井,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天,我揣著相機與錄音毫胜,去河邊找鬼书斜。 笑死,一個胖子當著我的面吹牛酵使,可吹牛的內(nèi)容都是我干的荐吉。 我是一名探鬼主播,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼口渔,長吁一口氣:“原來是場噩夢啊……” “哼稍坯!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起搓劫,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎混巧,沒想到半個月后枪向,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡咧党,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年秘蛔,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片傍衡。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡深员,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出蛙埂,到底是詐尸還是另有隱情倦畅,我是刑警寧澤,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布绣的,位于F島的核電站叠赐,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏屡江。R本人自食惡果不足惜芭概,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望惩嘉。 院中可真熱鬧罢洲,春花似錦、人聲如沸文黎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至鸽粉,卻和暖如春斜脂,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背触机。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工帚戳, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人儡首。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓片任,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蔬胯。 傳聞我的和親對象是個殘疾皇子对供,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

推薦閱讀更多精彩內(nèi)容

  • 容器是鏡像的一個運行實例。比較大的不同的是氛濒,鏡像是靜態(tài)的只讀文件产场,而容器帶有運行時需要的可寫文件層。 本文記錄容器...
    wean_a23e閱讀 983評論 0 1
  • 容器是 Docker 又一核心概念舞竿。簡單的說京景,容器是獨立運行的一個或一組應(yīng)用,以及它們的運行態(tài)環(huán)境骗奖。對應(yīng)的确徙,虛擬機...
    傲劍天涯閱讀 300評論 0 0
  • 容器是 Docker 的另一個核心概念. 簡單來說, 容器是鏡像的一個運行實例. 所不同的是, 鏡像是靜態(tài)的只讀文...
    我相信你愛過gg閱讀 677評論 0 0
  • 操作容器 一、啟動 基于鏡像新建一個容器啟動 重新啟動終止狀態(tài)的容器 1. 新建并啟動 命令主要是docker r...
    snai1閱讀 124評論 0 1
  • 0x1 Docker概述 1)Docker介紹 Docker 是一個開源的應(yīng)用容器引擎执桌,基于 Go 語言 并遵從 ...
    我是李小胖閱讀 1,249評論 0 4