在上一節的 Docker 用戶指南中,我們啟動了我們的第一個容器。而后邊的例子中我們使用?`docker run`?命令啟動了兩個容器
* 與前臺進行交互的容器
* 以進程方式在后臺運行的容器
在這個過程中,我們學習到了幾個 Docker 命令:
* `docker ps`?列出容器
* `docker logs`?顯示容器的標準輸出
* `docker stop`?停止正在運行的容器
> 提示:另一種學習?`docker`?命令的方式就是查看我們的?[交互式教程頁面。](https://www.docker.com/tryit/)
`docker`?客戶端非常簡單 。Docker 的每一項操作都是通過命令行來實現的,而每一條命令行都可以使用一系列的標識(flags)和參數。
~~~
# Usage: [sudo] docker [flags] [command] [arguments] ..
# Example:
$ docker run -i -t ubuntu /bin/bash
~~~
讓我們看看這個使用?`docker version`?命令的操作,它將返回當前安裝的 Docker 客戶端和進程的版本信息。
~~~
$ sudo docker version
~~~
這個命令不僅返回了您使用的 Docker 客戶端和進程的版本信息,還返回了 GO 語言的版本信息( Docker的編程語言 )。
~~~
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
~~~
## 查看一下 Docker 客戶端都能做什么
我們可以通過只輸入不附加任何參數的?`docker`?命令來運行 docker 二進制文件,這樣我們就會查看到 Docker 客戶端的所有命令選項。
~~~
$ sudo docker
~~~
會看到當前可用的所有命令行列表:
~~~
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 命令使用方法。
試著輸入 Docker?`[command]`,這里會看到 docker 命令的使用方法:
~~~
$ sudo docker attach
Help output . . .
~~~
或者你可以通過在 docker 命令中使用?`--help`?標識(flags)
~~~
$ sudo docker images --help
~~~
這將返回所有的幫助信息和可用的標識(flags):
~~~
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)
~~~
> 注意:你可以點擊[這里](https://docs.docker.com/reference/commandline/cli/)?來查看完整的 Docker 命令行列表和使用方法。
## 在Docker中運行一個web應用
到這里我們了解了更多關于 docker 客戶端的知識,而現在我們需要將學習的焦點轉移到重要的部分:運行多個容器。到目前為止我們發現運行的容器并沒有一些什么特別的用處。讓我們通過使用 docker 構建一個 web 應用程序來運行一個web應用程序來體驗一下。
在這個 web 應用中,我們將運行一個 Python Flask 應用。使用?`docker run`?命令。
~~~
$ sudo docker run -d -P training/webapp python app.py
~~~
讓我們來回顧一下我們的命令都做了什么。我們指定兩個標識(flags)?`-d`?和?`-P`?。我們已知是?`-d`?標識是讓 docker 容器在后臺運行。新的?`-P`?標識通知 Docker 將容器內部使用的網絡端口映射到我們使用的主機上。現在讓我們看看我們的 web 應用。
This image is a pre-built image we've created that contains a simple Python Flask web application.
我們指定了?`training/web`?鏡像。我們創建容器的時候使用的是這個預先構建好的鏡像,并且這個鏡像已經包含了簡單的 Python Flask web 應用程序。
最后,我們指定了我們容器要運行的命令:?`python app.py`。這樣我們的 web 應用就啟動了。
> 注意:你可以在[命令參考](http://docs.docker.com/reference/commandline/cli/#run)和[Docker run參考](http://docs.docker.com/reference/run/)查看更多?`docker run`?命令細節
## 查看 WEB 應用容器
現在我們使用?`docker ps`?來查看我們正在運行的容器。
~~~
$ 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
~~~
你可以看到我們在?`docker ps`?命令中指定了新的標識?`-l`。這樣組合的?`docker ps`?命令會返回最后啟動容器的詳細信息。
> 注意:默認情況下,`docker ps`?命令只顯示運行中的容器。如果你還想看已經停止的容器,請加上?`-a`?標示。
我們這里可以看到一些細節,與我們第一次運行?`docker ps`?命令的時候相比,這里多了一個?`PORTS`?列。
~~~
PORTS
0.0.0.0:49155->5000/tcp
~~~
我們通過在?`docker run`?中使用?`-P`?標示(flags) 來將我們 Docker 鏡像內部容器端口暴露給主機。
> 提示:當我們學習[如何構建鏡像的時候](https://github.com/widuu/chinese_docker/blob/master/userguide/dockerimages.md),我們將了解更多關于如何開放 Docker 鏡像端口。
在這種情況下,Docker 開放了 5000 端口(默認 Python Flask 端口)映射到主機端口 49155 上。
Docker 能夠很容易的配置和綁定網絡端口。在最后一個例子中?`-P`?標識(flags)是?`-p 5000`?的縮寫,它將會把容器內部的 5000 端口映射到本地 Docker 主機的高位端口上(這個端口的通常范圍是 32768 至 61000)。我們也可以指定?`-p`?標識來綁定指定端口。舉例:
~~~
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
~~~
這將會把容器內部的 5000 端口映射到我們本地主機的 5000 端口上。你可能現在會問:為什么我們只使用 1對1端口映射的方式將端口映射到 Docker 容器, 而不是采用自動映射高位端口的方式?這里 1:1 映射方式能夠保證映射到本地主機端口的唯一性。假設你想要測試兩個 Python 應用程序,兩個容器內部都綁定了端口5000,這樣就沒有足夠的 Docker 的端口映射,你只能訪問其中一個。
所以,現在我們打開瀏覽器訪問端口49155。

我們的應用程序可以訪問了!
> 注意:如果你在 OS X windows或者Linux上使用 boot2docker 虛擬機,你需要獲取虛擬機的 ip 來代替localhost 使用,你可以通過運行 boot2docker shell 來獲取 ip。
~~~
$ boot2docker ip
The VM's Host only interface IP address is: 192.168.59.103
~~~
> 在這種情況下,你可以通過輸入?[http://192.168.59.103:49155](http://192.168.59.103:49155/)?來訪問上面的例子。
### 查看網絡端口快捷方式
使用?`docker ps`?命令來會返回端口的映射是一種比較笨拙的方法。為此,Docker 提供了一種快捷方式:?`docker port`,使用?`docker port`?可以查看指定 (ID或者名字的)容器的某個確定端口映射到宿主機的端口號。
~~~
$ sudo docker port nostalgic_morse 5000
0.0.0.0:49155
~~~
在這種情況下,我們看到容器的 5000 端口映射到了宿主機的的 49155 端口。
### 查看WEB應用程序日志
讓我們看看我們的容器中的應用程序都發生了什么,這里我們使用學習到的另一個命令?`docker logs`?來查看。
~~~
$ 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 -
~~~
這次我們添加了一個?`-f`?標識。?`docker log`?命令就像使用?`tail -f`?一樣來輸出容器內部的標準輸出。這里我們從顯示屏上可以看到應用程序使用的是 5000 端口并且能夠查看到應用程序的訪問日志。
### 查看WEB應用程序容器的進程
我們除了可以查看容器日志,我們還可以使用?`docker top`?來查看容器內部運行的進程:
~~~
$ sudo docker top nostalgic_morse
PID USER COMMAND
854 root python app.py
~~~
這里我們可以看到?`python app.py`?在容器里唯一進程。
### 檢查WEB應用程序
最后,我們可以使用?`docker inspect`?來查看Docker的底層信息。它會返回一個 JSON 文件記錄著 Docker 容器的配置和狀態信息。
~~~
$ sudo docker inspect nostalgic_morse
~~~
來讓我們看下JSON的輸出。
~~~
[{
"ID": "bc533791f3f500b280a9626688bc79e342e3ea0d528efe3a86a51ecb28ea20",
"Created": "2014-05-26T05:52:40.808952951Z",
"Path": "python",
"Args": [
"app.py"
],
"Config": {
"Hostname": "bc533791f3f5",
"Domainname": "",
"User": "",
. . .
~~~
我們也可以針對我們想要的信息進行過濾,例如,返回容器的 IP 地址,如下:
~~~
$ sudo docker inspect -f '{{ .NetworkSettings.IPAddress }}' nostalgic_morse
172.17.0.5
~~~
### 停止WEB應用容器
現在,我們的WEB應用程序處于工作狀態。現在我們通過使用?`docker stop`?命令來停止名為?`nostalgic_morse`?的容器:
~~~
$ sudo docker stop nostalgic_morse
nostalgic_morse
~~~
現在我們使用?`docker ps`?命令來檢查容器是否停止了。
~~~
$ sudo docker ps -l
~~~
### 重啟WEB應用容器
哎呀!剛才你停止了另一個開發人員所使用的容器。這里你現在有兩個選擇:您可以創建一個新的容器或者重新啟動舊的。讓我們啟動我們之前的容器:
~~~
$ sudo docker start nostalgic_morse
nostalgic_morse
~~~
現在再次運行?`docker ps -l`?來查看正在運行的容器,或者通過URL訪問來查看我們的應用程序是否響應。
> 注意:也可以使用?`docker restart`?命令來停止容器然后再啟動容器。
### 移除WEB應用容器
你的同事告訴你他們已經完成了在容器上的工作,不在需要容器了。讓我們使用?`docker rm`?命令來刪除它:
~~~
$ 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
~~~
發生了什么?實際上,我們不能刪除正在運行的容器。這避免你意外刪除了正在使用并且運行中的容器。讓我們先停止容器,然后再試一試刪除容器。
~~~
$ sudo docker stop nostalgic_morse
nostalgic_morse
$ sudo docker rm nostalgic_morse
nostalgic_morse
~~~
現在我們停止并刪除了容器。
> 注意:刪除容器是最后一步!
- 關于Docker
- 鏡像簡介
- 安裝篇
- Mac OS X
- Ubuntu
- Red Hat Enterprise Linux
- CentOS
- Debain
- Gentoo
- Google Cloud Platform
- Rackspace Cloud
- Amazon EC2
- IBM Softlayer
- Arch Linux
- FrugalWare
- Fedora
- openSUSE
- CRUX Linux
- Microsoft Windows
- Binaries
- 用戶指南
- 使用Docker Hub
- 在Docker中運行應用
- 使用容器
- 使用docker鏡像
- 連接容器
- 管理容器數據
- 使用Docker Hub
- Docker Hub
- 賬戶
- 存儲庫
- 自動構建
- 官方案例
- Docker中運行MongoDB
- Docker中運行Redis服務
- Docker中運行PostgreSQL
- Docker中運行Riak服務
- Docker中運行SSH進程服務
- Docker中運行CouchDB服務
- Docker中運行Apt-Cacher-ng服務