Docker Run 命令参数

DockerDockerBeginner
立即练习

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

介绍

在本实验中,我们将专注于 docker run 命令及其各种参数。docker run 命令是 Docker 操作的基础,它允许我们创建并启动具有特定配置的容器。

通过掌握该命令的参数,你将能够更好地控制容器化应用程序,提升部署和管理 Docker 容器的能力。

我们将涵盖广泛的参数,包括命名、后台模式、端口映射、卷挂载、环境变量、资源限制等。

其中一些参数你可能已经熟悉,而另一些可能是全新的。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL docker(("`Docker`")) -.-> docker/ContainerOperationsGroup(["`Container Operations`"]) docker(("`Docker`")) -.-> docker/VolumeOperationsGroup(["`Volume Operations`"]) docker(("`Docker`")) -.-> docker/NetworkOperationsGroup(["`Network Operations`"]) docker/ContainerOperationsGroup -.-> docker/run("`Run a Container`") docker/ContainerOperationsGroup -.-> docker/ls("`List Containers`") docker/ContainerOperationsGroup -.-> docker/exec("`Execute Command in Container`") docker/ContainerOperationsGroup -.-> docker/inspect("`Inspect Container`") docker/ContainerOperationsGroup -.-> docker/port("`List Container Ports`") docker/VolumeOperationsGroup -.-> docker/volume("`Manage Volumes`") docker/NetworkOperationsGroup -.-> docker/network("`Manage Networks`") subgraph Lab Skills docker/run -.-> lab-389228{{"`Docker Run 命令参数`"}} docker/ls -.-> lab-389228{{"`Docker Run 命令参数`"}} docker/exec -.-> lab-389228{{"`Docker Run 命令参数`"}} docker/inspect -.-> lab-389228{{"`Docker Run 命令参数`"}} docker/port -.-> lab-389228{{"`Docker Run 命令参数`"}} docker/volume -.-> lab-389228{{"`Docker Run 命令参数`"}} docker/network -.-> lab-389228{{"`Docker Run 命令参数`"}} end

基础 Docker Run 与容器命名

让我们从 docker run 的基础开始,并探索如何为容器命名。

首先,运行一个基础的 Nginx 容器:

docker run nginx

这条命令在前台运行一个 Nginx 容器。你会在终端中看到日志输出的流。这是因为容器在前台运行,并直接向你展示日志。

要停止这个容器,请按下 Ctrl+C。你可能会注意到它需要几秒钟才能停止——这是正常的,因为 Docker 正在给容器时间以优雅地关闭。

现在,让我们以后台模式运行它,并为其命名:

docker run -d --name my-nginx nginx

让我们分解一下这条命令:

  • docker run:这是运行容器的基本命令。
  • -d:这个选项以后台模式运行容器,意味着它会在后台运行。你不会在终端中看到任何输出。
  • --name my-nginx:这为容器分配了名称 "my-nginx"。如果你不指定名称,Docker 会分配一个随机名称。
  • nginx:这是我们用来创建容器的镜像名称。

运行这条命令后,你会看到一长串字符。这是容器的 ID。Docker 已经在后台启动了容器。

如果你遇到名称已被使用的错误,这意味着你已经有一个同名的容器。你可以选择另一个名称,或者删除现有的容器(我们将在后续实验中学习如何做到这一点)。

端口映射

docker run 中的 -p 参数允许我们将容器中的端口映射到主机。这对于从主机访问容器内运行的服务至关重要。

运行一个带有端口映射的 Nginx 容器:

docker run -d --name nginx-mapped -p 8080:80 nginx

让我们分解一下这条命令中的新部分:

  • -p 8080:80:这将主机上的端口 8080 映射到容器中的端口 80。格式始终为 host_port:container_port

Nginx 默认在容器内的端口 80 上运行。通过将其映射到主机上的端口 8080,我们可以在浏览器中访问 localhost:8080 来查看它。

现在,让我们验证 Nginx 欢迎页面是否可以访问。我们将使用 curl 命令,它允许我们从命令行发起 HTTP 请求:

curl http://localhost:8080

你应该会看到 Nginx 欢迎页面的 HTML 内容。如果你没有安装 curl,可以通过以下命令安装:

sudo apt-get update && sudo apt-get install -y curl

如果你仍然无法访问页面,可以检查以下几点:

  1. 确保容器正在运行:docker ps | grep nginx-mapped
  2. 检查端口是否实际映射:docker port nginx-mapped
  3. 如果你使用的是云服务器,请确保防火墙允许端口 8080 的流量。

卷挂载

docker run 中的 -v 参数允许我们挂载卷,从而在主机和容器之间共享数据。这对于持久化数据或向容器提供配置文件非常有用。

让我们首先在主机上创建一个简单的目录结构:

mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html

这些命令的作用如下:

  1. 在你的主目录下的 project 文件夹中创建一个新目录 nginx-data
  2. 在这个新目录中创建一个名为 index.html 的简单 HTML 文件。

现在,让我们运行一个 Nginx 容器并挂载这个目录:

docker run -d --name nginx-volume -p 8081:80 -v ~/project/nginx-data:/usr/share/nginx/html nginx

让我们分解一下这条命令:

  • docker run:这是运行新容器的命令。
  • -d:这以后台模式运行容器(在后台运行)。
  • --name nginx-volume:这为我们的容器分配名称 "nginx-volume"。
  • -p 8081:80:这将主机上的端口 8081 映射到容器中的端口 80。
  • -v ~/project/nginx-data:/usr/share/nginx/html:这将主机上的 nginx-data 目录挂载到容器中的 /usr/share/nginx/html 目录。这是 Nginx 查找要提供内容的位置。
  • nginx:这是我们用来创建容器的镜像名称。

现在,让我们验证自定义页面是否正在提供服务:

curl http://localhost:8081

你应该会看到自定义 HTML 文件的内容:"Hello from mounted volume!"

如果你没有看到自定义内容,可以检查以下几点:

  1. 确保主机系统上存在 ~/project/nginx-data/index.html 文件。
  2. 检查容器是否正在运行:docker ps | grep nginx-volume
  3. 检查 Nginx 日志以查找任何错误:docker logs nginx-volume

这种将主机目录挂载到容器的方法称为绑定挂载(bind mount)。这是在主机和容器之间共享文件的直接方法。以下是需要记住的几个关键点:

  1. 主机目录路径必须是绝对路径。
  2. 如果主机目录不存在,Docker 会自动创建它。
  3. 对此目录中的文件所做的任何更改(无论是在主机上还是在容器中)都会立即对主机和容器可见。
  4. 注意权限问题:容器默认以 root 用户运行,这可能会创建主机用户无法修改的文件。

通过使用这种方法,我们避免了“不是目录”的错误,因为我们挂载的是目录,而不是单个文件。这种方法使你可以更灵活地添加、删除或修改文件,而无需重新创建容器。

环境变量

docker run 中的 -e 参数允许我们在容器中设置环境变量。这对于在不更改代码的情况下配置容器中运行的应用程序非常有用。

运行一个带有环境变量的容器:

docker run -d --name nginx-env -e NGINX_HOST=mywebsite.com -e NGINX_PORT=80 nginx

让我们分解一下新部分:

  • -e NGINX_HOST=mywebsite.com:这设置了一个名为 NGINX_HOST 的环境变量,其值为 mywebsite.com
  • -e NGINX_PORT=80:这设置了另一个环境变量 NGINX_PORT,其值为 80

环境变量是键值对,可以被容器内运行的进程访问。许多 Docker 镜像设计为使用特定的环境变量进行配置。

你可以验证环境变量:

docker exec nginx-env env | grep NGINX_

这条命令的作用如下:

  • docker exec nginx-env:这告诉 Docker 在运行的 nginx-env 容器中执行命令。
  • env:这条命令打印出所有环境变量。
  • | grep NGINX_:这过滤输出,仅显示包含 "NGINX_" 的行。

你应该会看到列出的两个环境变量。

如果你没有看到环境变量,请检查:

  1. 容器是否正在运行?使用 docker ps | grep nginx-env 验证。
  2. 你在 docker run 命令中是否正确拼写了环境变量名称?

资源限制

Docker 允许你使用 docker run 中的各种参数为容器设置资源限制。这对于管理主机系统的性能和稳定性至关重要,尤其是在运行多个容器时。

运行一个带有内存和 CPU 限制的容器:

docker run -d --name nginx-limited --memory 256m --cpus 0.5 nginx

让我们分解一下新部分:

  • --memory 256m:这将容器的内存限制为 256 兆字节。'm' 表示兆字节。你也可以使用 'g' 表示千兆字节。
  • --cpus 0.5:这将容器的 CPU 使用限制为最多半个 CPU 核心。

这些限制可以防止容器使用超过指定的资源量,从而帮助防止单个容器独占主机的资源。

你可以验证这些限制是否正确应用:

docker inspect -f '{{.HostConfig.Memory}}' nginx-limited
docker inspect -f '{{.HostConfig.NanoCpus}}' nginx-limited

第一条命令应输出 268435456(256MB 的字节数),第二条命令应输出 500000000(0.5 CPU 的纳单位)。

如果你看到不同的值,请仔细检查你的 docker run 命令,确保正确指定了限制。

注意:将资源限制设置得过低可能会导致容器性能不佳甚至崩溃。如果你的容器出现问题,请尝试增加这些限制。

网络设置

docker run 中的 --network 参数允许你将容器连接到网络。这对于容器之间的通信以及隔离容器组非常有用。

首先,创建一个自定义的桥接网络:

docker network create my-custom-network

这将创建一个名为 my-custom-network 的新桥接网络。桥接网络是 Docker 中最常见的网络类型。

现在,运行一个连接到该网络的容器:

docker run -d --name nginx-networked --network my-custom-network nginx

--network my-custom-network 选项将容器连接到我们刚刚创建的网络。

同一网络上的容器可以使用其容器名称作为主机名相互通信。这使得将服务链接在一起变得非常容易。

如果你收到网络不存在的错误,请确保你已使用 docker network create 命令正确创建了网络。

重启策略

docker run 中的 --restart 参数允许你为容器指定重启策略。这对于确保容器在崩溃或 Docker 守护进程重启时保持运行非常有用。

运行一个带有重启策略的容器:

docker run -d --name nginx-restart --restart unless-stopped nginx

--restart unless-stopped 选项将重启策略设置为 "unless-stopped",这意味着容器将自动重启,除非用户明确停止它。

其他重启策略包括:

  • no:默认值。不自动重启容器。
  • on-failure:仅在容器以非零状态退出时重启。
  • always:无论退出状态如何,始终重启容器。

你可以验证重启策略:

docker inspect -f '{{.HostConfig.RestartPolicy.Name}}' nginx-restart

这应该输出 unless-stopped

如果你没有看到预期的输出,请仔细检查你的 docker run 命令,确保正确指定了重启策略。

工作目录与命令

在这一步中,我们将探索如何在容器内设置工作目录,并在容器启动时运行自定义命令。

docker run 中的 -w 参数用于设置容器内的工作目录,你可以在镜像名称后指定要运行的命令。

让我们结合这些概念:

docker run -d --name nginx-custom -w /app nginx sh -c "touch newfile.txt && nginx -g 'daemon off;'"

让我们分解这条命令:

  • -d:以后台模式运行容器(在后台运行)。
  • --name nginx-custom:将容器命名为 "nginx-custom"。
  • -w /app:将容器内的工作目录设置为 /app
  • nginx:使用的镜像名称。
  • sh -c "...":运行一个 shell 命令。
    • touch newfile.txt:创建一个名为 newfile.txt 的空文件。
    • &&:如果前一个命令成功,则运行下一个命令。
    • nginx -g 'daemon off;':在前台启动 Nginx,保持容器运行。

现在,让我们验证容器是否正在运行以及文件是否已创建:

docker ps | grep nginx-custom
docker exec nginx-custom ls -l /app/newfile.txt

第一条命令应显示容器正在运行,第二条命令应列出容器内 /app 目录中 newfile.txt 文件的详细信息。

总结

在本实验中,我们深入探讨了 docker run 命令,探索了它的各种参数和选项。我们涵盖了以下内容:

  1. 基础容器运行与命名
  2. 端口映射以从主机访问容器服务
  3. 卷挂载以在主机和容器之间共享数据
  4. 设置环境变量以配置容器
  5. 应用资源限制以控制容器的资源使用
  6. 网络设置以实现容器间通信
  7. 重启策略以提高容器的可靠性
  8. 工作目录和命令规范以控制容器启动

docker run 的这些参数为配置和管理 Docker 容器提供了强大的工具。通过掌握这些选项,你可以创建更复杂和定制化的容器部署。你可以控制容器如何与主机系统交互、它们可以消耗哪些资源,以及它们在不同场景下的行为。

您可能感兴趣的其他 Docker 教程