操作Docker容器

容器是Docker的另一個核心概念。簡單來說帝嗡,容器是鏡像的一個運(yùn)行實(shí)例峡蟋。所不同的是坟桅,鏡像是靜態(tài)的只讀文件,而容器帶有運(yùn)行時需要的可寫文件層蕊蝗。如果認(rèn)為虛擬機(jī)是模擬運(yùn)行的一整套操作系統(tǒng)(包括內(nèi)核仅乓、應(yīng)用運(yùn)行態(tài)環(huán)境和其他系統(tǒng)環(huán)境)和跑在上面的應(yīng)用,那么Docker容器就是獨(dú)立運(yùn)行的一個(或一組)應(yīng)用蓬戚,以及它們必需的運(yùn)行環(huán)境夸楣。

創(chuàng)建容器

新建容器 docker create

可以使用docker create命令新建一個容器,例如:

$ docker create -it ubuntu:latest
af8f4f922dafee22c8fe6cd2ae11d16e25087d61f1b1fa55b36e94db7ef45178
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af8f4f922daf ubuntu:latest "/bin/bash" 17 seconds ago Created silly_euler

使用docker create命令新建的容器處于停止?fàn)顟B(tài)子漩,可以使用docker start命令來啟動它豫喧。
Create命令和后續(xù)的run命令支持的選項(xiàng)都十分復(fù)雜,主要包括如下幾大類:與容器運(yùn)行模式相關(guān)幢泼、與容器和環(huán)境配置相關(guān)紧显、與容器資源限制和安全保護(hù)相關(guān)。

啟動容器 docker start

使用docker start命令來啟動一個已經(jīng)創(chuàng)建的容器缕棵,例如啟動剛創(chuàng)建的ubuntu容器:

$ docker start af
af

此時孵班,通過docker ps命令可以查看一個運(yùn)行中的容器:

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af8f4f922daf ubuntu:latest "/bin/bash" 2 minutes ago Up 7 seconds silly_euler

新建并啟動容器 docker run

除了創(chuàng)建容器后通過start命令來啟動,也可以直接新建并啟動容器招驴。所需要的命令主要為docker run篙程,等價于先執(zhí)行docker create命令,再執(zhí)行docker start命令别厘。
例如虱饿,下面的命令輸出一個“Hello World”,之后容器自動終止:

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

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

  1. 檢查本地是否存在指定的鏡像氮发,不存在就從公有倉庫下載;
  2. 利用鏡像創(chuàng)建一個容器雕蔽,并啟動該容器折柠;
  3. 分配一個文件系統(tǒng)給容器,并在只讀的鏡像層外面掛載一層可讀寫層批狐;
  4. 從宿主主機(jī)配置的網(wǎng)橋接口中橋接一個虛擬接口到容器中扇售;
  5. 從網(wǎng)橋的地址池配置一個IP地址給容器;
  6. 執(zhí)行用戶指定的應(yīng)用程序嚣艇;
  7. 執(zhí)行完畢后容器被自動終止承冰。

下面的命令啟動一個bash終端,允許用戶進(jìn)行交互:

$ docker run -it ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#

其中食零,-t選項(xiàng)讓Docker分配一個偽終端(pseudo-tty)并綁定到容器的標(biāo)準(zhǔn)輸入上困乒,-i則讓容器的標(biāo)準(zhǔn)輸入保持打開。更多的命令選項(xiàng)可以通過man docker -run命令來查看贰谣。

守護(hù)態(tài)運(yùn)行 docker run -d

更多的時候娜搂,需要讓Docker容器在后臺以守護(hù)態(tài)Daemonized)形式運(yùn)行迁霎。此時,可以通過添加- d參數(shù)來實(shí)現(xiàn)百宇。
例如下面的命令會在后臺運(yùn)行容器:

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

容器啟動后會返回一個唯一的id考廉,也可以通過 docker ps命令來查看容器信息。
此時携御,要獲取容器的輸出信息昌粤,可以如下使用docker logs命令:

$ docker logs ce5
hello world
hello world
hello world
. . .

終止容器 docker stop

可以使用docker stop來終止一個運(yùn)行中的容器。該命令的格式為docker stop [-t|--time[=10]][CONTAINER...]啄刹。
該首先向容器發(fā)送SIGTERM信號涮坐,等待一段超時時間(默認(rèn)為10秒)后,再發(fā)送SIGKILL信號來終止容器誓军。
docker kill命令會直接發(fā)送SIGKILL信號來強(qiáng)行終止容器袱讹。

進(jìn)入容器

在使用-d參數(shù)時,容器啟動后會進(jìn)入后臺谭企,用戶無法看到容器中的信息廓译,也無法進(jìn)行操作。
這個時候如果需要進(jìn)入容器進(jìn)行操作债查,有多種方法非区,包括使用官方的attach或exec命令,以及第三方的nsenter工具等盹廷。下面分別介紹一下征绸。

attach命令

$ docker run -itd ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds
nostalgic_hypatia
$ docker attach nostalgic_hypatia
root@243c32535da7:/#

但是使用attach命令有時候并不方便。當(dāng)多個窗口同時用attach命令連到同一個容器的時候俄占,所有窗口都會同步顯示管怠。當(dāng)某個窗口因命令阻塞時,其他窗口也無法執(zhí)行操作了缸榄。

exec命令

Docker從1.3.0版本起提供了一個更加方便的exec命令渤弛,可以在容器內(nèi)直接執(zhí)行任意命令。該命令的基本格式為
比較重要的參數(shù)有:

  • -i甚带,--interactive=true|false:打開標(biāo)準(zhǔn)輸入接受用戶輸入命令她肯,默認(rèn)為
    false;
  • --privileged=true|false:是否給執(zhí)行命令以高權(quán)限鹰贵,默認(rèn)為false晴氨;
  • -t,--tty=true|false:分配偽終端碉输,默認(rèn)為false籽前;
  • -u,--user="":執(zhí)行命令的用戶名或ID。
    例如進(jìn)入到剛創(chuàng)建的容器中枝哄,并啟動一個bash:
$ docker exec -it 243c32535da7 /bin/bash
root@243c32535da7:/#

nsenter工具

在util-linux軟件包版本2.23+中包含nsenter工具肄梨。如果系統(tǒng)中的util-linux包沒有該命令,可以按照下面的方法從源碼安裝:

$ cd /tmp; curl https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util?linux-2.24.tar.gz | tar -zxf-; cd util-linux-2.24;
$ ./configure --without-ncurses
$ make nsenter && cp nsenter /usr/local/bin

為了使用nsenter連接到容器膘格,還需要找到容器進(jìn)程的PID峭范,可以通過下面的命令獲炔扑伞:

PID=$(docker inspect --format "{{ .State.Pid }}" <container>)

通過這個PID瘪贱,就可以連接到這個容器:

$ nsenter --target $PID --mount --uts --ipc --net --pid

下面給出一個完整的例子,通過nsenter命令進(jìn)入容器:

$ docker run -idt ubuntu
243c32535da7d142fb0e6df616a3c3ada0b8ab417937c853a9e1c251f499f550
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
243c32535da7 ubuntu:latest "/bin/bash" 18 seconds ago Up 17 seconds
nostalgic_hypatia
$ PID=$(docker-pid 243c32535da7)
10981
$ nsenter --target 10981 --mount --uts --ipc --net --pid
root@243c32535da7:/#

ip netns操作容器網(wǎng)絡(luò)

ip netns exec $PID ip link set eth0 up
ip netns exec $PID ip route add default via 172.17.0.1

刪除容器

可以使用docker rm命令來刪除處于終止或退出狀態(tài)的容器辆毡,命令格式為docker rm [-f|--force][-l|--link][-v| --volumes]CONTAINER[CONTAINER...]菜秦。
如果要直接刪除一個運(yùn)行中的容器,可以添加-f參數(shù)舶掖。Docker會先發(fā)送SIGKILL信號給容器球昨,終止其中的應(yīng)用,之后強(qiáng)行刪除眨攘,如下所示:

$ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world;
sleep 1; done"
2aed76caf8292c7da6d24c3c7f3a81a135af942ed1707a79f85955217d4dd594
$ docker rm 2ae
Error response from daemon: You cannot remove a running container. Stop the
container before attempting removal or use -f
2016/07/03 09:02:24 Error: failed to remove one or more containers
$ docker rm -f 2ae
2ae
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末主慰,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鲫售,更是在濱河造成了極大的恐慌共螺,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,406評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件情竹,死亡現(xiàn)場離奇詭異藐不,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)秦效,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,395評論 3 398
  • 文/潘曉璐 我一進(jìn)店門雏蛮,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人阱州,你說我怎么就攤上這事挑秉。” “怎么了苔货?”我有些...
    開封第一講書人閱讀 167,815評論 0 360
  • 文/不壞的土叔 我叫張陵犀概,是天一觀的道長。 經(jīng)常有香客問我蒲赂,道長阱冶,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,537評論 1 296
  • 正文 為了忘掉前任滥嘴,我火速辦了婚禮木蹬,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己镊叁,他們只是感情好尘颓,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,536評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晦譬,像睡著了一般疤苹。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上敛腌,一...
    開封第一講書人閱讀 52,184評論 1 308
  • 那天卧土,我揣著相機(jī)與錄音,去河邊找鬼像樊。 笑死尤莺,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的生棍。 我是一名探鬼主播颤霎,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼涂滴!你這毒婦竟也來了友酱?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,668評論 0 276
  • 序言:老撾萬榮一對情侶失蹤柔纵,失蹤者是張志新(化名)和其女友劉穎缔杉,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體首量,經(jīng)...
    沈念sama閱讀 46,212評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡壮吩,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,299評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了加缘。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鸭叙。...
    茶點(diǎn)故事閱讀 40,438評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖拣宏,靈堂內(nèi)的尸體忽然破棺而出沈贝,到底是詐尸還是另有隱情,我是刑警寧澤勋乾,帶...
    沈念sama閱讀 36,128評論 5 349
  • 正文 年R本政府宣布宋下,位于F島的核電站,受9級特大地震影響辑莫,放射性物質(zhì)發(fā)生泄漏学歧。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,807評論 3 333
  • 文/蒙蒙 一各吨、第九天 我趴在偏房一處隱蔽的房頂上張望枝笨。 院中可真熱鬧,春花似錦、人聲如沸横浑。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,279評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽徙融。三九已至洒缀,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間欺冀,已是汗流浹背树绩。 一陣腳步聲響...
    開封第一講書人閱讀 33,395評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留脚猾,地道東北人葱峡。 一個月前我還...
    沈念sama閱讀 48,827評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像龙助,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蛛芥,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,446評論 2 359

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

  • 容器是 Docker 的另一個核心概念. 簡單來說, 容器是鏡像的一個運(yùn)行實(shí)例. 所不同的是, 鏡像是靜態(tài)的只讀文...
    我相信你愛過gg閱讀 687評論 0 0
  • 容器是鏡像的一個運(yùn)行實(shí)例提鸟。比較大的不同的是,鏡像是靜態(tài)的只讀文件仅淑,而容器帶有運(yùn)行時需要的可寫文件層称勋。 本文記錄容器...
    wean_a23e閱讀 989評論 0 1
  • 有了鏡像的基礎(chǔ),下面就開始創(chuàng)建容器吧涯竟。Docker 容器非常輕量級赡鲜,隨時都可以創(chuàng)建和刪除,非常方便庐船。 創(chuàng)建并啟動容...
    yongxinz閱讀 236評論 0 2
  • 一:創(chuàng)建容器 docker create [options] 鏡像名 [command] [arg ....] (...
    程序猿小小白閱讀 510評論 0 0
  • Docker是一種輕量級的虛擬化技術(shù)银酬,同時是一個開源的應(yīng)用容器運(yùn)行環(huán)境搭建平臺,可以讓開發(fā)者以便捷方式打包應(yīng)用到一...
    82a7fe2508f4閱讀 348評論 0 0