在Docker User Guide一节,我们启动了第一个容器。我们使用docker run启动了两个容器。
- 我们与运行的容器前台交互。
- 我们运行的容器在后台daemonized。
- docker ps -container 列表
- docker logs -显示container的标准输出
- docker stop -停止正在运行的containers
# Usage: [sudo] docker [command] [flags] [arguments] ..
# Example:
$ sudo docker run -i -t ubuntu /bin/bash
让我们使用docker version指令来查看docker client和daemon的版本信息。
$ sudo docker version
当使用这个指令时,它不只是提供Docker client和daemon的版本信息,也提供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 client能做什么?
我们可以运行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之后带上[command],来查看命令的用法:
$ sudo docker attach
Help output . . .
或者带上--help标签:
$ sudo docker attach --help
这将显示帮助文本和可用的标签:
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 (non-TTY mode only)
在Docker中运行一个Web Application
现在我们已经学习了一些docker client的只是,让我们将注意力移到更重要的东西上:运行更多的容器。到目前为止我们没有运行特定用途的容器。那我们在Docker中构建一个web应用案例。
Web应用中我们将运行一个Python的Flask应用。让我们从docker run命令开始吧:
$ sudo docker run -d -P training/webapp python app.py
让我们来回顾一下命令做了什么。指定两个标签:-d 和 -P 。我们之前看到过-d 是告诉Docker在后台运行容器。-P 告诉Docker将container内部的任何网络端口映射主机端口。这让我们看web应用。
我们指定了image:training/webapp。这image是一个预建的image,包含了一个简单Python Flask的web 应用。
最后,我们指定容器运行Python app.py。这启动了我们的web应用。
查看WEB应用container
使用docker ps命令查看正在运行的container。
$ 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命令返回最后一个container详细信息。
注意:默认的,docker ps命令只显示正在运行的容器信息。如果你想要看到已经被停止的容器信息,使用标签-a。
我们看到与我们第一个容器信息差不多,但是多了PORTS列。
PORTS
0.0.0.0:49155->5000/tcp
在docker run命令中使用-P标签将我们image中的任何端口暴露给我们的主机。
注意:我们将在学习如何构建image时,学习如何在image中暴露端口。
在这个例子中,Docker映射端口5000(Python Flask的默认端口)在端口49155上。
Docker绑定的Network port是可配置的。在上个例子中,-P是对于-p 5000是一个缩写,容器内的端口5000映射到一个更高的端口(范围:49153-65535)在Docker本地主机上。我们也可以指定Docker容器绑定的端口使用-p标签,例如:
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
这将绑定容器内部的5000端口与本地主机的5000端口进行映射。可以会有一个疑问:为什么在Docker容器中不适用1:1的端口映射,而映射到更高的端口?因为1:1映射中container中的端口只能和本地的host一个映射。而当我们测试两个Python应用时,两个container内部端口都是5000。如果采用1:1映射,那么我们一次只能访问一个Docker container。
那么让我们来在浏览器上访问49155端口吧,来登录应用:
我们的Python应用已经存在!
注意:如果你想要使用boot2docker virtual machine在OS X,Windows或者Linux上,需要获取虚拟主机的IP而不是使用localhost。你可以在boot2docker shell中这样查看:
$ boot2docker ip
The VM's Host only interface IP address is: 192.168.59.103
这样,你需要浏览http://192.168.29.103:49155来查看以上例子。
Network Port Shortcut
使用docker ps命令来返回被映射的接口,有一点麻烦,所以Docker有个快捷指令:docker port。使用docker port时,我们需要制定container的ID或者名字,需要面向公共的接口。
$ sudo docker port nostalgic_morse 5000
0.0.0.0:49155
在这个例子中,我们找到与container内部端口5000映射的外部端口。
查看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 logs指令表现的跟tail -f 指令一样,查看container的标准输出。我们从日志上可以看到Flask应用运行在端口5000上和访问日志条目。
寻找我们WEB应用 container的进程
另外,从container的日志中,我们可以检查到在container中运行的进程,使用docker top命令。
$ sudo docker top nostalgic_morse
PID USER COMMAND
854 root python app.py
这里,我们看到python app.py指令是这个容器中的唯一进程。
检查WEB应用container
最后,我们可以使用一个低级别的dive进入Docker container,通过命令docker inspect。它返回一个有用的配置信息的JSON hash和Docker container的状态信息。
$ 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应用container
我们已经见到WEB应用在运行了。现在让我们使用docker stop命令来禁止名为nostalgic_morse的容器。
$ sudo docker stop nostalgic_morse
nostalgic_morse
我们可以使用docker ps指令来检查,container是否已经被停止。
$ sudo docker ps -l
重启WEB应用服务器
Oops!就我们停到container之后,接到有新的开发需求,需要将container重启。这是我们有两种选择:我们可以创建一个新的container或者重启原来的。我们看一下如何重启先前的container:
$ sudo docker start nostalgic_morse
nostalgic_morse
现在,我们赶紧运行docker ps -l 看container是否已经重启,浏览器登陆container的URL看应用是否有回应。
注意:docker restart也会可用的命令,对用停止或者启动中的容器。
移除WEB应用container
你的同时告你,他们已经完工了,不再需要这个容器了。那么,让我们使用命令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
发生了什么?我们不能移除正在运行的container。这是一个保护,防止意外的移除你可能需要的正在运行的container。让我们先停止这个容器首先:
$ sudo docker stop nostalgic_morse
nostalgic_morse
$ sudo docker rm nostalgic_morse
nostalgic_morse
现在,我们的容器已经停止和删除。