介绍
在本实验中,我们将专注于 docker run
命令及其各种参数。docker run
命令是 Docker 操作的基础,它允许我们创建并启动具有特定配置的容器。
通过掌握该命令的参数,你将能够更好地控制容器化应用程序,提升部署和管理 Docker 容器的能力。
我们将涵盖广泛的参数,包括命名、后台模式、端口映射、卷挂载、环境变量、资源限制等。
其中一些参数你可能已经熟悉,而另一些可能是全新的。
在本实验中,我们将专注于 docker run
命令及其各种参数。docker run
命令是 Docker 操作的基础,它允许我们创建并启动具有特定配置的容器。
通过掌握该命令的参数,你将能够更好地控制容器化应用程序,提升部署和管理 Docker 容器的能力。
我们将涵盖广泛的参数,包括命名、后台模式、端口映射、卷挂载、环境变量、资源限制等。
其中一些参数你可能已经熟悉,而另一些可能是全新的。
让我们从 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
如果你仍然无法访问页面,可以检查以下几点:
docker ps | grep nginx-mapped
docker port nginx-mapped
docker run
中的 -v
参数允许我们挂载卷,从而在主机和容器之间共享数据。这对于持久化数据或向容器提供配置文件非常有用。
让我们首先在主机上创建一个简单的目录结构:
mkdir -p ~/project/nginx-data
echo "<html><body><h1>Hello from mounted volume</h1></body></html>" > ~/project/nginx-data/index.html
这些命令的作用如下:
project
文件夹中创建一个新目录 nginx-data
。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!"
如果你没有看到自定义内容,可以检查以下几点:
~/project/nginx-data/index.html
文件。docker ps | grep nginx-volume
docker logs nginx-volume
这种将主机目录挂载到容器的方法称为绑定挂载(bind mount)。这是在主机和容器之间共享文件的直接方法。以下是需要记住的几个关键点:
通过使用这种方法,我们避免了“不是目录”的错误,因为我们挂载的是目录,而不是单个文件。这种方法使你可以更灵活地添加、删除或修改文件,而无需重新创建容器。
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_" 的行。你应该会看到列出的两个环境变量。
如果你没有看到环境变量,请检查:
docker ps | grep nginx-env
验证。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
命令,探索了它的各种参数和选项。我们涵盖了以下内容:
docker run
的这些参数为配置和管理 Docker 容器提供了强大的工具。通过掌握这些选项,你可以创建更复杂和定制化的容器部署。你可以控制容器如何与主机系统交互、它们可以消耗哪些资源,以及它们在不同场景下的行为。