Docker Hello World

Docker 允许你在容器内运行应用程序,使用 docker run 命令来在容器内运行一个应用程序。 本教程将带你了解 Docker 的基本用法,从最简单的示例开始,逐步深入 Docker 的核心概念。

1. 运行第一个容器:Hello World

让我们从最简单的示例开始,运行一个输出 "Hello world" 的容器:

docker run ubuntu:15.10 /bin/echo "Hello world"

命令参数说明

  • docker:Docker 的二进制执行文件
  • run:与前面的 docker 组合来运行一个容器
  • ubuntu:15.10:指定要运行的镜像,如果本地不存在会从 Docker Hub 下载
  • /bin/echo "Hello world":在容器中执行的命令

命令执行流程

  1. Docker 客户端联系 Docker 守护进程
  2. Docker 守护进程检查本地是否有 ubuntu:15.10 镜像,如果没有则从 Docker Hub 下载
  3. Docker 守护进程基于该镜像创建新的容器
  4. Docker 守护进程分配一个文件系统给容器,并在镜像层外挂载一个读写层
  5. Docker 守护进程创建网络接口,连接容器到默认网络
  6. Docker 守护进程设置 IP 地址,从池中分配一个 IP 给容器
  7. Docker 守护进程在容器中执行 /bin/echo "Hello world" 命令
  8. Docker 守护进程将命令的输出流回应给 Docker 客户端,客户端将输出发送给用户终端

2. 运行交互式容器

通过 Docker 的 -i 和 -t 参数,我们可以创建一个具有交互能力的容器,这让我们能够像使用传统虚拟机一样使用容器:

docker run -i -t ubuntu:15.10 /bin/bash

参数说明

  • -t:在新容器内指定一个伪终端或终端
  • -i:允许你对容器内的标准输入 (STDIN) 进行交互
  • /bin/bash:在容器内启动 bash shell

运行后,你将进入容器的 bash 终端,提示符类似于:

root@0123ce188bd8:/#

在容器内执行命令

现在你可以在容器内执行各种命令,就像在普通的 Linux 系统中一样:

# 查看系统版本
root@0123ce188bd8:/# cat /etc/os-release
NAME="Ubuntu"
VERSION="15.10 (Wily Werewolf)"
ID=ubuntu
ID_LIKE=debian
PRETTY_NAME="Ubuntu 15.10"
VERSION_ID="15.10"
HOME_URL="http://www.ubuntu.com/"
SUPPORT_URL="http://help.ubuntu.com/"
BUG_REPORT_URL="http://bugs.launchpad.net/ubuntu/"

# 查看主机名
root@0123ce188bd8:/# hostname
0123ce188bd8

# 查看进程
root@0123ce188bd8:/# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.2  18240  3248 pts/0    Ss   00:42   0:00 /bin/bash
root        17  0.0  0.1  34424  2836 pts/0    R+   00:42   0:00 ps aux

3. 后台运行容器

在实际应用中,我们通常需要让容器在后台运行。使用 -d 参数可以让容器在后台运行,这对于运行服务类应用特别有用:

docker run -d ubuntu:15.10 /bin/sh -c "while true; do echo hello world; sleep 1; done"

参数说明

  • -d:让容器在后台运行
  • /bin/sh -c "command":在容器中执行 shell 命令
  • while true; do ... done:创建一个无限循环,每秒输出一次 "hello world"

运行后,Docker 会返回一个容器 ID,类似这样:

2b1b7a428627c51ab8810d541d759f072b4fc75487eed05812646b8534a2fe63

容器管理

使用 docker ps 命令查看运行中的容器:

$ docker ps
CONTAINER ID   IMAGE          COMMAND                  CREATED          STATUS          PORTS     NAMES
2b1b7a428627   ubuntu:15.10   "/bin/sh -c 'while t…"   10 seconds ago   Up 9 seconds              amazing_cori

docker ps 输出说明

  • CONTAINER ID:容器的唯一标识符
  • IMAGE:使用的镜像
  • COMMAND:启动容器时运行的命令
  • CREATED:容器的创建时间
  • STATUS:容器的当前状态
  • PORTS:容器的端口映射信息
  • NAMES:容器的名称(如果没有指定,Docker 会自动分配一个随机名称)

容器状态说明

  • created:已创建但未启动
  • restarting:重启中
  • runningUp:运行中
  • removing:迁移中
  • paused:暂停
  • exited:已停止
  • dead:死亡(无法启动)

查看容器日志

使用 docker logs 命令查看容器的输出:

# 通过容器 ID 查看日志
$ docker logs 2b1b7a428627
hello world
hello world
hello world
...

# 通过容器名称查看日志
$ docker logs amazing_cori
hello world
hello world
hello world
...

# 实时查看日志(类似 tail -f)
$ docker logs -f 2b1b7a428627
hello world
hello world
hello world
...(持续输出)

# 查看最近的 5 条日志
$ docker logs --tail 5 2b1b7a428627
hello world
hello world
hello world
hello world
hello world

停止容器

使用 docker stop 命令停止运行中的容器:

# 通过容器 ID 停止容器
$ docker stop 2b1b7a428627

# 通过容器名称停止容器
$ docker stop amazing_cori

4. 命名容器

默认情况下,Docker 会为每个容器分配一个随机名称。但在实际应用中,为了便于管理,我们通常会为容器指定一个有意义的名称。 使用 --name 参数可以为容器指定名称:

docker run --name hello-docker -d ubuntu:15.10 /bin/sh -c "while true; do echo hello docker; sleep 1; done"

现在,我们可以使用这个名称来引用容器:

# 查看容器日志
$ docker logs hello-docker
hello docker
hello docker
hello docker
...

# 停止容器
$ docker stop hello-docker

# 启动已停止的容器
$ docker start hello-docker

# 重启容器
$ docker restart hello-docker

5. 容器生命周期管理

了解容器的完整生命周期对于有效管理 Docker 环境至关重要。以下是容器生命周期的主要阶段和相关命令:

创建容器

创建但不启动容器

docker create --name my-container ubuntu:15.10

这个命令会创建一个容器但不会启动它。创建后的容器处于 "created" 状态。

启动容器

启动已创建或已停止的容器

docker start my-container

这个命令会启动一个已创建或已停止的容器。启动后的容器处于 "running" 状态。

暂停和恢复容器

暂时冻结容器中的所有进程

# 暂停容器
docker pause my-container

# 恢复容器
docker unpause my-container

暂停容器会冻结容器中的所有进程,但不会释放资源。暂停的容器处于 "paused" 状态。

停止容器

优雅地停止容器中的所有进程

docker stop my-container

这个命令会发送 SIGTERM 信号给容器中的主进程,如果进程在一定时间内(默认 10 秒)没有退出, Docker 会发送 SIGKILL 信号强制终止进程。停止后的容器处于 "exited" 状态。

强制停止容器

立即终止容器中的所有进程

docker kill my-container

这个命令会立即发送 SIGKILL 信号给容器中的主进程,强制终止容器。 这可能会导致数据丢失,应该只在容器无法正常停止时使用。

删除容器

永久删除容器

# 删除已停止的容器
docker rm my-container

# 强制删除正在运行的容器
docker rm -f my-container

# 删除所有已停止的容器
docker container prune

删除容器会永久移除容器及其文件系统。如果容器中有未保存的数据,这些数据将会丢失。

6. 下一步

恭喜!你已经学习了 Docker 的基本用法。现在你可以:

  • 运行简单的容器
  • 在交互模式下使用容器
  • 在后台运行容器
  • 查看容器日志
  • 停止和删除容器
  • 管理容器的完整生命周期

接下来,你可以继续学习以下内容:

容器操作

深入了解容器的管理和操作

学习更多关于容器的创建、启动、停止、删除等操作,以及如何管理容器的资源和配置。

镜像管理

学习如何管理 Docker 镜像

了解如何拉取、构建、推送和管理 Docker 镜像,以及如何使用 Dockerfile 创建自定义镜像。