Docker 安装
docker 的相关安装方法这里不作介绍,具体安装参考官档
Docker 基础用法
在一个容器内运行一个应用程序需要一个命令:docker run。
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
一个镜像:ubuntu 14.04
当你指定一个镜像,docker会查看这个镜像是否有一次加载到你的docker主机上,如果没有发现,docker就会在镜像仓库Docker Hub下载公共镜像。
新容器内运行命令:
/bin/echo 'Hello world'
docker创建一个新的Ubuntu 14.04环境,然后执行/bin/echo命令。我们会在命令行看到结果:hello world
那么,我们创建容器之后会发生什么呢?这里Docker容器当你输入指令时被激活运行。这里只要"hello word"被输出,容器就会停止。
一个交互式的容器
让我们尝试再次运行docker run,这次我们指定一个新的命令来运行我们的容器。
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
在这里我们继续指定docker run命令,并运行一个新的ubuntu:14.04的镜像。但是我们也加了两个新的标示:-t和-i。-t表示在新容器内指定一个伪终端或终端,-i表示允许我们对容器内的STDIN进行交互。
在我们的容器内还指定了一个新的命令:/bin/bash。这将在容器内启动bash shell
所以现在当我们的容器启动时我们会看到,我们有一个命令提示符(进入了容器内):
root@af8bae53bdd3:/#
让我们尝试在容器内运行一些命令:
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
你可以看到我们运行pwd来显示当前目录,这时候显示的是我们的根目录。我们还列出了跟目录的列表显示了目录列表,通过目录列表我们看出来想一个典型的Linux文件系统。
当你完成你的命令的时候,你退出这个容器,你可以输入exit。
root@af8bae53bdd3:/# exit
与我们之前的容器一样,一旦你的Bash shell退出之后,你的容器就停止了。
守护进程Hello world
现在一个容器运行一个命令当使用完退出,但是这并不是有帮助的。让我们创建一个容器,让它以守护进程的模式运行,就像docker运行应用程序那样。
我们可以这样运行docker run命令:
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
我们的hello word去哪了。我们运行docker但是我们指定了一个-d标识。-d标识告诉docker运行容器在后台模式运行。
我们也指定了一个相同的镜像:ubuntu:14.04
最终,我们指定命令行运行:
/bin/sh -c "while true; do echo hello world; sleep 1; done"
这是一个荒谬的hello word进程:一个脚本会一直输出"hello word"
为什么不是我们看到的一大堆的"hello word"?而是docker返回的一个很长的字符串:
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
这个长的字符串叫做容器ID。它是容器的唯一标识,所以我们可以使用它。
注意:容器ID是有点长并且非常的笨拙,稍后我们会看到一个断点的ID,某些方面来说它是容器ID的简化版。
我们可以根据容器ID查看"hello word"进程发生了什么、
我们可以使用docker ps命令来查看。docker ps命令可以查询docker运行中的容器。如果你还想看已经停止的容器,请加上-a标示。
$ 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
这里我们看到了后台进程容器。docker ps命令会返回一些有用的信息,这里包括一个短的容器ID:1e5535038e28。
我们还可以看到我们使用的ubuntu:14.04来构建它,这个命令已经运行,它被系统自动分配了名称insane_babbage。
注意:docker会在容器启动的时候自动给容器命名,稍后我们可以看到我们如何给容器指定名称。
好了,现在我们知道它运行。但是我们能要求它做什么呢?做到这,我们需要在我们容器内使用docker logs命令。让我们给系统自动分配名称的容器使用这个命令。
$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .
docker logs命令看起来想运行在容器内并且返回标准输出:这种情况下我们的命令输出hello word
让我们停止这个后台进程容器。为此让我们使用docker stop命令停止。
$ sudo docker stop insane_babbage
insane_babbage
docker stop命令会通知docker停止正在运行的容器。如果它成功了,它将返回刚刚停止的容器名称。
让我们通过docker ps命令来检查它是否还工作。
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
在我们的web应用中,我们将运行一个python应用。让我们先从docker run命令开始。
$ sudo docker run -d -P training/webapp python
新的-P标示通知Docker所需的网络端口映射从主机映射到我们的容器内(更为详细请看 网络端口映射)。
现在使用docker -s查看会看到
PORTS
0.0.0.0:49155->5000/tcp
docker开放了5000端口(默认Python端口)映射到主机端口49155上。
也可以指定-p标示来指定端口。举例:
$ sudo docker run -d -p 5000:5000 training/webapp python
使用docker ps命令会返回映射端口,就是有点笨手笨脚的。对此,docker提供了一种快捷方式:docker port。使用docker port可以查看指定(ID或者名字的)容器的某个确定端口映射到宿主机的端口号。
$ sudo docker port nostalgic_morse 5000
0.0.0.0:49155
在这种情况下,我们看到容器的5000端口映射到了宿主机的的49155端口。
网络端口映射
在使用docker部分,我们创建了一个python应用的容器。
$ sudo docker run -d -P training/webapp python
注:容器有一个内部网络和IP地址(在使用Docker部分我们使用docker inspect命令显示容器的IP地址)。Docker可以有各种网络配置方式。你可以再这里学到更多docker网络信息。
我们使用-P标记创建一个容器,将容器的内部端口随机映射到主机的高端口49000到49900。这时我们可以使用docker ps来看到端口5000绑定主机端口49155。
$ sudo docker ps nostalgic_morse
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
bc533791f3f5 training/webapp:latest python 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
我们也可以使用-p标识来指定容器端口绑定到主机端口
$ sudo docker run -d -p 5000:5000 training/webapp python
我们看这为什么不是一个好的主意呢?因为它限制了我们容器的一个端口。
我们还有很多设置-p标识的方法。默认-p标识会绑定本地主机上的指定端口。并且我们可以指定绑定的网络地址。举例设置localhost
$ sudo docker run -d -p 127.0.0.1:5001:5002 training/webapp python
这将绑定容器内部5002端口到主机的localhost或者127.0.0.1的5001端口。
如果要绑定容器端口5002到宿主机动态端口,并且让localhost访问,我们可以这样做:
$ sudo docker run -d -p 127.0.0.1::5002 training/webapp python
我们也可以绑定UDP端口,我们可以在后面添加/udp,举例:
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python
我们可以使用docker port快捷方式来绑定我们的端口,这有助于向我们展示特定的端口。例如我们绑定localhost,如下是docker port输出:
$ docker port nostalgic_morse 5000
127.0.0.1:49155
注:-p可以使用多次配置多个端口。
查看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 / HTTP/1.1" 404 -
这次我们添加了一个标示-f。这将使docker log命令中使用tail -f来查看容器标准输出。这里我们从应用程序日志的5000端口的访问日志条目。
查看我们WEB应用程序容器的过程
我们除了可以查看容器日志,我们还可以使用docker top来查看容器进程:
$ sudo docker top nostalgic_morse
PID USER COMMAND
854 root python
这里我们可以看到python 在容器里唯一进程。
检查我们的WEB应用程序
最后,我们可以使用docker inspect来查看Docker的底层信息。它会返回一个JSON文件记录docker容器的配置和状态信息。
$ sudo docker inspect nostalgic_morse
来让我们看下JSON的输出。
[{
"ID": "bc533791f3f500b280a9626688bc79e342e3ea0d528efe3a86a51ecb28ea20",
"Created": "2014-05-26T05:52:40.808952951Z",
"Path": "python",
"Args": [
""
],
"Config": {
"Hostname": "bc533791f3f5",
"Domainname": "",
"User": "",
. . .
我们也可以针对我们想要的信息进行过滤,例如,返回容器的IP地址,如下:
$ sudo docker inspect -f '{{ . }}' nostalgic_morse
172.17.0.5
停止我们的容器
好吧,我们看到WEB应用程序工作。现在我们通过使用docker stop命令来停止名为 nostalgic_morse 的容器:
$ sudo docker stop nostalgic_morse
nostalgic_morse
现在我们使用docker ps命令来检查容器是否停止了。
重启我们的应用程序
哎呀!刚才你停止了另一个开发人员所使用的容器。这里你现在有两个选择:您可以创建一个新的容器或者重新启动旧的。让我们启动我们之前的容器:
$ sudo docker start nostalgic_morse
nostalgic_morse
现在运行docker ps -l来查看正在运行的容器,或者通过URL访问来查看我们的应用程序是否响应。
注意:也可以使用docker restart命令来停止容器或然后再启动容器。
移除我们的应用程序
你的同事告诉你他们已经完成了在容器上的工作,不在需要容器了。让我们使用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
现在我们停止并删除了容器。