Hello Word!
现在试着执行如下命令:
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello World'
Hello World!
恭喜你,你已经成功创建了你的第一个docker容器。
接下来我们看一下docker run命令都做了些什么。
首先我们运行了docker程序并告诉docker程序需要执行的指令run。docker run 组合在一起代表运行一个新docker容器。接着,我们指定了运行容器所依赖的镜像:ubuntu:14.04,这是我们运行容器的模板,在docker术语中我们叫这个创建容器的模板为镜像。这这个例子中我们使用Ubuntu 14.04作为操作系统镜像。docker会首先根据指定镜像的名称在宿主机上查找镜像,如果没有找到,docker会从公共镜像仓库下载。这个公共镜像仓库就是我们前文所说的Docker Hub。接下来我们告诉docker在创建的容器中需要执行的命令:/bin/echo 'Hello World!'当容器加载完成后,docker为我们创建了一个新的Ubuntu 14.04环境,并在这个新创建的环境中执行命令:/bin/echo。因此我们就在命令行中看到了如下输出:Hello World!
那么输出“Hello World!”后我们刚创建的容器会接着做什么呢?docker容器的生命周期和他所执行的命令的生命周期是一致的。在这个小例子中,输出“Hello World!”后,/bin/echo执行结束,那么docker容器也跟着停止。
一个可交互的容器
我们再一次运行一下“docker run”命令,这一次我们在容器中运行一个新命令:
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
这个例子中我们依然使用 docker run 命令加载ubuntu:14.04镜像创建容器。但是不同的是我们执行docker run命令时指定了两个参数:-t和-i。-t参数表示在我们的容器中运行一个虚拟终端,-i参数可以使容器的标准输入输出重定向到宿主机,从而建立了一个可以和容器交互的连接。同时我们还指定了容器需要执行的命令为/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命令显示当前所在目录为根目录,运行ls命令列举根目录下的所有子目录,我们可以看到,根目录下是常见的Linux系统文件。你可以在容器中运行一些其他常用的Linux命令。如果需要退出shell,执行exit命令即可。对于我们创建的这个容器来说,执行exit命令意味着容器中的命令结束,因此执行exit后shell退出,同时执行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”,我们仔细的分析一下刚才执行的命令。和以前一样同样使用了docker run,但是这一次我们指定了-d命令。-d命令告诉docker讲容器放在后台运行。这一次我们指定的系统镜像依然ubuntu:14.04接下来我们指定容器需要执行的命令:
/bin/sh -c "while true; do echo hello world; sleep 1; done"
这是一个简单的shell脚步程序,该程序会循环输出Hello World。然而为什么我们没有看到输出Hello world呢?取而代之的却是一个很长的字符串:1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147这个很长的字符串叫容器标识,他标识容器的唯一性。注意:容器标识比较长,使用起来很不方便,稍后我们会介绍一下短一点的容器标识,但是使用最多、最方便的却是有含义的容器名称。
我们可以通过容器标识看一下我们的后台容器中究竟执行了什么。首先我们确认一下我们创建的容器是否正在运行。我们可以用docker ps命令实现。docker ps查询所有正在后台运行的容器以及容器的相关信息。
$ 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命令的输出我们可以看到后台运行的docker容器信息。docker ps返回了关于容器的很多有用信息,比如第一列是缩短的容器ID:1e5535038e28,第二列是我们创建容器时使用的镜像:ubuntu:14.04,还包括创建容器时指定的容器需运行的命令,以及容器的状态和自动给容器指定的名称insane_babbage。注意:创建容器时docker会自动给容器指定名称,稍后会介绍给容器指定自定义名称。
docker ps的输出结果表明我们创建的容器已经正常运行了,但是这并不能证明正确执行了我们指定的指令。
为了证明这一点需要查看容器内部的日志信息,查看docker内部的日志信息需要使用docker logs命令。
下面使用docker自动指定的容器名称查看容器的运行日志:
$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .
docker logs命令用于查看容器内部的运行日志,并返回到标准输入输出中,在本例中命令执行后的返回为hello world。到目前为止,我们创建的容器已经在后台成功运行。我们的Hello World应用程序已经成功在docker容器中执行了。接下来我们看看如何停止一个运行中的容器。停止一个运行的容器使用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
从docker ps命令的返回结果可以看出,当前已经没有正在运行的容器。
下一步
我们已经体验到了使用docker创建容器时多么的简单!接下来会探讨一下docker的高级主题,关于如何操作docker容器。