简介
Docker 是一个强大的容器化平台,它彻底改变了开发者构建、部署和管理应用程序的方式。在本教程中,你将学习如何验证 Docker 安装并确保其正常运行。你还将了解如何解决使用 Docker 时可能出现的常见问题。
在本实验结束时,你将深入了解如何查看 Docker 安装细节并验证 Docker 环境是否正常运行。
本实验需要联网学习,因此只有 LabEx Pro 用户可以启动虚拟机。升级到 Pro 账户
Docker 是一个强大的容器化平台,它彻底改变了开发者构建、部署和管理应用程序的方式。在本教程中,你将学习如何验证 Docker 安装并确保其正常运行。你还将了解如何解决使用 Docker 时可能出现的常见问题。
在本实验结束时,你将深入了解如何查看 Docker 安装细节并验证 Docker 环境是否正常运行。
本实验需要联网学习,因此只有 LabEx Pro 用户可以启动虚拟机。升级到 Pro 账户
在开始进行 Docker 操作之前,务必验证 Docker 已正确安装在你的系统上并正常运行。在这一步中,我们将检查 Docker 版本和守护进程状态。
首先,让我们检查一下系统上安装的 Docker 版本。打开终端并运行以下命令:
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 容器的后台服务。
运行以下命令:
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 info
命令:
docker info
这将显示有关你的 Docker 安装的详细信息,包括:
输出内容会比较多,但能提供有关你的 Docker 配置的有价值信息。
既然我们已经确认 Docker 已安装并正在运行,那就通过运行一个简单的容器来测试一下。这一步将验证 Docker 能否正确下载镜像并运行容器。
Docker 提供了一个专门用于测试 Docker 安装的简单“hello-world”镜像。这个微小的容器可以验证以下几点:
让我们使用以下命令运行这个测试容器:
docker run hello-world
当你首次运行此命令时,Docker 会执行以下操作:
你应该会看到类似于以下的输出:
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 退出(表示成功)。
“hello-world”镜像已下载到你的本地机器上。让我们通过列出所有 Docker 镜像来验证这一点:
docker images
你应该会看到类似于以下的输出:
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest feb5d9fea6a5 6 months ago 13.3kB
这确认了“hello-world”镜像已存储在你的系统本地。
既然我们已经验证了 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 images
你至少应该会看到“hello - world”和 nginx 镜像。
当你不再需要某个镜像时,可将其移除:
docker rmi hello-world
请注意,你无法移除正在被容器使用的镜像(即使是已停止的容器)。你需要先移除这些容器。
要检查 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 命令并收到如下错误:
Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
这意味着 Docker 守护进程没有运行。要解决这个问题:
sudo systemctl status docker
sudo systemctl start docker
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 会因未使用的镜像、容器和卷而占用大量磁盘空间。如果你的系统磁盘空间不足:
docker system df
## 移除所有已停止的容器
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
你可能会在日志中看到指示容器失败原因的错误信息。
如果容器之间无法通信,或者无法与外部网络通信:
docker network ls
docker network inspect bridge
## 启动一个具有网络功能的容器
docker run -it ubuntu bash
## 在容器内部安装 ping 工具
apt-get update && apt-get install -y iputils-ping
## 尝试 ping 一个网站
ping google.com
## 退出容器
exit
对于一般的 Docker 故障排除,查看 Docker 守护进程的日志会很有帮助:
sudo journalctl -u docker
要查看特定容器的日志:
docker logs <container_id>
你还可以实时查看日志流:
docker logs -f <container_id>
这些故障排除技巧将帮助你诊断和解决大多数常见的 Docker 问题。
在本次实验中,你已经学习了验证和管理 Docker 安装的重要技能:
这些技能为使用 Docker 容器奠定了坚实的基础。现在,你可以自信地验证 Docker 环境是否正确设置,并解决可能出现的任何问题。
在你继续探索 Docker 的过程中,可以基于这些基础知识,高效地创建、部署和管理容器化应用程序。