在上一節(jié)的用戶指南,我們開(kāi)始了我們的第一個(gè)容器。我們使用docker run命令啟用了兩個(gè)容器
在這個(gè)過(guò)程中我們了解了幾個(gè)docker命令:
docker ps 列出容器docker logs顯示容器的標(biāo)準(zhǔn)輸出docker stop停止正在運(yùn)行的容器提示:我們有另外一種方法來(lái)學(xué)習(xí)
docker命令,與用戶交互
docker客戶端非常簡(jiǎn)單。你可以使用docker的每一個(gè)標(biāo)示和參數(shù)組合來(lái)進(jìn)行你的操作。
# Usage: [sudo] docker [flags] [command] [arguments] ..
# Example:
$ docker run -i -t ubuntu /bin/bash
這時(shí)候我們使用docker version命令來(lái)返回安裝的docker客戶端和進(jìn)程信息。
這個(gè)命令不僅返回了您使用的docker客戶端版本信息,還返回了docker的編程語(yǔ)言GO的版本信息。
Client version: 0.8.0
Go version (client): go1.2
Git commit (client): cc3a8c8
Server version: 0.8.0
Git commit (server): cc3a8c8
Go version (server): go1.2
Last stable version: 0.8.0
我們可以通過(guò)只輸入docker沒(méi)有任何其它選項(xiàng)來(lái)查看docker客戶端所有的命令。
$ sudo docker
您將看到所有當(dāng)前可用列表:
Commands:
attach Attach to a running container
build Build an image from a Dockerfile
commit Create a new image from a container's changes
. . .
你可以更深入的去了解docker命令的使用。
試著輸入Docker [command],這里會(huì)看到docker命令的使用方法:
$ sudo docker attach
Help output . . .
或者你可以再docker命令中使用--help標(biāo)示
$ sudo docker images --help
這將顯示所有的描述信息和可用的標(biāo)示:
Usage: docker attach [OPTIONS] CONTAINER
Attach to a running container
--no-stdin=false: Do not attach stdin
--sig-proxy=true: Proxify all received signal to the process (even in non-tty mode)
注意:你可以看到一個(gè)完整的docker命令列表。
現(xiàn)在我們已經(jīng)學(xué)習(xí)了更多的docker命令,我們需要學(xué)習(xí)在容器中運(yùn)行更多重要的事情。到目前為止我們已經(jīng)運(yùn)行的容器沒(méi)有什么特別用處。讓我們通過(guò)在docker運(yùn)行一個(gè)web應(yīng)用程序?qū)嵗齺?lái)了解。
在我們的web應(yīng)用中,我們將運(yùn)行一個(gè)python應(yīng)用。讓我們先從docker run命令開(kāi)始。
$ sudo docker run -d -P training/webapp python app.py
讓我們來(lái)回顧一下我們的命令。我們指定了-d和-P兩個(gè)標(biāo)示。我們已經(jīng)知道的是-d標(biāo)示是讓docker容器在后臺(tái)運(yùn)行。新的-P標(biāo)示通知Docker所需的網(wǎng)絡(luò)端口映射從主機(jī)映射到我們的容器內(nèi)?,F(xiàn)在讓我們看看我們的web應(yīng)用程序。
我們指定了training/web鏡像。這個(gè)預(yù)先建立好的鏡像被我們創(chuàng)建后就已經(jīng)包含了簡(jiǎn)單的python應(yīng)用程序環(huán)境。
最好,我們指定一個(gè)容器來(lái)運(yùn)行:python
注意:你可以在命令參考和Docker run參考看到更多
docker run命令的細(xì)節(jié)
現(xiàn)在我們使用docker ps查看我們正在運(yùn)行的容器。
$ sudo docker ps -l
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
你可以看到我們?cè)?code>docker ps中已經(jīng)指定了新的標(biāo)示-l。這通知docker ps命令返回最后的容器的狀態(tài)。
注意:默認(rèn)情況下,
docker ps命令只顯示運(yùn)行中的容器。如果你還想看已經(jīng)停止的容器,請(qǐng)加上-a標(biāo)示。
我們可以看到一些細(xì)節(jié),與我們第一次運(yùn)行docker ps命令的時(shí)候相比,這里多了一個(gè)重要的列PORTS。
PORTS
0.0.0.0:49155->5000/tcp
我們通過(guò)docker run中使用-P標(biāo)示。Docker中開(kāi)放映射到我們主機(jī)的端口。
注意:當(dāng)我們學(xué)習(xí)如果構(gòu)建鏡像的時(shí)候,我們將了解更多關(guān)于如何使用docker端口鏡像的內(nèi)容。
在這種情況下,docker開(kāi)放了5000端口(默認(rèn)Python端口)映射到主機(jī)端口49155上。
Docker可以配置綁定網(wǎng)絡(luò)端口。在最后一個(gè)例子中-P標(biāo)示,是-p 5000的快捷方式,-p 5000可以使端口5000映射到外部的端口(49000到49900端口)。我們也可以指定-p標(biāo)示來(lái)指定端口。舉例:
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
他將容器的5000端口映射到我們本地主機(jī)5000端口.現(xiàn)在你可能會(huì)問(wèn):為什么我們只使用1對(duì)1端口映射到Docker容器而不是映射到高端口?1:1映射端口只能到你本地主機(jī)的端口。假設(shè)你想要測(cè)試兩個(gè)Python應(yīng)用程序,兩個(gè)容器內(nèi)綁定到端口5000,沒(méi)有足夠的docker的端口映射你只能訪問(wèn)其中一個(gè)。
所以,現(xiàn)在我們打開(kāi)瀏覽器訪問(wèn)端口49155。
http://wiki.jikexueyuan.com/project/docker/images/webapp1.png" alt="應(yīng)用訪問(wèn)" />
我們的應(yīng)用程序可以訪問(wèn)了!
注意:如果你在windows OS X或者Linux上使用boot2docker,您將需要制定虛擬主機(jī)IP,而不是使用本地主機(jī),你可以通過(guò)運(yùn)行boot2docker shell。
$ boot2docker ip
The VM's Host only interface IP address is: 192.168.59.103
在這種情況下你可以通過(guò)http://192.168.59.103:49155訪問(wèn)上面的例子。
使用docker ps命令會(huì)返回映射端口,就是有點(diǎn)笨手笨腳的。對(duì)此,docker提供了一種快捷方式:docker port。使用docker port可以查看指定(ID或者名字的)容器的某個(gè)確定端口映射到宿主機(jī)的端口號(hào)。
$ sudo docker port nostalgic_morse 5000
0.0.0.0:49155
在這種情況下,我們看到容器的5000端口映射到了宿主機(jī)的的49155端口。
讓我們看看我們的容器中的應(yīng)用程序都發(fā)生了什么,使用我們學(xué)習(xí)到的另一個(gè)命令docker logs來(lái)查看。
$ sudo docker logs -f nostalgic_morse
* Running on http://0.0.0.0:5000/
10.0.2.2 - - [23/May/2014 20:16:31] "GET / HTTP/1.1" 200 -
10.0.2.2 - - [23/May/2014 20:16:31] "GET /favicon.ico HTTP/1.1" 404 -
這次我們添加了一個(gè)標(biāo)示-f。這將使docker log命令中使用tail -f來(lái)查看容器標(biāo)準(zhǔn)輸出。這里我們從應(yīng)用程序日志的5000端口的訪問(wèn)日志條目。
我們除了可以查看容器日志,我們還可以使用docker top來(lái)查看容器進(jìn)程:
$ sudo docker top nostalgic_morse
PID USER COMMAND
854 root python app.py
這里我們可以看到python app.py在容器里唯一進(jìn)程。
最后,我們可以使用docker inspect來(lái)查看Docker的底層信息。它會(huì)返回一個(gè)JSON文件記錄docker容器的配置和狀態(tài)信息。
$ sudo docker inspect nostalgic_morse
來(lái)讓我們看下JSON的輸出。
[{
"ID": "bc533791f3f500b280a9626688bc79e342e3ea0d528efe3a86a51ecb28ea20",
"Created": "2014-05-26T05:52:40.808952951Z",
"Path": "python",
"Args": [
"app.py"
],
"Config": {
"Hostname": "bc533791f3f5",
"Domainname": "",
"User": "",
. . .
我們也可以針對(duì)我們想要的信息進(jìn)行過(guò)濾,例如,返回容器的IP地址,如下:
$ sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' nostalgic_morse
172.17.0.5
好吧,我們看到WEB應(yīng)用程序工作。現(xiàn)在我們通過(guò)使用docker stop命令來(lái)停止名為 nostalgic_morse 的容器:
$ sudo docker stop nostalgic_morse
nostalgic_morse
現(xiàn)在我們使用docker ps命令來(lái)檢查容器是否停止了。
哎呀!剛才你停止了另一個(gè)開(kāi)發(fā)人員所使用的容器。這里你現(xiàn)在有兩個(gè)選擇:您可以創(chuàng)建一個(gè)新的容器或者重新啟動(dòng)舊的。讓我們啟動(dòng)我們之前的容器:
$ sudo docker start nostalgic_morse
nostalgic_morse
現(xiàn)在運(yùn)行docker ps -l來(lái)查看正在運(yùn)行的容器,或者通過(guò)URL訪問(wèn)來(lái)查看我們的應(yīng)用程序是否響應(yīng)。
注意:也可以使用
docker restart命令來(lái)停止容器或然后再啟動(dòng)容器。
你的同事告訴你他們已經(jīng)完成了在容器上的工作,不在需要容器了。讓我們使用docker rm命令來(lái)刪除它:
$ sudo docker rm nostalgic_morse
Error: Impossible to remove a running container, please stop it first or use -f
2014/05/24 08:12:56 Error: failed to remove one or more containers
發(fā)生了什么?實(shí)際上,我們不能刪除正在運(yùn)行的容器。這避免你意外刪除了可能需要的運(yùn)行中的容器。讓我們先停止容器,再試一次。
$ sudo docker stop nostalgic_morse
nostalgic_morse
$ sudo docker rm nostalgic_morse
nostalgic_morse
現(xiàn)在我們停止并刪除了容器。
注意:刪除容器是最后一步!