Docker在容器內(nèi)運(yùn)行應(yīng)用程序。在一個容器內(nèi)運(yùn)行一個應(yīng)用程序需要一個命令:docker run
。
讓我們現(xiàn)在來試試
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
剛剛你運(yùn)行了你的第一個容器!
所以剛才發(fā)生了什么?讓我們來看看docker run
運(yùn)行了哪些步驟。
首先,我們指定了docker二進(jìn)制中我們想要執(zhí)行的命令,run
。docker run
組合運(yùn)行容器。
接下來,我們指定一個鏡像:ubuntu 14.04。這是我們?nèi)萜髦羞\(yùn)行的來源。docker稱這個為鏡像。在本例中,我們使用一個Ubuntu 14.04操作系統(tǒng)鏡像。
當(dāng)你指定一個鏡像,docker會查看這個鏡像是否有一次加載到你的docker主機(jī)上,如果沒有發(fā)現(xiàn),docker就會在鏡像倉庫Docker Hub下載公共鏡像。
接下來,我們告訴docker在我們的新容器內(nèi)運(yùn)行什么命令:
/bin/echo 'Hello world'
當(dāng)我們的docker創(chuàng)建一個新的Ubuntu 14.04環(huán)境,然后執(zhí)行/bin/echo
命令。我們會在命令行看到結(jié)果:
hello world
那么,我們創(chuàng)建容器之后會發(fā)生什么呢?這里Docker容器當(dāng)你輸入指令時被激活運(yùn)行。這里只要"hello word"被輸出,容器就會停止。
讓我們嘗試再次運(yùn)行docker run
,這次我們指定一個新的命令來運(yùn)行我們的容器。
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
在這里我們繼續(xù)指定docker run
命令,并運(yùn)行一個新的ubuntu:14.04的鏡像。但是我們也加了兩個新的標(biāo)示:-t
和-i
。-t
表示在新容器內(nèi)指定一個偽終端或終端,-i
表示允許我們對容器內(nèi)的STDIN進(jìn)行交互。
在我們的容器內(nèi)還指定了一個新的命令:/bin/bash
。這將在容器內(nèi)啟動bash shell
所以現(xiàn)在當(dāng)我們的容器啟動時我們會看到,我們有一個命令提示符:
root@af8bae53bdd3:/#
讓我們嘗試在容器內(nèi)運(yùn)行一些命令:
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
你可以看到我們運(yùn)行pwd
來顯示當(dāng)前目錄,這時候顯示的是我們的根目錄。我們還列出了跟目錄的列表顯示了目錄列表,通過目錄列表我們看出來想一個典型的Linux文件系統(tǒng)。
當(dāng)你完成你的命令的時候,你退出這個容器,你可以輸入exit
。
root@af8bae53bdd3:/# exit
與我們之前的容器一樣,一旦你的Bash shell退出之后,你的容器就停止了。
現(xiàn)在一個容器運(yùn)行一個命令當(dāng)使用完退出,但是這并不是有幫助的。讓我們創(chuàng)建一個容器,讓它以守護(hù)進(jìn)程的模式運(yùn)行,就像docker運(yùn)行應(yīng)用程序那樣。
我們可以這樣運(yùn)行docker run
命令:
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
等待的結(jié)果是什么?我們的hello word去哪了。讓我們看看它是怎么運(yùn)行的。它看起來應(yīng)該很熟悉,我們運(yùn)行docker但是我們指定了一個-d
標(biāo)識。-d
標(biāo)識告訴docker運(yùn)行容器在后臺模式運(yùn)行。
我們也指定了一個相同的鏡像:ubuntu:14.04
最終,我們指定命令行運(yùn)行:
/bin/sh -c "while true; do echo hello world; sleep 1; done"
這是一個荒謬的hello word進(jìn)程:一個腳本會一直輸出"hello word"
為什么不是我們看到的一大堆的"hello word"?而是docker返回的一個很長的字符串:
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
這個長的字符串叫做容器ID。它是容器的唯一標(biāo)識,所以我們可以使用它。
注意:容器ID是有點(diǎn)長并且非常的笨拙,稍后我們會看到一個斷點(diǎn)的ID,某些方面來說它是容器ID的簡化版。
我們可以根據(jù)容器ID查看"hello word"進(jìn)程發(fā)生了什么、
首先,我們要確保容器正在運(yùn)行。我們可以使用docker ps
命令來查看。docker ps
命令可以查詢docker進(jìn)程的所有容器。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1e5535038e28 ubuntu:14.04 /bin/sh -c 'while tr 2 minutes ago Up 1 minute insane_babbage
這里我們看到了后臺進(jìn)程容器。docker ps
命令會返回一些有用的信息,這里包括一個短的容器ID:1e5535038e28
。
我們還可以看到我們使用的ubuntu:14.04
來構(gòu)建它,這個命令已經(jīng)運(yùn)行,它被系統(tǒng)自動分配了名稱insane_babbage
。
注意:docker會在容器啟動的時候自動給容器命名,稍后我們可以看到我們?nèi)绾谓o容器指定名稱。
好了,現(xiàn)在我們知道它運(yùn)行。但是我們能要求它做什么呢?做到這,我們需要在我們?nèi)萜鲀?nèi)使用docker logs
命令。讓我們給系統(tǒng)自動分配名稱的容器使用這個命令。
$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .
docker logs
命令看起來想運(yùn)行在容器內(nèi)并且返回標(biāo)準(zhǔn)輸出:這種情況下我們的命令輸出hello word
太棒了!我們創(chuàng)建的第一個后臺應(yīng)用進(jìn)程運(yùn)行了!
現(xiàn)在我們可以創(chuàng)建我們自己的容器了,我們使用后,讓我們停止這個后臺進(jìn)程容器。為此讓我們使用docker stop
命令停止。
$ sudo docker stop insane_babbage
insane_babbage
docker stop
命令會通知docker停止正在運(yùn)行的容器。如果它成功了,它將返回剛剛停止的容器名稱。
讓我們通過docker ps
命令來檢查它是否還工作。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
太好了,我們的容器停止了。