Hello World

尝试 Busybox 镜像

前面我们安装好了 Docker,是时候体验一把了。在本节中,我们将在自己的操作系统上运行一个名为 Busybox 容器,同时尝试使用docker run命令。

首先,在终端下运行如下命令:

$ docker pull busybox

注意:根据在不同操作系统安装 Docker 的方式,执行上述命令后可能会看到 permission denied 这行提示。如果你使用的是 Mac,请确保 Docker 引擎正在运行。如果你使用的是 Linux,请使用 sudo 来运行 docker 命令,你也可以 创建一个 docker 组 来解决这个问题。

这里的pull命令会从 Docker 注册中心 中去获取 busybox 映像并将它保存到我们的系统中。你可以使用 docker images 命令查看系统上所有的镜像。

$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
busybox latest c51f86c28340 4 weeks ago 1.109 MB

Docker Run

非常棒!现在我们使用这个镜像来运行一个 Docker 容器。这就用到了全能的docker run命令。

$ docker run busybox
$

哎嘿,并没有什么卵用!这是有 bug 么?好吧,原来不是这样的。在背后发生了很多事情。当你调用run命令时,Docker 客户端会找到镜像(当前例子中是 busybox),然后加载容器,在该容器中运行命令。当我们运行时docker run busybox,我们没有提供任何命令,所以容器启动后运行空命令然后退出。emmm,这样太没劲了吧!我们来试试一些有趣的。

$ docker run busybox echo "hello from busybox"
hello from busybox

nice!这次在控制台可以看到有一些输出。这种情况下,Docker 客户端会乖乖的在我们的 busybox 容器中运行 echo 命令,然后退出容器。你应该也注意到了,这次执行非常快。想象一下,如果启动一个虚拟机,运行命令然后 kill 它会是怎样呢?现在你知道为什么他们说 Docker 很快了吧!好了,现在我们可以用一下docker ps命令了,它可以显示出当前正在运行的所有容器。

$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

由于现在还没有容器在运行,我们只看到了空行。我们再尝试这个命令的另一种形式:docker ps -a

$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
305297d7a235 busybox "uptime" 11 minutes ago Exited (0) 11 minutes ago distracted_goldstine
ff0a5c3750b9 busybox "sh" 12 minutes ago Exited (0) 12 minutes ago elated_ramanujan
14e5bd11d164 hello-world "/hello" 2 minutes ago Exited (0) 2 minutes ago thirsty_euclid

上面是我们运行的所有容器的一个列表。请注意,STATUS 这一列显示的是这些容器在什么时候退出了。

你可能想问,我如何知道这个容器里可以运行多少个命令呢?我们来试试:

$ docker run -it busybox sh
/ # ls
bin dev etc home proc root sys tmp usr var
/ # uptime
05:45:21 up 5:58, 0 users, load average: 0.00, 0.01, 0.04

使用 run -it 命令将我们连接到容器中的交互式 tty。现在我们可以根据需要在容器中运行更多的命令,花一些时间来运行你喜欢的命令。

前方高能:如果你喜欢冒险,可以试试在容器里执行rm -rf bin一定要确保在容器中运行这个命令,而不是在你自己的操作系统中运行。这个操作会导致 ls、echo 这些命令不能执行。一旦所有命令都不能运行,你可以退出容器(输入 exit 后回车),然后使用 docker run -it busybox sh 命令再次启动容器。由于 Docker 每次都会创建一个新容器,所以一切都会从头再来,不要慌!

体验了 docker run 命令之后,需要记住这可能是你最经常使用的命令。花点时间来适应决定是有必要的,想要了解更多 run 命令的信息,使用 docker run --help 你可以看到它支持的所有功能。随着我们进一步的学习,还会看到更多 docker run 的变种。

在我们继续下一步之前,来快速聊聊删除容器的操作。我们在上面看到,即便已经退出容器,但使用 docker ps -a 命令仍然可以看到容器的残留痕迹。前面的例子中,你每次执行 docker run 之后会留下一些残存的容器,它们会占用磁盘空间。所以,根据经验,当我使用完容器后就会将它清理。那么你可以使用 docker rm 命令来完成这个操作。只需从上面复制容器ID,然后将它们粘贴在命令后面。

$ docker rm 305297d7a235 ff0a5c3750b9
305297d7a235
ff0a5c3750b9

当你执行删除后,在控制台会看到一个输出反馈。如果想一次删除多个容器,复制粘贴多个 ID 可能比较麻烦。在这种情况下,你可以运行这个简单的命令:

$ docker rm $(docker ps -a -q -f status=exited)

这个命令会删除所有状态为 exited 的容器。如果你只想看到容器 ID 可以在 ps 后面添加 -q 选项,如果想根据条件过滤可以添加 -f 选项。最后一个非常有用的选项是 --rm,在执行 docker run 的时候添加它当容器退出时会自动删除容器。对于只运行一次的容器这个选项非常有用。

在高版本的 Docker 中,使用docker container prune命令也可以实现上面的效果。

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
4a7f7eebae0f63178aff7eb0aa39f0627a203ab2df258c1a00b456cf20063
f98f9c2aa1eaf727e4ec9c0283bcaa4762fbdba7f26191f26c97f64090360
Total reclaimed space: 212 B

最后,你可以使用 docker rmi 来删除不需要的镜像。

Docker 中的一些术语

前面我们使用了许多 Docker 中的术语,可能你会有一些困惑。所以在进行下一步之前,先来看看 Docker 生态中经常使用的一些术语。

  • image - 构成容器的应用程序蓝图。在上面的演示中,我们使用docker pull命令下载 busybox 镜像。

  • container - 从一个镜像中创建并运行的应用程序。我们使用 docker run busybox 就会从 busybox 镜像中创建一个容器。使用docker ps命令可以看到正在运行的容器列表。

  • Docker 守护进程 - 在宿主机上运行的后台服务,用于管理、构建、运行和分发 Docker 容器。守护进程是在客户端和操作系统之间通信的服务。

  • Docker Client - 允许用户与守护进程交互的命令行工具。一般来说,也可以有其他形式的客户端 - 比如 Kitematic,它为用户提供 GUI。

  • Docker Hub - Docker镜像的 注册中心。你可以将注册中心认为是所有可用 Docker 镜像的目录。有必要的话可以自建 Docker 注册中心,然后使用它来获取镜像。