覆盖容器都默认设置
目录
- 覆盖网络端口
- 设置环境变量
- 限制容器资源使用
- 试一试
- 运行多个 Postgres 数据库实例
- 在受控网络中运行 Postgres 容器
- 管理资源
- 在 Docker Compose 中覆盖默认的 CMD 和 ENTRYPOINT
- 使用 docker run 覆盖默认的 CMD 和 ENTRYPOINT
- 额外资源
- 下一步
当 Docker 容器启动时,它会执行一个应用程序或命令。容器从镜像的配置中获取这个可执行文件(脚本或文件)。容器自带的默认设置通常运行良好,但如果需要,你可以更改这些设置。这些调整有助于让容器程序按你希望的方式运行。
例如,如果你有一个现有的数据库容器,它监听标准端口,而你想运行相同数据库容器的新实例,那么你可能需要更改新容器监听的端口设置,以避免与现有容器冲突。有时,如果程序需要更多资源来处理繁重的工作负载,你可能想增加容器可用的内存,或者设置环境变量以提供程序运行所需的特定配置信息。
docker run
命令提供了一种强大的方式来覆盖这些默认设置并根据你的喜好定制容器的行为。该命令提供了多个标志,可以让你在运行时自定义容器行为。
覆盖网络端口
有时你可能想为开发和测试目的使用不同的数据库实例。在同一端口上运行这些数据库实例可能会发生冲突。你可以使用 docker run
中的 -p
选项将容器端口映射到主机端口,从而允许你运行多个实例而不会发生冲突。
docker run -d -p 主机端口:容器端口 postgres
设置环境变量
这个选项在容器内部设置一个值为 bar
的环境变量 foo
。
docker run -e foo=bar postgres env
你会看到如下输出:
HOSTNAME=2042f2e6ebe4
foo=bar
提示
.env
文件是一种方便的方法,可以为你的 Docker 容器设置环境变量,而不会使命令行中充满多个 -e
标志。要使用 .env
文件,你可以在 docker run
命令中传递 --env-file
选项。
docker run --env-file .env postgres env
限制容器资源使用
你可以使用 docker run
命令的 --memory
和 --cpus
标志来限制容器的 CPU 和内存使用。例如,你可以为 Python API 容器设置内存限制,防止它在主机上消耗过多资源。以下是命令:
docker run -e POSTGRES_PASSWORD=secret --memory="512m" --cpus="0.5" postgres
此命令将容器的内存使用限制为 512 MB,并定义 0.5 核心的 CPU 配额。
监控实时资源使用情况
你可以使用 docker stats
命令监控运行容器的实时资源使用情况。这有助于你了解分配的资源是否足够或需要调整。
通过有效使用这些 docker run
标志,你可以根据具体需求调整容器化应用程序的行为。
试一试
在指南中,你将看到如何使用 docker run
命令覆盖容器默认设置。
下载并安装 Docker Desktop
运行多个 Postgres 数据库实例
使用以下命令启动一个 Postgres 镜像的容器:
docker run -d -e POSTGRES_PASSWORD=secret -p 5432:5432 postgres
这将在后台启动 Postgres
数据库,监听标准容器端口 5432
,并映射到主机的5432
端口。
启动映射到不同端口的第二个Postgres
容器。
docker run -d -e POSTGRES_PASSWORD=secret -p 5433:5432 postgres
这将在后台启动另一个 Postgres
容器,监听容器中的标准 postgres
端口 5432
,但映射到主机的 5433
端口。你覆盖了主机端口,以确保新容器不会与现有运行的容器冲突。
通过访问 Docker Dashboard 的容器视图验证两个容器是否都在运行。
在受控网络中运行 Postgres
容器
默认情况下,当你运行容器时,它们会自动连接到一个名为 bridge
的特殊网络。这个bridge
网络像虚拟桥一样运行,允许同一主机上的容器相互通信,同时将它们与外界和其他主机隔离。对于大多数容器交互来说,这是一个方便的起点。然而,对于特定场景,你可能需要对网络配置有更多控制。
这时,自定义网络就派上用场了。你可以通过在 docker run
命令中传递 --network
标志来创建自定义网络。所有没有指定 --network
标志的容器都连接到默认的 bridge 网络。
按照以下步骤,将 Postgres
容器连接到自定义网络。
通过以下命令创建一个新的自定义网络:
docker network create mynetwork
使用以下命令验证网络:
docker network ls
此命令会列出所有网络,包括新创建的 "mynetwork"
。
通过以下命令将 Postgres
连接到自定义网络:
docker run -d -e POSTGRES_PASSWORD=secret -p 5434:5432 --network mynetwork postgres
这将在后台启动Postgres
容器,映射到主机端口 5434
,并连接到 mynetwork
网络。你传递了 --network
参数,通过将容器连接到自定义 Docker 网络来覆盖容器默认设置,以便更好地隔离和与其他容器通信。你可以使用 docker network inspect
命令查看容器是否连接到这个新 bridge 网络。
默认 bridge 和自定义网络的关键区别
- DNS 解析:默认情况下,连接到默认 bridge 网络的容器可以通过 IP 地址互相通信(除非你使用
--link
选项,这被认为是遗留的)。由于各种技术缺陷,不建议在生产中使用。在自定义网络上,容器可以通过名称或别名解析彼此。 - 隔离:所有未指定
--network
的容器都连接到默认 bridge 网络,因此存在风险,因为不相关的容器可以互相通信。使用自定义网络提供了一个范围网络,只有连接到该网络的容器能够通信,从而提供更好的隔离。
管理资源
默认情况下,容器的资源使用没有限制。然而,在共享系统上,有效地管理资源至关重要。重要的是不要让运行的容器消耗主机机器过多的内存。
这就是 docker run
命令再次发挥作用的地方。它提供了 --memory
和 --cpus
等标志,用于限制容器可以使用的 CPU 和内存量。
docker run -d -e POSTGRES_PASSWORD=secret --memory="512m" --cpus=".5" postgres
--cpus
标志为容器指定了 CPU 配额。在这里,它设置为半个 CPU 核心(0.5),而 --memory
标志为容器指定了内存限制。在本例中,它设置为 512 MB。
在 Docker Compose
中覆盖默认的 CMD
和 ENTRYPOINT
有时,你可能需要覆盖 Docker
镜像中定义的默认命令(CMD
)或入口点(ENTRYPOINT
),特别是在使用 Docker Compose
时。
创建一个包含以下内容的 compose.yml
文件:
services:
postgres:
image: postgres
entrypoint: ["docker-entrypoint.sh", "postgres"]
command: ["-h", "localhost", "-p", "5432"]
environment:
POSTGRES_PASSWORD: secret
Compose
文件定义了一个名为 postgres
的服务,使用官方 Postgres
镜像,设置了入口点脚本,并以密码认证启动容器。
通过运行以下命令启动服务:
docker compose up -d
此命令启动 Docker Compose
文件中定义的 Postgres
服务。
通过 Docker Dashboard 验证认证。
打开 Docker Dashboard,选择 Postgres
容器并选择 Exec 进入容器 shell。你可以输入以下命令连接到Postgres
数据库:
psql -U postgres
注意
PostgreSQL 镜像本地设置了信任认证,因此当从本地(同一容器内部)连接时,你可能会注意到不需要密码。然而,如果从不同的主机/容器连接,则需要密码。
使用 docker run 覆盖默认的 CMD
和 ENTRYPOINT
你也可以直接使用 docker run 命令覆盖默认设置:
docker run -e POSTGRES_PASSWORD=secret postgres docker-entrypoint.sh -h localhost -p 5432
此命令运行一个 Postgres
容器,设置密码认证的环境变量,覆盖默认启动命令,并配置主机名和端口映射。