Docker Hello World
Docker 允许你在容器内运行应用程序,使用 docker run 命令来在容器内运行一个应用程序。 本教程将带你了解 Docker 的基本用法,从最简单的示例开始,逐步深入 Docker 的核心概念。
准备工作
docker --version
命令来验证安装。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"
:在容器中执行的命令
命令执行流程
- Docker 客户端联系 Docker 守护进程
- Docker 守护进程检查本地是否有 ubuntu:15.10 镜像,如果没有则从 Docker Hub 下载
- Docker 守护进程基于该镜像创建新的容器
- Docker 守护进程分配一个文件系统给容器,并在镜像层外挂载一个读写层
- Docker 守护进程创建网络接口,连接容器到默认网络
- Docker 守护进程设置 IP 地址,从池中分配一个 IP 给容器
- Docker 守护进程在容器中执行 /bin/echo "Hello world" 命令
- Docker 守护进程将命令的输出流回应给 Docker 客户端,客户端将输出发送给用户终端
预期输出
Hello world
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
退出容器
- 输入
exit
命令 - 使用
CTRL+D
快捷键
退出后,容器会停止运行,但不会被删除。你可以使用 docker ps -a
命令查看所有容器,包括已停止的容器。
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
:重启中running
或Up
:运行中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
验证容器状态
docker ps
命令确认容器已经停止运行。 停止的容器不会在输出中显示,除非使用 docker ps -a
命令查看所有容器。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
注意事项
- 容器名称必须是唯一的。如果尝试创建同名容器,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
删除容器会永久移除容器及其文件系统。如果容器中有未保存的数据,这些数据将会丢失。
容器状态转换
容器状态可以按照以下方式转换:
- created → running:通过
docker start
- running → paused:通过
docker pause
- paused → running:通过
docker unpause
- running → exited:通过
docker stop
或docker kill
- exited → running:通过
docker start
- 任何状态 → 删除:通过
docker rm
(运行中的容器需要使用-f
参数)
6. 下一步
恭喜!你已经学习了 Docker 的基本用法。现在你可以:
- 运行简单的容器
- 在交互模式下使用容器
- 在后台运行容器
- 查看容器日志
- 停止和删除容器
- 管理容器的完整生命周期
接下来,你可以继续学习以下内容:
容器操作
深入了解容器的管理和操作
学习更多关于容器的创建、启动、停止、删除等操作,以及如何管理容器的资源和配置。
镜像管理
学习如何管理 Docker 镜像
了解如何拉取、构建、推送和管理 Docker 镜像,以及如何使用 Dockerfile 创建自定义镜像。