在上一節(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 stop
和docker 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書》