介绍
Docker 容器是现代应用部署的基石。在本实验中,我们将探索高级容器管理技术,这将加深你对 Docker 功能的理解。我们将涵盖以不同模式运行容器、管理其生命周期、检查容器详情、处理日志、在容器内部执行命令、复制文件、设置环境变量以及限制容器资源。通过本实验,你将全面掌握如何高效地操作 Docker 容器。
以不同模式运行容器
Docker 允许你以不同的模式运行容器,以适应各种使用场景。我们将探索两种常见的模式:分离模式(detached mode)和交互模式(interactive mode)。
首先,让我们以分离模式运行一个容器:
docker run -d --name nginx-detached nginx
该命令执行以下操作:
-d:以分离模式(在后台)运行容器--name nginx-detached:为容器分配名称「nginx-detached」nginx:指定要使用的镜像(如果本地没有,将从 Docker Hub 拉取)
你应该会看到输出一长串字符,这就是容器 ID。
你可以通过运行以下命令检查容器状态:
docker ps
现在,让我们以交互模式运行一个容器:
docker run -it --name ubuntu-interactive ubuntu /bin/bash
该命令执行以下操作:
-it:以交互模式运行容器并分配一个伪终端(pseudo-TTY)--name ubuntu-interactive:为容器分配名称「ubuntu-interactive」ubuntu:指定要使用的镜像/bin/bash:在容器内运行的命令(在本例中是一个 bash shell)
你现在应该已经进入了 Ubuntu 容器内部。你可以通过输入 exit 退出容器。
让我们列出正在运行的容器:
docker ps
你应该能看到 nginx-detached 容器正在运行,但看不到 ubuntu-interactive 容器(因为我们已经退出了)。
管理容器生命周期
了解如何启动、停止和重启容器对于有效的容器管理至关重要。
首先,让我们停止 nginx-detached 容器:
docker stop nginx-detached
现在,检查容器的状态:
docker ps -a
你应该会看到 nginx-detached 容器现在处于「Exited」状态。
让我们再次启动它:
docker start nginx-detached
再次检查状态:
docker ps
你应该会看到 nginx-detached 容器现在处于「Up」状态。
我们还可以重启一个运行中的容器:
docker restart nginx-detached
要查看容器的当前状态(包括已停止的容器),请使用:
docker ps -a
你应该能看到 nginx-detached 和 ubuntu-interactive 容器都在列表中,并显示它们的当前状态。
让我们删除已停止的 ubuntu-interactive 容器:
docker rm ubuntu-interactive
并验证它已被删除:
docker ps -a
你不再会在列表中看到 ubuntu-interactive 容器。
检查容器详情
Docker 提供了强大的工具来检查容器的详细信息。让我们来探索一下。
要获取有关容器的详细信息,请使用 inspect 命令:
docker inspect nginx-detached
该命令会输出一个包含容器详细信息的 JSON 数组。信息量可能很大,所以让我们使用过滤器来获取特定信息。
获取容器的 IP 地址:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx-detached
查看容器的当前状态:
docker inspect -f '{{.State.Status}}' nginx-detached
这些命令使用 Go 模板来过滤输出。-f 标志允许我们指定格式模板。
让我们也检查一下端口映射:
docker port nginx-detached
端口映射允许容器与宿主机系统或外部网络进行通信。它将宿主机系统上的端口映射到容器内部的端口。这对于从 Docker 环境外部访问容器内运行的服务至关重要。
如果没有映射端口,此命令将不会产生任何输出。在我们的例子中,我们没有显式地为 nginx-detached 容器映射任何端口,因此你可能看不到任何输出。
为了演示端口映射,让我们创建一个带有端口映射的新 Nginx 容器:
docker run -d --name nginx-with-port -p 8080:80 nginx
此命令将宿主机的 8080 端口映射到容器的 80 端口。现在,如果我们检查端口映射:
docker port nginx-with-port
你应该会看到类似以下的输出:
80/tcp -> 0.0.0.0:8080
这意味着发送到宿主机 8080 端口的流量将被转发到容器内的 80 端口,即 Nginx 监听的地方。
处理容器日志
访问和理解容器日志对于排除故障和监控应用至关重要。
让我们查看 nginx 容器的日志:
docker logs nginx-detached
这将显示容器启动以来的所有日志。要仅查看最近的日志,可以使用 --tail 选项:
docker logs --tail 10 nginx-detached
这仅显示最后 10 行日志。
要实时跟踪日志(类似于 tail -f),请使用 -f 选项:
docker logs -f nginx-detached
这将持续流式传输新生成的日志条目。按 Ctrl+C 退出日志流。
你还可以为日志条目获取时间戳:
docker logs --timestamps nginx-detached
这对于调试对时间敏感的问题特别有用。
在运行中的容器内执行命令
Docker 允许你在运行中的容器内部执行命令,这对于调试和维护非常有用。
首先,在我们的 nginx 容器中执行一个简单的命令:
docker exec nginx-detached echo "Hello from inside the container"
你应该会在终端看到打印出「Hello from inside the container」。
现在,让我们在容器内获取一个交互式 shell:
docker exec -it nginx-detached /bin/bash
你现在已经在容器内部了。让我们探索一下:
ls /etc/nginx
cat /etc/nginx/nginx.conf
exit
这些命令列出了 Nginx 配置目录的内容,并显示了 Nginx 的主配置文件。exit 命令会将你返回到宿主机系统的 shell。
在容器与宿主机之间复制文件
Docker 提供了一种在宿主机系统和容器之间复制文件的方法。这对于更新配置文件或检索日志等任务非常有用。
首先,在宿主机系统上创建一个简单的 HTML 文件:
echo "<html><body><h1>Hello from host</h1></body></html>" > hello.html
现在,将此文件复制到我们的 nginx 容器中:
docker cp hello.html nginx-detached:/usr/share/nginx/html/hello.html
我们可以通过在容器中执行命令来验证文件是否已复制:
docker exec nginx-detached cat /usr/share/nginx/html/hello.html
你应该能看到 HTML 文件的内容。
现在,让我们将一个文件从容器复制到宿主机:
docker cp nginx-detached:/etc/nginx/nginx.conf ~/project/nginx.conf
这将 Nginx 配置文件从容器复制到宿主机上的当前目录。
你可以验证文件是否已复制:
ls -l ~/project/nginx.conf
你应该能看到列出的 nginx.conf 文件。
在容器中设置环境变量
环境变量是配置容器中运行的应用的关键方式。让我们探索如何设置和使用它们。
首先,运行一个带有环境变量的新容器:
docker run --name env-test -e MY_VAR="Hello, Environment" -d ubuntu sleep infinity
该命令执行以下操作:
--name env-test:将容器命名为「env-test」-e MY_VAR="Hello, Environment":设置一个名为 MY_VAR 的环境变量-d:以分离模式运行容器ubuntu:使用 Ubuntu 镜像sleep infinity:让容器无限期运行
现在,让我们验证环境变量是否已设置:
docker exec env-test env | grep MY_VAR
你应该在输出中看到 MY_VAR=Hello, Environment。
我们还可以使用文件来设置环境变量。创建一个名为 env_file 的文件,内容如下。
你可以使用 nano 或 vim 创建该文件:
nano env_file
ANOTHER_VAR=From a file
YET_ANOTHER_VAR=Also from the file
按 Ctrl+X,然后按 Y 和 Enter 退出编辑器并保存文件。
现在,使用此文件启动另一个容器:
docker run --name env-file-test --env-file env_file -d ubuntu sleep infinity
验证这个新容器中的环境变量:
docker exec env-file-test env | grep -E "ANOTHER_VAR|YET_ANOTHER_VAR"
你应该在输出中看到文件中的两个变量。
限制容器资源
Docker 允许你限制容器可以使用的资源(CPU 和内存)。这对于在多容器环境中管理资源分配至关重要。
让我们启动一个带有内存和 CPU 限制的容器:
docker run --name limited-nginx -d --memory=512m --cpus=0.5 nginx
该命令执行以下操作:
--name limited-nginx:将容器命名为「limited-nginx」-d:以分离模式运行容器--memory=512m:将容器限制为 512 MB 内存--cpus=0.5:限制容器最多使用半个 CPU 核心nginx:使用 Nginx 镜像
我们可以使用 inspect 命令验证这些限制:
docker inspect -f '{{.HostConfig.Memory}}' limited-nginx
docker inspect -f '{{.HostConfig.NanoCpus}}' limited-nginx
第一个命令将输出 536870912(以字节为单位的 512MB),第二个命令将输出 500000000(以纳单位表示的 0.5 CPU)。
要实时查看这些限制如何影响容器,我们可以使用 stats 命令:
docker stats limited-nginx
这将显示资源使用统计数据的实时流。按 Ctrl+C 退出统计视图。
总结
在本实验中,我们探索了 Docker 中的高级容器管理技术。我们学习了如何以不同模式运行容器、管理其生命周期、检查容器详情、处理日志、在容器内部执行命令、复制文件、设置环境变量以及限制容器资源。这些技能为在更复杂的场景中使用 Docker 容器打下了坚实的基础。
请记住,有效的容器管理对于构建可扩展且易于维护的容器化应用至关重要。随着你继续 Docker 之旅,你会发现这些技能在调试、优化和管理容器化环境时非常宝贵。
继续练习这些命令并探索 Docker 的功能。你与容器打交道越多,就会变得越得心应手。祝你容器化之旅愉快!



