如何检查 Docker 安装详情

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

Docker 是一个强大的容器化平台,它彻底改变了开发者构建、部署和管理应用程序的方式。在本教程中,你将学习如何验证 Docker 安装并确保其正常运行。你还将了解如何解决使用 Docker 时可能出现的常见问题。

在本实验结束时,你将深入了解如何查看 Docker 安装细节并验证 Docker 环境是否正常运行。

本实验需要联网学习,因此只有 LabEx Pro 用户可以启动虚拟机。升级到 Pro 账户

检查 Docker 版本和状态

在开始进行 Docker 操作之前,务必验证 Docker 已正确安装在你的系统上并正常运行。在这一步中,我们将检查 Docker 版本和守护进程状态。

检查 Docker 版本

首先,让我们检查一下系统上安装的 Docker 版本。打开终端并运行以下命令:

docker --version
docker version

此命令会显示已安装的 Docker 版本。你应该会看到类似于以下的输出:

Docker version 20.10.21, build baeda1f

若要获取更详细的版本信息,包括客户端和服务器组件,请使用:

docker version

这将显示 Docker 客户端和服务器(守护进程)的全面版本信息,以及其他详细信息,如用于构建 Docker 的 Go 版本。输出大致如下:

Client:
 Version:           20.10.21
 API version:       1.41
 Go version:        go1.18.1
 Git commit:        baeda1f
 Built:             Tue Oct 25 18:02:28 2022
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true

Server:
 Engine:
  Version:          20.10.21
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.18.1
  Git commit:       3056208
  Built:            Tue Oct 25 18:00:19 2022
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.10
  GitCommit:        770bd0108c32f3fb5c73ae1264f7e503fe7b2661
 runc:
  Version:          1.1.4
  GitCommit:        v1.1.4-0-g5fd4c4d
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

如果你收到“docker: command not found”的错误信息,则表明 Docker 安装不正确或未添加到系统的 PATH 环境变量中。

检查 Docker 守护进程状态

接下来,让我们验证 Docker 守护进程(服务)是否正在运行。Docker 守护进程是负责管理 Docker 容器的后台服务。

运行以下命令:

sudo systemctl status docker

你应该会看到表明 Docker 服务处于活动且正在运行状态的输出:

● docker.service - Docker Application Container Engine
     Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled)
     Active: active (running) since Wed 2023-05-10 12:34:56 UTC; 2h 15min ago
   Main PID: 1234 (dockerd)
      Tasks: 8
     Memory: 38.5M
        CPU: 25.102s
     CGroup: /system.slice/docker.service
             └─1234 /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock

如果 Docker 服务未运行,你可以使用以下命令启动它:

sudo systemctl start docker

若要确保系统启动时 Docker 自动启动,你可以使用以下命令启用它:

sudo systemctl enable docker

检查 Docker 信息

若要全面了解你的 Docker 安装情况,请使用 docker info 命令:

docker info

这将显示有关你的 Docker 安装的详细信息,包括:

  • 容器和镜像数量
  • 存储驱动
  • Docker 根目录
  • 运行时信息
  • 网络设置
  • 镜像仓库配置

输出内容会比较多,但能提供有关你的 Docker 配置的有价值信息。

运行测试容器

既然我们已经确认 Docker 已安装并正在运行,那就通过运行一个简单的容器来测试一下。这一步将验证 Docker 能否正确下载镜像并运行容器。

“Hello World”容器

Docker 提供了一个专门用于测试 Docker 安装的简单“hello-world”镜像。这个微小的容器可以验证以下几点:

  • Docker 客户端能够连接到 Docker 守护进程
  • Docker 守护进程能够从 Docker Hub 拉取镜像
  • Docker 能够创建并运行容器

让我们使用以下命令运行这个测试容器:

docker run hello-world

当你首次运行此命令时,Docker 会执行以下操作:

  1. 检查本地是否存在“hello-world”镜像
  2. 如果不存在,则从 Docker Hub 下载该镜像
  3. 基于此镜像创建一个容器
  4. 启动容器,该容器会打印一条消息然后退出

你应该会看到类似于以下的输出:

Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
2db29710123e: Pull complete
Digest: sha256:ffb13da98453e0f04d33a6eee5bb8e46ee50d08ebe17735fc0779d0349e889e9
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

此消息确认你的 Docker 安装已正确运行。

列出容器

运行“hello-world”容器后,让我们查看一下系统上的容器列表。我们刚刚运行的容器已经退出,但我们仍然可以在所有容器的列表中看到它。

若要查看所有容器(包括已停止的容器),请运行:

docker ps -a

你应该会看到类似于以下的输出:

CONTAINER ID   IMAGE         COMMAND    CREATED         STATUS                     PORTS   NAMES
b7c33e8f6cb8   hello-world   "/hello"   2 minutes ago   Exited (0) 2 minutes ago           romantic_galileo

-a 标志会显示所有容器,包括已停止的容器。如果不使用此标志,docker ps 只会显示正在运行的容器。

请注意,“STATUS”列显示“Exited (0)”,这意味着容器已完成其任务并以状态码 0 退出(表示成功)。

列出 Docker 镜像

“hello-world”镜像已下载到你的本地机器上。让我们通过列出所有 Docker 镜像来验证这一点:

docker images

你应该会看到类似于以下的输出:

REPOSITORY    TAG       IMAGE ID       CREATED        SIZE
hello-world   latest    feb5d9fea6a5   6 months ago   13.3kB

这确认了“hello-world”镜像已存储在你的系统本地。

探索基本的 Docker 命令

既然我们已经验证了 Docker 安装可以正常工作,接下来让我们探索一些基本的 Docker 命令,这些命令将帮助你管理容器和镜像。

运行交互式容器

与运行后立即退出的“hello-world”容器不同,我们可以交互式地运行容器。让我们运行一个 Ubuntu 容器并与其 shell 进行交互:

docker run -it ubuntu bash

此命令:

  • -i 保持标准输入(STDIN)打开
  • -t 分配一个伪终端(pseudo - TTY)
  • ubuntu 是镜像名称
  • bash 是在容器内部运行的命令

容器启动后,你将进入容器内部的 bash 提示符界面:

root@3f4d92618a09:/#

该提示符表明你已以 root 用户身份登录到容器中。那串字母数字组合的字符串就是容器 ID。

尝试在容器内部运行一些 Linux 命令:

cat /etc/os-release

这将显示容器中运行的 Ubuntu 版本信息:

PRETTY_NAME="Ubuntu 24.04.1 LTS"
NAME="Ubuntu"
VERSION_ID="24.04"
VERSION="24.04.1 LTS (Noble Numbat)"
VERSION_CODENAME=noble
ID=ubuntu
ID_LIKE=debian
HOME_URL="https://www.ubuntu.com/"
SUPPORT_URL="https://help.ubuntu.com/"
BUG_REPORT_URL="https://bugs.launchpad.net/ubuntu/"
PRIVACY_POLICY_URL="https://www.ubuntu.com/legal/terms-and-policies/privacy-policy"
UBUNTU_CODENAME=noble
LOGO=ubuntu-logo

当你探索完毕后,通过输入以下命令退出容器:

exit

这将使你返回到主机终端。

容器生命周期管理

让我们来探索如何管理容器的生命周期。首先,我们将以分离模式启动一个容器:

docker run -d --name web nginx

此命令:

  • -d 以分离模式(在后台)运行容器
  • --name web 为容器指定名称“web”
  • nginx 是要使用的镜像

你会在屏幕上看到一个很长的容器 ID。

现在,让我们检查一下容器是否正在运行:

docker ps

你应该会看到 nginx 容器正在运行:

CONTAINER ID   IMAGE     COMMAND                  CREATED          STATUS          PORTS     NAMES
7d3f8c1f8a3d   nginx     "/docker-entrypoint.…"   10 seconds ago   Up 10 seconds   80/tcp    web

要停止容器,请执行:

docker stop web

验证容器是否已停止:

docker ps

该容器应该不再出现在正在运行的容器列表中。若要查看包括已停止容器在内的所有容器,请执行:

docker ps -a

你应该会看到 nginx 和“hello - world”容器都处于已停止状态。

要再次启动容器,请执行:

docker start web

当你不再需要某个容器时,可将其移除:

docker stop web
docker rm web

管理 Docker 镜像

让我们来探索如何管理 Docker 镜像。要列出所有镜像,请执行:

docker images

你至少应该会看到“hello - world”和 nginx 镜像。

当你不再需要某个镜像时,可将其移除:

docker rmi hello-world

请注意,你无法移除正在被容器使用的镜像(即使是已停止的容器)。你需要先移除这些容器。

Docker 系统信息

要检查 Docker(容器、镜像、卷)占用的磁盘空间,请执行:

docker system df

这将显示磁盘使用情况的摘要:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          2         1         187.8MB   187.8MB (99%)
Containers      2         0         0B        0B
Local Volumes   0         0         0B        0B
Build Cache     0         0         0B        0B

要获取更详细的信息,请执行:

docker system df -v

这将显示每个镜像和容器的详细信息及其大小。

解决常见的 Docker 问题

即使 Docker 环境安装正确,你在日常使用中也可能会遇到问题。让我们来探讨一些常见的 Docker 问题及其解决方法。

问题:Docker 守护进程未运行

如果你已经在前面的步骤中启动了 Docker 服务,则可以跳过此步骤。

如果你尝试运行 Docker 命令并收到如下错误:

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

这意味着 Docker 守护进程没有运行。要解决这个问题:

  1. 检查 Docker 服务的状态:
sudo systemctl status docker
  1. 如果服务未运行,则启动它:
sudo systemctl start docker
  1. 如果服务启动失败,检查日志以查找错误:
sudo journalctl -u docker

让我们模拟这个问题及其解决过程:

## 首先,停止 Docker 服务以模拟问题
sudo systemctl stop docker

## 尝试运行 Docker 命令
docker ps

## 你会看到 “Cannot connect” 错误
## 现在重启服务来修复问题
sudo systemctl start docker

## 验证 Docker 是否再次正常工作
docker ps

问题:权限被拒绝

如果你看到如下错误:

Got permission denied while trying to connect to the Docker daemon socket

这通常意味着你的用户没有权限访问 Docker 套接字。解决方法是将你的用户添加到 docker 组:

sudo usermod -aG docker $USER

运行此命令后,通常需要注销并重新登录才能使更改生效。由于我们处于使用 labex 用户的实验环境中,该用户已经拥有适当的权限,因此我们不需要执行此步骤。

问题:磁盘空间问题

随着时间的推移,Docker 会因未使用的镜像、容器和卷而占用大量磁盘空间。如果你的系统磁盘空间不足:

  1. 检查 Docker 的磁盘使用情况:
docker system df
  1. 移除未使用的资源:
## 移除所有已停止的容器
docker container prune

## 移除所有未使用的镜像
docker image prune

## 移除所有未使用的卷
docker volume prune

## 或者使用一个命令移除所有未使用的资源
docker system prune

让我们演示一下清理命令的使用:

## 创建一些会立即退出的容器
docker run hello-world
docker run ubuntu echo "This will exit immediately"

## 现在清理已停止的容器
docker container prune

你会被要求确认操作:

WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y

输入 y 进行确认。你应该会看到显示已移除容器的输出。

问题:容器无法启动

如果容器无法启动,你可以通过查看其日志来进行调查:

## 首先,尝试启动一个可能会失败的容器
docker run --name failing-container ubuntu apt-get update

## 查看日志
docker logs failing-container

你可能会在日志中看到指示容器失败原因的错误信息。

问题:网络问题

如果容器之间无法通信,或者无法与外部网络通信:

  1. 检查 Docker 的网络配置:
docker network ls
  1. 检查特定网络的详细信息:
docker network inspect bridge
  1. 在容器内部测试网络连接:
## 启动一个具有网络功能的容器
docker run -it ubuntu bash

## 在容器内部安装 ping 工具
apt-get update && apt-get install -y iputils-ping

## 尝试 ping 一个网站
ping google.com

## 退出容器
exit

Docker 日志和调试

对于一般的 Docker 故障排除,查看 Docker 守护进程的日志会很有帮助:

sudo journalctl -u docker

要查看特定容器的日志:

docker logs <container_id>

你还可以实时查看日志流:

docker logs -f <container_id>

这些故障排除技巧将帮助你诊断和解决大多数常见的 Docker 问题。

总结

在本次实验中,你已经学习了验证和管理 Docker 安装的重要技能:

  • 检查 Docker 版本和守护进程状态,以确认安装是否正确
  • 运行测试容器,以验证 Docker 的功能
  • 使用基本的 Docker 命令来管理容器和镜像
  • 探索容器的生命周期管理
  • 解决常见的 Docker 问题

这些技能为使用 Docker 容器奠定了坚实的基础。现在,你可以自信地验证 Docker 环境是否正确设置,并解决可能出现的任何问题。

在你继续探索 Docker 的过程中,可以基于这些基础知识,高效地创建、部署和管理容器化应用程序。