Docker使用筆記(二)Docker容器簡單使用

在上一節(jié)講了如何安裝docker以及一些配置的更改,本節(jié)將會初步介紹docker容器的使用抖拴。

1凑懂、運行我們的第一個容器

現(xiàn)在, 讓我們嘗試啟動第一個Docker容器虽惭。 我們可以使用docker run命令創(chuàng)建容器槽华。docker run命令提供了Docker容
器的創(chuàng)建到啟動的功能。

[05:37 shexuan@hulab ~]$ docker run --name bob_the_container -i -t ubuntu /bin/bash
Unable to find image 'ubuntu:latest' locally
Trying to pull repository docker.io/library/ubuntu ...
latest: Pulling from docker.io/library/ubuntu
473ede7ed136: Pull complete
c46b5fa4d940: Pull complete
93ae3df89c92: Pull complete
6b1eed27cade: Pull complete
Digest: sha256:29934af957c53004d7fb6340139880d23fb1952505a15d69a03af0d1418878cb
Status: Downloaded newer image for docker.io/ubuntu:latest
root@9edcf79a4252:/#

上面命令啟動運行了一個容器趟妥,并指定了多個參數(shù):

  • run docker run用來啟動一個容器猫态;
  • --name 為我們運行的容器指定一個名字,不指定的話則系統(tǒng)會生成一個名稱;
  • -i -i標(biāo)志保證容器中STDIN是開啟的亲雪, 盡管我們并沒有附著到容器中勇凭。 持久的標(biāo)準(zhǔn)輸入是交互式shell的“半邊天”;
  • -t -t標(biāo)志則是另外“半邊天”, 它告訴Docker為要創(chuàng)建的容器分配一個偽tty終端;
  • /bin/bash 為運行的容器執(zhí)行的第一個命令,這個命令啟動了一個Bash shell义辕。

在很多Docker命令中虾标, 都可以用容器的名稱來替代容器ID, 后面我們將會看到灌砖。 容器名稱有助于分辨容器璧函, 當(dāng)構(gòu)建容器和應(yīng)用程序之間的邏輯連接時, 容器的名稱也有助于從邏輯上理解連接關(guān)系基显。 具體的名稱(如web蘸吓、 db) 比容器ID和隨機容器名好記多了。 我推薦大家都使用容器名
稱撩幽, 以更加方便地管理容器库继。

容器的命名必須是唯一的。 如果試圖創(chuàng)建兩個名稱相同的容器窜醉, 則命令將會失敗宪萄。 如果要使用的容器名稱已經(jīng)存在, 可以先用docker rm命令刪除已有的同名容器后榨惰, 再來創(chuàng)建新的容器拜英。

最后,輸入exit可以退出當(dāng)前容器琅催。
若想在退出容器后自動刪除容器居凶,還可以加上--rm參數(shù)。

如果由于某種錯誤而導(dǎo)致容器停止運行恢暖,還可以通過--restart標(biāo)志,讓Docker自動重新啟動該容器狰右。 --restart標(biāo)志會檢查容器的退出代碼杰捂, 并據(jù)此來決定是否要重啟容器。 默認(rèn)的行為是Docker不會重啟容器棋蚌。

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

在本例中嫁佳, --restart標(biāo)志被設(shè)置為always。 無論容器的退出代碼是什么谷暮, Docker都會自動重啟該容器蒿往。 除了always, 還可以將這個標(biāo)志設(shè)為on-failure湿弦, 這樣瓤漏, 只有當(dāng)容器的退出代碼為非0值的時候, 才會自動重啟。 另外蔬充, on-failure還接受一個可選的重啟次數(shù)參數(shù)蝶俱。

# 當(dāng)容器退出代碼為非0時, Docker會嘗試自動重啟該容器饥漫, 最多重啟5次榨呆。
$ docker run --restart=on-failure:5 --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
2、重新啟動已經(jīng)停止的容器

在上面輸入exit后bob_the_container容器已經(jīng)停止了庸队, 接下來我們能對它做些什么呢积蜻? 如果愿意, 我們可以用start命令重新啟動一個已經(jīng)停止的容器彻消。

[21:03 shexuan@hulab ~]$ docker start bob_the_container
bob_the_container
# 也可以通過ID來指定容器
[21:09 shexuan@hulab ~]$ docker start 22e568aab98b
22e568aab98b

Docker容器重新啟動的時候竿拆, 會沿用docker run命令時指定的參數(shù)來運行, 因此我們的容器重新啟動后會運行一個交互式會話shell证膨。 此外如输,也可以用docker attach命令, 重新附著到該容器的會話上央勒。

# 先啟動停止了的容器
[21:26 shexuan@hulab ~]$ docker start bob_the_container
bob_the_container
#  使用attach命令重新附著到該容器的會話上
[21:26 shexuan@hulab ~]$ docker attach bob_the_container
root@22e568aab98b:/#
3不见、創(chuàng)建守護(hù)式容器

除了這些交互式運行的容器(interactive container) , 也可以創(chuàng)建長期運行的容器崔步。 守護(hù)式容器(daemonized container) 沒有交互式會話稳吮, 非常適合運行應(yīng)用程序和服務(wù)。
使用-d參數(shù)井濒, Docker會將容器放到后臺運行:

[21:33 shexuan@hulab ~]$ docker run --name daemon_dave -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
42b18316632c701e2ce266e49313cc274963b0bbb2241353da0f11526d403317

上面的命令創(chuàng)建了一個后臺運行的容器灶似,我們還在容器里運行了一個while 循環(huán),該循環(huán)會一直打印hello world瑞你,知道該容器或進(jìn)程停止運行酪惭。

使用docker ps我們可以看到一個正在運行的容器:

[21:33 shexuan@hulab ~]$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
42b18316632c        ubuntu              "/bin/sh -c 'while..."   4 minutes ago       Up 4 minutes                            daemon_dave

使用docker logs可以查看該容器的內(nèi)部運行情況,或稱日志:

[21:40 shexuan@hulab ~]$ docker logs daemon_dave
hello world
hello world
hello world
...
# 加上-f 參數(shù)來監(jiān)控最新日志者甲,這個參數(shù)類似于tail -f 命令的作用
[21:40 shexuan@hulab ~]$ docker logs -f daemon_dave
hello world
hello world
hello world
...
# 還可以使用--tail 參數(shù)來指定獲取日志最后指定行數(shù)
[21:45 shexuan@hulab ~]$ docker logs --tail 3 daemon_dave
hello world
hello world
hello world
# 最后你還可以組合使用--tail和-f命令來獲取容器的最新日志而不必讀取整個日志文件
[21:52 shexuan@hulab ~]$ docker logs --tail 3 -ft daemon_dave
2018-11-06T02:53:01.314952000Z hello world
2018-11-06T02:53:02.316191000Z hello world
2018-11-06T02:53:03.317513000Z hello world
2018-11-06T02:53:04.318959000Z hello world
# -t參數(shù)會輸出時間戳使得看起來更方便

在上面我們簡要介紹了如何使用docker logs來查看守護(hù)式容器的內(nèi)部運行情況春感,獲取其日志文件:

  • -f -f參數(shù)類似于tail -f,會不斷刷新輸出最新日志虏缸;
  • --tail輸出日志的最后幾行鲫懒;
  • --tail number -f 輸出最后指定行數(shù)日志并不斷刷新輸出最新日志;
  • -t 給日志加上時間戳刽辙。

最后窥岩,可以使用docker stop停止運行守護(hù)式容器:

[22:04 shexuan@hulab ~]$ docker stop daemon_dave
daemon_dave

docker stopdocker kill都可以停止運行守護(hù)式容器,但是略有區(qū)別:

  • docker stop宰缤,支持“優(yōu)雅退出”颂翼。先發(fā)送SIGTERM信號晃洒,在一段時間之后(10s)再發(fā)送SIGKILL信號。Docker內(nèi)部的應(yīng)用程序可以接收SIGTERM信號疚鲤,然后做一些“退出前工作”锥累,比如保存狀態(tài)、處理當(dāng)前請求等;
  • docker kill集歇,發(fā)送SIGKILL信號桶略,應(yīng)用程序直接退出。

更多docker日志配置可查看更改docker的日志引擎為 journald诲宇。

4际歼、查看容器內(nèi)部進(jìn)程及統(tǒng)計信息

除了容器的日志, 也可以查看容器內(nèi)部運行的進(jìn)程姑蓝。 要做到這一點鹅心, 要使用docker top命令:

[22:31 shexuan@hulab ~]$ docker top daemon_dave
UID                 PID                 PPID                C                   STIME               TTY                 TIME                CMD
root                10317               10299               0                   22:31               ?                   00:00:00            /bin/sh -c while true; do echo hello world; sleep 1; done
root                10466               10317               0                   22:31               ?                   00:00:00            sleep 1

該命令執(zhí)行后, 可以看到容器內(nèi)的所有進(jìn)程(主要還是我們的while循環(huán)) 纺荧、 運行進(jìn)程的用戶及進(jìn)程ID旭愧。

除了查看進(jìn)程信息外,還可以通過docker stats來查看一個或多個容器的統(tǒng)計信息:

[22:37 shexuan@hulab ~]$ docker stats daemon_dave
CONTAINER           CPU %               MEM USAGE / LIMIT     MEM %               NET I/O             BLOCK I/O           PIDS
daemon_dave         0.13%               952 KiB / 251.6 GiB   0.00%               648 B / 648 B       0 B / 0 B           2

我們能看到一個守護(hù)式容器的列表宙暇, 以及它們的CPU输枯、 內(nèi)存、 網(wǎng)絡(luò)I/O及存儲I/O的性能和指標(biāo)占贫。 這對快速監(jiān)控一臺主機上的一組容器非常有用桃熄。

5、在容器中創(chuàng)建新的進(jìn)程

通過docker exec命令可以在容器內(nèi)部額外啟動新進(jìn)程型奥。 可以在容器內(nèi)運行的進(jìn)程有兩種類型: 后臺任務(wù)和交互式任務(wù)瞳收。 后臺任務(wù)在容器內(nèi)運行且沒有交互需求, 而交互式任務(wù)則保持在前臺運行厢汹。

[22:55 shexuan@hulab ~]$ docker exec -d daemon_dave touch /etc/new_config_file

這里的-d標(biāo)志表明需要運行一個后臺進(jìn)程螟深, -d標(biāo)志之后, 指定的是要在內(nèi)部執(zhí)行這個命令的容器的名字以及要執(zhí)行的命令烫葬。 上面例子中的命令會在daemon_dave容器內(nèi)創(chuàng)建了一個空文件界弧, 文件名為/etc/new_config_file。 通過docker exec后臺命令厘灼, 可以在正在運行的容器中進(jìn)行維護(hù)夹纫、 監(jiān)控及管理任務(wù)咽瓷。

我們也可以在daemon_dave容器中新打開一個shell的交互式任務(wù):

[22:55 shexuan@hulab ~]$ docker exec -t -i daemon_dave /bin/bash
root@42b18316632c:/#

和啟動容器時候一樣设凹,這里的-i -t為我們執(zhí)行的進(jìn)程創(chuàng)建了TTY并捕捉STDIN。最后的/bin/bash為一個新創(chuàng)建的shell茅姜。

run, attach, exec的區(qū)別:

  • docker run通常是在新創(chuàng)建的容器中所使用的命令闪朱。 它適用于在沒有其他容器運行的情況下月匣,您想要創(chuàng)建一個容器,并且要啟動它奋姿,然后在其上運行一個進(jìn)程;
  • docker exec適用于在現(xiàn)有容器中運行命令的情況锄开。如果您已經(jīng)擁有了一個正在運行的容器,并希望更改該容器或從中獲取某些內(nèi)容称诗,那么使用“docker exec”命令就非常合適了;
  • docker attach也是相當(dāng)于繼續(xù)運行已有的容器萍悴,但是并不會另外啟動一個進(jìn)程,而是以初始docker run啟動命令的會話上寓免。
6癣诱、深入了解容器信息

除了通過docker ps命令獲取容器的信息, 還可以使用docker inspect來獲得更多的容器信息袜香。

[00:49 shexuan@hulab ~]$ docker inspect daemon_dave
[
    {
        "Id": "42b18316632c701e2ce266e49313cc274963b0bbb2241353da0f11526d403317",
        "Created": "2018-11-06T02:33:42.333222931Z",
        "Path": "/bin/sh",
        "Args": [
            "-c",
            "while\ntrue; do echo hello world; sleep 1; done"
        ],
        "State": {
            "Status": "running",
            "Running": true,
            "Paused": false,
            "Restarting": false,
            "OOMKilled": false,
            "Dead": false,
            "Pid": 10317,
            "ExitCode": 0,
            "Error": "",
            "StartedAt": "2018-11-06T03:31:21.144011748Z",
            "FinishedAt": "2018-11-06T03:05:00.01247215Z"
        },
        "Image": "sha256:ea4c82dcd15a33e3e9c4c37050def20476856a08e59526fbe533cc4e98387e39",
...
]

docker inspect命令會對容器進(jìn)行詳細(xì)的檢查撕予, 然后返回其配置信息, 包括名稱蜈首、命令实抡、網(wǎng)絡(luò)配置、基礎(chǔ)鏡像以及很多有用的數(shù)據(jù)欢策。

也可以用-f或者--format標(biāo)志來選定查看結(jié)果:

[00:53 shexuan@hulab ~]$ docker inspect --format='{{ .State.Running }}' daemon_dave
false

docker inspect支持同時指定多個容器吆寨, 并顯示每個容器的輸出結(jié)果。

7猬腰、刪除容器

如果容器已經(jīng)不再使用(已停止使用)鸟废, 可以使用docker rm命令來刪除它們。如果想刪除正在運行的容器姑荷,可以加上-f參數(shù)盒延。

[00:58 shexuan@hulab ~]$ docker rm daemon_dave
daemon_dave

目前, 還沒有辦法一次刪除所有容器鼠冕,但是可以通過下面的小技巧來一次性刪除所有容器:

[01:02 shexuan@hulab ~]$ docker rm `sudo docker ps -a -q`
9f0b544d3573
22e568aab98b

上面的docker ps命令會列出現(xiàn)有的全部容器添寺, -a標(biāo)志代表列出所有容器, 而-q標(biāo)志則表示只需要返回容器的ID而不會返回容器的其他信息懈费。這樣我們就得到了容器ID的列表计露, 并傳給了docker rm命令, 從而達(dá)到刪除所有容器的目的憎乙。

參考:
《第一本docker書》

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末票罐,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子泞边,更是在濱河造成了極大的恐慌该押,老刑警劉巖,帶你破解...
    沈念sama閱讀 210,914評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件阵谚,死亡現(xiàn)場離奇詭異蚕礼,居然都是意外死亡烟具,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,935評論 2 383
  • 文/潘曉璐 我一進(jìn)店門奠蹬,熙熙樓的掌柜王于貴愁眉苦臉地迎上來朝聋,“玉大人,你說我怎么就攤上這事囤躁〖胶郏” “怎么了?”我有些...
    開封第一講書人閱讀 156,531評論 0 345
  • 文/不壞的土叔 我叫張陵狸演,是天一觀的道長金度。 經(jīng)常有香客問我,道長严沥,這世上最難降的妖魔是什么猜极? 我笑而不...
    開封第一講書人閱讀 56,309評論 1 282
  • 正文 為了忘掉前任,我火速辦了婚禮消玄,結(jié)果婚禮上跟伏,老公的妹妹穿的比我還像新娘。我一直安慰自己翩瓜,他們只是感情好受扳,可當(dāng)我...
    茶點故事閱讀 65,381評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著兔跌,像睡著了一般勘高。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上坟桅,一...
    開封第一講書人閱讀 49,730評論 1 289
  • 那天华望,我揣著相機與錄音,去河邊找鬼仅乓。 笑死赖舟,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的夸楣。 我是一名探鬼主播宾抓,決...
    沈念sama閱讀 38,882評論 3 404
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼豫喧!你這毒婦竟也來了石洗?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,643評論 0 266
  • 序言:老撾萬榮一對情侶失蹤紧显,失蹤者是張志新(化名)和其女友劉穎讲衫,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鸟妙,經(jīng)...
    沈念sama閱讀 44,095評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡焦人,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,448評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了重父。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片花椭。...
    茶點故事閱讀 38,566評論 1 339
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖房午,靈堂內(nèi)的尸體忽然破棺而出矿辽,到底是詐尸還是另有隱情,我是刑警寧澤郭厌,帶...
    沈念sama閱讀 34,253評論 4 328
  • 正文 年R本政府宣布袋倔,位于F島的核電站,受9級特大地震影響折柠,放射性物質(zhì)發(fā)生泄漏宾娜。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,829評論 3 312
  • 文/蒙蒙 一扇售、第九天 我趴在偏房一處隱蔽的房頂上張望前塔。 院中可真熱鬧,春花似錦承冰、人聲如沸华弓。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,715評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寂屏。三九已至,卻和暖如春娜搂,著一層夾襖步出監(jiān)牢的瞬間迁霎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,945評論 1 264
  • 我被黑心中介騙來泰國打工百宇, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留欧引,地道東北人。 一個月前我還...
    沈念sama閱讀 46,248評論 2 360
  • 正文 我出身青樓恳谎,卻偏偏與公主長得像芝此,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子因痛,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,440評論 2 348

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