介绍
欢迎来到本实践实验,我们将一起学习 Docker 容器安全的基础知识。Docker 是一个强大的平台,用于在容器中开发、分发和运行应用程序。虽然容器提供了进程隔离,但为了保护你的应用程序和宿主系统,对其进行安全加固至关重要。
在本实验中,你将探索 Docker 容器安全的基础知识。首先,你将验证 Docker 是否已在 LabEx 环境中正确配置。然后,你将运行一个基础的 Nginx Web 服务器容器,检查其运行进程,并查看其资源消耗。最后,你将学习如何通过为容器设置资源限制来应用基础的安全控制。
完成本实验后,你将对保护 Docker 环境的初始步骤有一个实际的理解。
验证 Docker 安装和设置
在此步骤中,你将验证 Docker 是否已在 LabEx 环境中安装,并确保你拥有使用它的适当权限。
LabEx 虚拟机预装了 Docker。让我们先检查 Docker 版本,以确认它可用。
docker --version
你应该会看到类似以下的输出,确认 Docker 已正确安装:
Docker version 20.10.21, build 20.10.21-0ubuntu1~22.04.3
现在,让我们检查 Docker 守护进程(daemon)是否正在运行:
sudo systemctl status docker
此命令将显示 Docker 服务的状态。你应该会看到它处于活动状态并正在运行。
要运行 Docker 命令而不使用 sudo,你的用户需要属于 docker 组。在 LabEx 环境中,你的用户已配置了适当的权限。让我们验证一下:
groups $USER
你应该会在输出中看到 docker,这确认了你的用户拥有必要的权限:
labex : labex sudo docker ssl-cert
由于你的用户已在 docker 组中,你可以直接运行 Docker 命令,而无需使用 sudo。
让我们通过运行一个简单的命令来测试 Docker 是否正常工作:
docker info
此命令将显示有关 Docker 的系统范围信息,确认你可以成功与 Docker 守护进程通信。
运行基础 Web 服务器容器
在此步骤中,你将运行你的第一个容器。我们将使用官方的 nginx 镜像,它提供了一个轻量级且高性能的 Web 服务器。
要运行容器,你使用 docker run 命令。我们将使用几个常用标志:
-d: 以分离模式(在后台)运行容器。-p 8080:80: 将宿主机上的 8080 端口映射到容器内的 80 端口。这允许你通过localhost:8080访问 Nginx 服务器。--name webserver: 为你的容器指定一个易记的名称。nginx: 要使用的镜像名称。
执行以下命令来启动 Nginx 容器:
docker run -d -p 8080:80 --name webserver nginx
Docker 会首先检查本地是否可用 nginx 镜像。如果不可用,它会自动从 Docker Hub 下载,然后启动容器。你可以使用 docker ps 命令查看容器是否正在运行。
docker ps
输出将显示你的 webserver 容器、其 ID、它基于的镜像以及端口映射。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
a1b2c3d4e5f6 nginx "/docker-entrypoint.…" 10 seconds ago Up 9 seconds 0.0.0.0:8080->80/tcp webserver
现在,让我们测试 Web 服务器是否正常工作。使用 curl 向服务器的映射端口发送请求。
curl localhost:8080
你应该会看到默认的 Nginx 欢迎页面 HTML 作为输出,这证实了你的容器正在运行且可访问。
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html {
color-scheme: light dark;
}
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>
If you see this page, the nginx web server is successfully installed and
working. For further configuration, refer to the
<a href="http://nginx.org/">nginx.org</a> documentation.
</p>
<p><em>Thank you for using nginx.</em></p>
</body>
</html>
检查容器进程和资源使用情况
在此步骤中,你将学习如何检查容器内运行的进程以及监控其资源消耗。这是调试和理解容器化应用程序行为的一项基本技能。
容器的一个关键特性是进程隔离。从宿主机的角度来看,你可以在不进入容器的情况下查看容器内正在运行的内容。docker top 命令允许你查看容器的主要进程。
运行以下命令以查看 webserver 容器内的进程:
docker top webserver
输出显示 Nginx 主进程以 root 用户运行,其工作进程以 systemd+(一个用于提高安全性的系统用户)运行。请注意,有多个工作进程,这对于 Nginx 高效处理并发请求来说是典型的。
UID PID PPID C STIME TTY TIME CMD
root 4098 4078 0 14:34 ? 00:00:00 nginx: master process nginx -g daemon off;
systemd+ 4161 4098 0 14:34 ? 00:00:00 nginx: worker process
systemd+ 4162 4098 0 14:34 ? 00:00:00 nginx: worker process
接下来,我们来看一下容器的资源使用情况。docker stats 命令提供容器 CPU、内存、网络和磁盘 I/O 的实时流。为了获取本次实验的静态快照,我们将使用 --no-stream 标志。
docker stats --no-stream webserver
此命令将显示一个表格,其中包含 webserver 容器当前的资源指标。
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
bda2386621a1 webserver 0.00% 3.125MiB / 3.505GiB 0.09% 6.31kB / 1.27kB 0B / 12.3kB 3
从这个输出中,你可以看到容器使用的 CPU 非常少(0.00%),内存使用量约为 3.1 MiB,而可用系统内存为 3.5 GiB(0.09%),并且有 3 个正在运行的进程(Nginx 主进程和 2 个工作进程)。这些信息对于识别应用程序中的性能瓶颈或潜在的资源泄漏至关重要。
检查容器安全属性,例如资源限制
在此步骤中,你将探索最基本但至关重要的容器安全功能之一:资源限制。默认情况下,容器可以使用宿主机任意数量的 CPU 和内存。设置限制可以防止单个容器耗尽所有可用资源,从而影响其他容器或宿主机本身。
首先,让我们检查一下我们之前创建的 webserver 容器的配置。docker inspect 命令提供详细的 JSON 输出,其中包含容器的所有设置。
docker inspect webserver
输出内容非常长。你可以使用 --format 标志来提取特定字段。让我们检查一下是否设置了内存限制。
docker inspect --format='{{.HostConfig.Memory}}' webserver
输出将是 0,这意味着没有设置内存限制。
0
现在,让我们创建一个带有内存限制的新容器。首先,你需要停止并删除现有容器,因为我们将重用端口映射。
docker stop webserver
docker rm webserver
接下来,运行一个新的 Nginx 容器,但这次添加 --memory="100m" 标志将其内存使用限制为 100 兆字节。我们还将为其指定一个新名称。
docker run -d -p 8080:80 --name webserver-limited --memory="100m" nginx
现在,检查这个新容器的内存限制。
docker inspect --format='{{.HostConfig.Memory}}' webserver-limited
这次,输出将是内存限制(以字节为单位,即 100 × 1024 × 1024)。
104857600
你已成功为容器应用了资源约束,这是容器安全和资源管理的基础步骤。
总结
在此实验中,你获得了 Docker 和容器安全基础知识的实践经验。
你成功地:
- 验证了 Docker 安装并在 LabEx 环境中配置了适当的访问权限。
- 运行了一个基本的 Nginx Web 服务器作为 Docker 容器。
- 映射了端口以便从宿主机访问容器化应用程序。
- 使用
docker top检查了容器内运行的进程。 - 使用
docker stats监控了实时资源使用情况。 - 学习了如何为容器设置资源限制(例如内存),以提高系统稳定性和安全性。
这些技能是管理和保护生产环境中更复杂的、多容器应用程序的基石。



