



















在Docker Compose中,默认情况下,服务之间会在一个自定义的网络中通信。因此,容器会通过这个网络进行互相通信,而无法直接访问宿主机的 IP 地址。
这便是为何当服务尝试连接宿主机上的数据库服务器地址(兹以PostgreSQL这一数据库服务以及192.168.1.1:5432这一服务器位址为例)时,会出现连接超时的问题。
为了解决这个问题,可以有几种方案来让Docker容器中的应用访问宿主机上的数据库,而无需使用Docker自己创建的网络。
host.docker.internal在Docker for Linux中,可以使用host.docker.internal来指向宿主机的IP地址。这是Docker提供的一个内置DNS名称,允许容器访问宿主机的网络资源。可以将数据库的HOST设置为host.docker.internal,这样容器内部会自动解析到宿主机的IP。
修改 settings.py 或 .env 文件中的数据库配置,将 HOST 设置为 host.docker.internal:
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': 'database', # 改成自己的
'USER': 'database', # 改成自己的
'PASSWORD': 'your_password', # 改成自己的
'HOST': 'host.docker.internal', # 使用 host.docker.internal 而不是 192.168.1.1
'PORT': '5432',
}
}
运行docker compose命令,尝试把容器架起来;容器会自动解析这个特殊的DNS名称,并连接到宿主机的PostgreSQL服务。
network_mode: "host"如果不想让Docker为容器创建单独的网络,可以使用network_mode: "host"配置项。这会让容器直接使用宿主机的网络堆栈,而不是通过Docker创建的网络。这意味着容器可以直接访问宿主机的网络接口。
修改 docker-compose.yml 文件,在 web 服务中添加 network_mode: "host":
services:
web:
(从略)
network_mode: "host" # 添加这个选项
(从略)
ports:
- "(所期望的容器外端口):8000"
重新运行docker compose up,此时Docker容器将直接使用宿主机的网络,因此它可以直接访问192.168.1.1:5432上的PostgreSQL。
如果仍然想使用Docker自定义网络,但让容器能够访问宿主机的网络,可以使用extra_hosts来为容器提供宿主机 IP 的映射。
在docker-compose.yml中,使用extra_hosts指定宿主机的IP:
services:
web:
(从略)
ports:
- "(所期望的容器外端口):8000"
extra_hosts:
- "host.docker.internal:192.168.1.1" # 手动映射宿主机的 IP
运行docker-compose,这会将host.docker.internal映射到宿主机IP地址。
host.docker.internal是最简便的方法,这个DNS名会自动解析到宿主机的IP地址。network_mode: "host",让容器与宿主机共享网络堆栈。extra_hosts来手动指定宿主机 IP。根据需求选择合适的方案,修改配置后应该可以解决Docker容器无法连接宿主机上数据库服务的问题。
Also on / Aussi sur / También en / Cē̤-sē̤ iâ ô / 亦可見於 / こちらも:
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。