Docker在容器中运行应用,使用单一命令:docker run。
注意:如果你使用一个远程的Docker daemon,例如BOoot2Docker,则不需要在docker之前输入sudo命令,在以下的举例命令中。
Hello World
$ sudo docker run ubuntu:14.04 /bin/echo 'Hello world'
Hello world
你运行了第一个容器
发生了什么,我来步骤的分析一下docker run指令做了什么。
首先,我们指定docker二进制,run表示我们想要执行命令。docker run连接运行的容器。
然后,我们制定image:Ubuntu:14.04。这是我们运行的容器的来源。Docker称它为image。在这个例子里,我们使用使用了一个Ubuntu 14.04的操作系统image。
当你指定了一个image,Docker首先搜索image在Docker本地主机。如果不存在,则从Docker Hub上下载。
下一步,我们告诉Docker在新的container里运行什么命令:
/bin/echo 'Hello world'
当我们的容器创建一个Ubuntu 14.04环境,然后执行/bin/echo命令。输出结果:
Hello world
Docker container在运行命令期间是active的,当Hello world输出,container也就停止了。
交互的容器
再次运行docker run,在我们的容器中指定新的命令运行:
$ sudo docker run -t -i ubuntu:14.04 /bin/bash
root@af8bae53bdd3:/#
我们再次指定了docker run命令,运行一个Ubuntu:14.04 image。但是,我们也输入了两个标识:-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文件系统的根目录下的目录列表。
可以使用CTRL+D和exit命令,来退出当前容器。一天Bash shell进程结束,容器也随之结束。
Daemonized Hello world
一个容器运行一些命令,然后退出,没有过多的用处。让我们来创建一个以daemon运行的容器,像绝大多数运行在Docker的运用那样。
我们再次运行docker run命令:
$ sudo docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo hello world; sleep 1; done"
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
等待什么?“Hello world”在哪儿?这看起来很熟悉,我们运行了docker run,但是这次指定了标签:-d。-d 标签告诉Docker在后台运行容器,守护(daemonize)它。
我们也指定了相同的image:Ubuntu:14.04
最终,我们指定一个运行命令:
/bin/sh -c "while true; do echo hello world; sleep 1; done"
这是一个silliest daemon:一个一直输出hello world的shell脚本。
那么为什么我们没有看见hello world?而代替的是Docker返回一个很长的字符串:
1e5535038e285177d5214659a068137486f96ee5c2e85a4ac52dc83f2ebe4147
这个长字符串被称为container ID。这唯一标识我们工作的容器。
注意:这个container ID是一个长比特、不好用的,后面我们会看到一个较短的ID,采取一些命名container方法,来时我们工作起来更简单。
我们可以使用者container ID来观察我们的Hello world daemon发生了什么。
首先,确保我们容器在运行。我们可以使用docker ps命令查看。docker ps命令查看Docker daemon知道的所有容器的信息。
$ 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
我们看到了daemonized container。docker ps返回了一些有用的信息,一个缩减后的container ID:1e5535038e28.
我们能看到之前用于构建的image:Ubuntu:14.04,命令,stauts,自动分配的名字:insane_babbage。
注意:Docker自动的命名你启动的任何容器,稍后将讲述如何指定自己命名。
命令已经运行,那么它是否在运行,我们请求的做的呢?我们使用命令:docker logs查看容器中发生的。我们使用Docker分配的容器名字:
$ sudo docker logs insane_babbage
hello world
hello world
hello world
. . .
docker logs命令查看容器中,返回标准输出:这个例子里输出了hello world。
我们的daemon正在工作,我们创建了首个Dockerized应用。
现在我们已经创建容器,然后停止我们的容器,可以使用docker stop 命令:
$ sudo docker stop insane_babbage
insane_babbage
这docker stop命令告诉Docker politely停止正在运行的容器,如果它成功执行,将返回刚刚停止的容器的名字。
让我们来检查一下,是否已经关闭,借助指令docker ps:
$ sudo docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
我们的容器已经停止。