允许 docker 容器连接到 local/host postgres 数据库
Allow docker container to connect to a local/host postgres database
我最近一直在玩 Docker 和 QGIS,并按照 this tutorial 中的说明安装了一个容器。
一切正常,但我无法连接到包含我所有 GIS 数据的本地主机 postgres 数据库。我认为这是因为我的 postgres 数据库未配置为接受远程连接,并且一直在编辑 postgres conf 文件以允许使用 this article.
中的说明进行远程连接
当我尝试连接到我的数据库 运行 Docker 中的 QGIS 时,我仍然收到错误消息:无法连接到服务器:Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
postgres 服务器是 运行,我编辑了我的 pg_hba.conf 文件以允许来自 IP 地址范围 (172.17.0.0/32) 的连接。我之前使用 docker ps
查询了 docker 容器的 IP 地址,虽然 IP 地址发生了变化,但到目前为止它一直在 172.17.0.x
范围内
知道为什么我无法连接到这个数据库吗?可能是我想象的很简单的东西!
我 运行 Ubuntu 14.04; Postgres 9.3
TL;DR
- 使用
172.17.0.0/16
作为 IP 地址范围,而不是 172.17.0.0/32
。
- 不要使用
localhost
连接到主机上的 PostgreSQL 数据库,而是使用主机的 IP。为了保持容器的可移植性,使用 --add-host=database:<host-ip>
标志启动容器并使用 database
作为连接到 PostgreSQL 的主机名。
- 确保 PostgreSQL 配置为侦听所有 IP 地址上的连接,而不仅仅是
localhost
。在 PostgreSQL 的配置文件中查找设置 listen_addresses
,通常在 /etc/postgresql/9.3/main/postgresql.conf
中找到(感谢@DazmoNorton)。
长版
172.17.0.0/32
不是 IP 地址的 范围 ,而是单个地址(namly 172.17.0.0
)。没有 Docker 容器会分配到该地址,因为它是 Docker 网桥 (docker0
) 接口的网络地址。
当Docker启动时,它会创建一个新的桥接网络接口,你可以在调用ip a
时轻松看到:
$ ip a
...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
如您所见,在我的例子中,docker0
接口的 IP 地址为 172.17.42.1
,网络掩码为 /16
(或 255.255.0.0
)。这意味着网络地址是 172.17.0.0/16
.
IP地址是随机分配的,无需额外配置,会一直在172.17.0.0/16
网络中。对于每个 Docker 个容器,将分配该范围内的随机地址。
这意味着,如果您想授予所有可能的容器访问您的数据库的权限,请使用 172.17.0.0/16
。
Docker Mac 解决方案
17.06 起
感谢@Birchlabs 的评论,现在使用此 special Mac-only DNS name available:
变得容易多了
docker run -e DB_PORT=5432 -e DB_HOST=docker.for.mac.host.internal
从 17.12.0-cd-mac46 开始,应该使用 docker.for.mac.host.internal
而不是 docker.for.mac.localhost
。有关详细信息,请参阅 release note。
旧版本
@helmbert 的回答很好地解释了这个问题。但是 Docker 对于 Mac does not expose the bridge network,所以我不得不使用这个技巧来解决这个限制:
$ sudo ifconfig lo0 alias 10.200.10.1/24
打开 /usr/local/var/postgres/pg_hba.conf
并添加此行:
host all all 10.200.10.1/24 trust
打开 /usr/local/var/postgres/postgresql.conf
并编辑更改 listen_addresses
:
listen_addresses = '*'
重新加载服务并启动您的容器:
$ PGDATA=/usr/local/var/postgres pg_ctl reload
$ docker run -e DB_PORT=5432 -e DB_HOST=10.200.10.1 my_app
此解决方法的作用与@helmbert 的回答基本相同,但使用附加到 lo0
而不是 docker0
网络接口的 IP 地址。
我的设置还需要添加
172.17.0.1 localhost
到/etc/hosts
这样 Docker 将指向 172.17.0.1
作为数据库主机名,而不依赖于不断变化的外部 ip 来查找数据库。希望这可以帮助其他人解决这个问题!
另一种解决方案是服务卷,您可以定义一个服务卷并在该卷中挂载主机的 PostgreSQL 数据目录。查看给定的撰写文件以了解详细信息。
version: '2'
services:
db:
image: postgres:9.6.1
volumes:
- "/var/lib/postgresql/data:/var/lib/postgresql/data"
ports:
- "5432:5432"
通过这样做,另一个 PostgreSQL 服务将 运行 在容器下,但使用主机 PostgreSQL 服务正在使用的相同数据目录。
简单的解决方案
最新版本的 docker (18.03) 提供了内置的端口转发解决方案。在您的 docker 容器内,只需将数据库主机设置为 host.docker.internal
。这将转发到 docker 容器位于 运行 上的主机。
在Ubuntu中:
首先您必须通过以下命令检查 Docker 数据库端口是否在您的系统中可用 -
sudo iptables -L -n
示例输出:
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:3306
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:22
这里3306
用作172.17.0.2 IP上的Docker数据库端口,如果这个端口不可用运行下面的命令-
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
现在,您可以通过以下配置从本地系统轻松访问 Docker 数据库
host: 172.17.0.2
adapter: mysql
database: DATABASE_NAME
port: 3307
username: DATABASE_USER
password: DATABASE_PASSWORD
encoding: utf8
在 CentOS 中:
首先你必须通过以下命令检查 Docker 数据库端口是否在你的防火墙中可用 -
sudo firewall-cmd --list-all
示例输出:
target: default
icmp-block-inversion: no
interfaces: eno79841677
sources:
services: dhcpv6-client ssh
**ports: 3307/tcp**
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
这里3307
作为172.17.0.2 IP上的Docker数据库端口,如果这个端口不可用运行下面的命令-
sudo firewall-cmd --zone=public --add-port=3307/tcp
在服务器中,您可以永久添加端口
sudo firewall-cmd --permanent --add-port=3307/tcp
sudo firewall-cmd --reload
现在,您可以通过上述配置从本地系统轻松访问 Docker 数据库。
简单的解决方案
只需将 --network=host
添加到 docker run
。就这样!
这样容器将使用主机的网络,因此 localhost
和 127.0.0.1
将指向主机(默认情况下它们指向一个容器)。示例:
docker run -d --network=host \
-e "DB_DBNAME=your_db" \
-e "DB_PORT=5432" \
-e "DB_USER=your_db_user" \
-e "DB_PASS=your_db_password" \
-e "DB_HOST=127.0.0.1" \
--name foobar foo/bar
对于 docker-compose 你可以尝试只添加
network_mode: "host"
示例:
version: '2'
services:
feedx:
build: web
ports:
- "127.0.0.1:8000:8000"
network_mode: "host"
要设置一些简单的东西,允许 Postgresql 连接 从 docker 容器到我的本地主机,我在 postgresql.conf:
listen_addresses = '*'
并添加了这个 pg_hba.conf:
host all all 172.17.0.0/16 password
然后重新启动。我的客户端 来自 docker 容器(位于 172.17.0.2)然后可以使用 host:password、数据库连接到我本地主机上的 Postgresql 运行,用户名和密码。
此处发布的解决方案对我不起作用。因此,我发布此答案是为了帮助面临类似问题的人。
注意:此解决方案也适用于 Windows 10,请查看下面的评论。
OS: Ubuntu 18
PostgreSQL:9.5(托管于 Ubuntu)
Docker:服务器应用程序(连接到 PostgreSQL)
我正在使用 docker-compose.yml 构建应用程序。
第 1 步: 请添加 host.docker.internal:<docker0 IP>
version: '3'
services:
bank-server:
...
depends_on:
....
restart: on-failure
ports:
- 9090:9090
extra_hosts:
- "host.docker.internal:172.17.0.1"
要查找 docker i.e. 172.17.0.1 (in my case)
的 IP,您可以使用:
$> ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
或
$> ip a
1: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
第 2 步: 在 postgresql.conf 中,将 listen_addresses 更改为 listen_addresses = '*'
第 3 步: 在 pg_hba.conf 中,添加此行
host all all 0.0.0.0/0 md5
第 4 步: 现在使用 sudo service postgresql restart
重启 postgresql 服务
第 5 步:请使用 host.docker.internal
主机名从服务器应用程序连接数据库。
例如:jdbc:postgresql://host.docker.internal:5432/bankDB
尽情享受!!
以防万一,以上解决方案对任何人都不起作用。使用以下语句从 docker 连接到主机 postgres(在 mac 上):
psql --host docker.for.mac.host.internal -U postgres
让我试着解释一下我做了什么。
PostgreSQL
首先,我进行了必要的配置以确保我的 Postgres 数据库正在接受来自外部的连接。
打开pg_hba.conf
并在末尾添加以下行:
host all all 0.0.0.0/0 md5
打开 postgresql.conf
并寻找 listen_addresses
并像这样修改那里:
listen_addresses = '*'
确保上面的行没有用 #
注释
-> 重启你的数据库
OBS:这不是生产环境的推荐配置
接下来,我寻找我的主人的ip
。我使用的是 localhosts ip 127.0.0.1
,但容器看不到它,因此当 运行 容器时,会出现有问题的连接被拒绝消息。在网上搜索了很久之后,我读到容器从你的本地网络中看到了内部 ip(你的路由器属性给连接到它的每个设备,我不是在谈论让你访问的 IP互联网)。也就是说,我打开了一个终端并执行了以下操作:
寻找本地网络ip
打开终端或 CMD
(MacOS/Linux)
$ ifconfig
(Windows)
$ ipconfig
此命令将显示您的网络配置信息。
看起来像这样:
en4:
ether d0:37:45:da:1b:6e
inet6 fe80::188d:ddbe:9796:8411%en4 prefixlen 64 secured scopeid 0x7
inet 192.168.0.103 netmask 0xffffff00 broadcast 192.168.0.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (100baseTX <full-duplex>)
status: active
寻找活跃的那个。
在我的例子中,我的本地网络 ip 是 192.168.0.103
完成后,我 运行 容器。
Docker
运行带有--add-host
参数的容器,像这样:
$ docker run --add-host=aNameForYourDataBaseHost:yourLocalNetWorkIp --name containerName -di -p HostsportToBind:containerPort imageNameOrId
就我而言,我做了:
$ docker run --add-host=db:192.168.0.103 --name myCon -di -p 8000:8000 myImage
我正在使用 Django
,因此 8000
端口是默认端口。
Django 应用程序
访问数据库的配置是:
在settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': ‘myDataBaseName',
'USER': ‘username',
'PASSWORD': '123456',
'HOST': '192.168.0.103',
'PORT': 5432,
}
}
参考资料
关于 -p
标志:
Connect using network port mapping
关于docker run
:
Docker run documentation
有趣的文章:
Docker Tip #35: Connect to a Database Running on Your Docker Host
您可以添加多个监听地址以提高安全性。
listen_addresses = 'localhost,172.17.0.1'
添加 listen_addresses = '*'
不是一个好的选择,这非常危险并且会将您的 postgresql 数据库暴露在狂野的西部。
您可以在 docker run
命令期间传递 --network=host
以访问容器内的 localhost
。
例如:
docker run --network=host docker-image-name:latest
如果您想通过本地主机传递环境变量,请使用 --env-file
参数来访问容器内的环境变量。
例如:
docker run --network=host --env-file .env-file-name docker-image-name:latest
注意:参数在docker图片名前传递,否则参数无效。 (我遇到过这个,所以请注意!)
我最近一直在玩 Docker 和 QGIS,并按照 this tutorial 中的说明安装了一个容器。
一切正常,但我无法连接到包含我所有 GIS 数据的本地主机 postgres 数据库。我认为这是因为我的 postgres 数据库未配置为接受远程连接,并且一直在编辑 postgres conf 文件以允许使用 this article.
中的说明进行远程连接当我尝试连接到我的数据库 运行 Docker 中的 QGIS 时,我仍然收到错误消息:无法连接到服务器:Connection refused Is the server running on host "localhost" (::1) and accepting TCP/IP connections to port 5433?
postgres 服务器是 运行,我编辑了我的 pg_hba.conf 文件以允许来自 IP 地址范围 (172.17.0.0/32) 的连接。我之前使用 docker ps
查询了 docker 容器的 IP 地址,虽然 IP 地址发生了变化,但到目前为止它一直在 172.17.0.x
知道为什么我无法连接到这个数据库吗?可能是我想象的很简单的东西!
我 运行 Ubuntu 14.04; Postgres 9.3
TL;DR
- 使用
172.17.0.0/16
作为 IP 地址范围,而不是172.17.0.0/32
。 - 不要使用
localhost
连接到主机上的 PostgreSQL 数据库,而是使用主机的 IP。为了保持容器的可移植性,使用--add-host=database:<host-ip>
标志启动容器并使用database
作为连接到 PostgreSQL 的主机名。 - 确保 PostgreSQL 配置为侦听所有 IP 地址上的连接,而不仅仅是
localhost
。在 PostgreSQL 的配置文件中查找设置listen_addresses
,通常在/etc/postgresql/9.3/main/postgresql.conf
中找到(感谢@DazmoNorton)。
长版
172.17.0.0/32
不是 IP 地址的 范围 ,而是单个地址(namly 172.17.0.0
)。没有 Docker 容器会分配到该地址,因为它是 Docker 网桥 (docker0
) 接口的网络地址。
当Docker启动时,它会创建一个新的桥接网络接口,你可以在调用ip a
时轻松看到:
$ ip a
...
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN
link/ether 56:84:7a:fe:97:99 brd ff:ff:ff:ff:ff:ff
inet 172.17.42.1/16 scope global docker0
valid_lft forever preferred_lft forever
如您所见,在我的例子中,docker0
接口的 IP 地址为 172.17.42.1
,网络掩码为 /16
(或 255.255.0.0
)。这意味着网络地址是 172.17.0.0/16
.
IP地址是随机分配的,无需额外配置,会一直在172.17.0.0/16
网络中。对于每个 Docker 个容器,将分配该范围内的随机地址。
这意味着,如果您想授予所有可能的容器访问您的数据库的权限,请使用 172.17.0.0/16
。
Docker Mac 解决方案
17.06 起
感谢@Birchlabs 的评论,现在使用此 special Mac-only DNS name available:
变得容易多了docker run -e DB_PORT=5432 -e DB_HOST=docker.for.mac.host.internal
从 17.12.0-cd-mac46 开始,应该使用 docker.for.mac.host.internal
而不是 docker.for.mac.localhost
。有关详细信息,请参阅 release note。
旧版本
@helmbert 的回答很好地解释了这个问题。但是 Docker 对于 Mac does not expose the bridge network,所以我不得不使用这个技巧来解决这个限制:
$ sudo ifconfig lo0 alias 10.200.10.1/24
打开 /usr/local/var/postgres/pg_hba.conf
并添加此行:
host all all 10.200.10.1/24 trust
打开 /usr/local/var/postgres/postgresql.conf
并编辑更改 listen_addresses
:
listen_addresses = '*'
重新加载服务并启动您的容器:
$ PGDATA=/usr/local/var/postgres pg_ctl reload
$ docker run -e DB_PORT=5432 -e DB_HOST=10.200.10.1 my_app
此解决方法的作用与@helmbert 的回答基本相同,但使用附加到 lo0
而不是 docker0
网络接口的 IP 地址。
我的设置还需要添加
172.17.0.1 localhost
到/etc/hosts
这样 Docker 将指向 172.17.0.1
作为数据库主机名,而不依赖于不断变化的外部 ip 来查找数据库。希望这可以帮助其他人解决这个问题!
另一种解决方案是服务卷,您可以定义一个服务卷并在该卷中挂载主机的 PostgreSQL 数据目录。查看给定的撰写文件以了解详细信息。
version: '2'
services:
db:
image: postgres:9.6.1
volumes:
- "/var/lib/postgresql/data:/var/lib/postgresql/data"
ports:
- "5432:5432"
通过这样做,另一个 PostgreSQL 服务将 运行 在容器下,但使用主机 PostgreSQL 服务正在使用的相同数据目录。
简单的解决方案
最新版本的 docker (18.03) 提供了内置的端口转发解决方案。在您的 docker 容器内,只需将数据库主机设置为 host.docker.internal
。这将转发到 docker 容器位于 运行 上的主机。
在Ubuntu中:
首先您必须通过以下命令检查 Docker 数据库端口是否在您的系统中可用 -
sudo iptables -L -n
示例输出:
Chain DOCKER (1 references)
target prot opt source destination
ACCEPT tcp -- 0.0.0.0/0 172.17.0.2 tcp dpt:3306
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:80
ACCEPT tcp -- 0.0.0.0/0 172.17.0.3 tcp dpt:22
这里3306
用作172.17.0.2 IP上的Docker数据库端口,如果这个端口不可用运行下面的命令-
sudo iptables -A INPUT -p tcp --dport 3306 -j ACCEPT
现在,您可以通过以下配置从本地系统轻松访问 Docker 数据库
host: 172.17.0.2
adapter: mysql
database: DATABASE_NAME
port: 3307
username: DATABASE_USER
password: DATABASE_PASSWORD
encoding: utf8
在 CentOS 中:
首先你必须通过以下命令检查 Docker 数据库端口是否在你的防火墙中可用 -
sudo firewall-cmd --list-all
示例输出:
target: default
icmp-block-inversion: no
interfaces: eno79841677
sources:
services: dhcpv6-client ssh
**ports: 3307/tcp**
protocols:
masquerade: no
forward-ports:
sourceports:
icmp-blocks:
rich rules:
这里3307
作为172.17.0.2 IP上的Docker数据库端口,如果这个端口不可用运行下面的命令-
sudo firewall-cmd --zone=public --add-port=3307/tcp
在服务器中,您可以永久添加端口
sudo firewall-cmd --permanent --add-port=3307/tcp
sudo firewall-cmd --reload
现在,您可以通过上述配置从本地系统轻松访问 Docker 数据库。
简单的解决方案
只需将 --network=host
添加到 docker run
。就这样!
这样容器将使用主机的网络,因此 localhost
和 127.0.0.1
将指向主机(默认情况下它们指向一个容器)。示例:
docker run -d --network=host \
-e "DB_DBNAME=your_db" \
-e "DB_PORT=5432" \
-e "DB_USER=your_db_user" \
-e "DB_PASS=your_db_password" \
-e "DB_HOST=127.0.0.1" \
--name foobar foo/bar
对于 docker-compose 你可以尝试只添加
network_mode: "host"
示例:
version: '2'
services:
feedx:
build: web
ports:
- "127.0.0.1:8000:8000"
network_mode: "host"
要设置一些简单的东西,允许 Postgresql 连接 从 docker 容器到我的本地主机,我在 postgresql.conf:
listen_addresses = '*'
并添加了这个 pg_hba.conf:
host all all 172.17.0.0/16 password
然后重新启动。我的客户端 来自 docker 容器(位于 172.17.0.2)然后可以使用 host:password、数据库连接到我本地主机上的 Postgresql 运行,用户名和密码。
此处发布的解决方案对我不起作用。因此,我发布此答案是为了帮助面临类似问题的人。
注意:此解决方案也适用于 Windows 10,请查看下面的评论。
OS: Ubuntu 18
PostgreSQL:9.5(托管于 Ubuntu)
Docker:服务器应用程序(连接到 PostgreSQL)
我正在使用 docker-compose.yml 构建应用程序。
第 1 步: 请添加 host.docker.internal:<docker0 IP>
version: '3'
services:
bank-server:
...
depends_on:
....
restart: on-failure
ports:
- 9090:9090
extra_hosts:
- "host.docker.internal:172.17.0.1"
要查找 docker i.e. 172.17.0.1 (in my case)
的 IP,您可以使用:
$> ifconfig docker0
docker0: flags=4099<UP,BROADCAST,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
或
$> ip a
1: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
第 2 步: 在 postgresql.conf 中,将 listen_addresses 更改为 listen_addresses = '*'
第 3 步: 在 pg_hba.conf 中,添加此行
host all all 0.0.0.0/0 md5
第 4 步: 现在使用 sudo service postgresql restart
第 5 步:请使用 host.docker.internal
主机名从服务器应用程序连接数据库。
例如:jdbc:postgresql://host.docker.internal:5432/bankDB
尽情享受!!
以防万一,以上解决方案对任何人都不起作用。使用以下语句从 docker 连接到主机 postgres(在 mac 上):
psql --host docker.for.mac.host.internal -U postgres
让我试着解释一下我做了什么。
PostgreSQL
首先,我进行了必要的配置以确保我的 Postgres 数据库正在接受来自外部的连接。
打开pg_hba.conf
并在末尾添加以下行:
host all all 0.0.0.0/0 md5
打开 postgresql.conf
并寻找 listen_addresses
并像这样修改那里:
listen_addresses = '*'
确保上面的行没有用 #
-> 重启你的数据库
OBS:这不是生产环境的推荐配置
接下来,我寻找我的主人的ip
。我使用的是 localhosts ip 127.0.0.1
,但容器看不到它,因此当 运行 容器时,会出现有问题的连接被拒绝消息。在网上搜索了很久之后,我读到容器从你的本地网络中看到了内部 ip(你的路由器属性给连接到它的每个设备,我不是在谈论让你访问的 IP互联网)。也就是说,我打开了一个终端并执行了以下操作:
寻找本地网络ip
打开终端或 CMD
(MacOS/Linux)
$ ifconfig
(Windows)
$ ipconfig
此命令将显示您的网络配置信息。 看起来像这样:
en4:
ether d0:37:45:da:1b:6e
inet6 fe80::188d:ddbe:9796:8411%en4 prefixlen 64 secured scopeid 0x7
inet 192.168.0.103 netmask 0xffffff00 broadcast 192.168.0.255
nd6 options=201<PERFORMNUD,DAD>
media: autoselect (100baseTX <full-duplex>)
status: active
寻找活跃的那个。
在我的例子中,我的本地网络 ip 是 192.168.0.103
完成后,我 运行 容器。
Docker
运行带有--add-host
参数的容器,像这样:
$ docker run --add-host=aNameForYourDataBaseHost:yourLocalNetWorkIp --name containerName -di -p HostsportToBind:containerPort imageNameOrId
就我而言,我做了:
$ docker run --add-host=db:192.168.0.103 --name myCon -di -p 8000:8000 myImage
我正在使用 Django
,因此 8000
端口是默认端口。
Django 应用程序
访问数据库的配置是:
在settings.py
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.postgresql',
'NAME': ‘myDataBaseName',
'USER': ‘username',
'PASSWORD': '123456',
'HOST': '192.168.0.103',
'PORT': 5432,
}
}
参考资料
关于 -p
标志:
Connect using network port mapping
关于docker run
:
Docker run documentation
有趣的文章: Docker Tip #35: Connect to a Database Running on Your Docker Host
您可以添加多个监听地址以提高安全性。
listen_addresses = 'localhost,172.17.0.1'
添加 listen_addresses = '*'
不是一个好的选择,这非常危险并且会将您的 postgresql 数据库暴露在狂野的西部。
您可以在 docker run
命令期间传递 --network=host
以访问容器内的 localhost
。
例如:
docker run --network=host docker-image-name:latest
如果您想通过本地主机传递环境变量,请使用 --env-file
参数来访问容器内的环境变量。
例如:
docker run --network=host --env-file .env-file-name docker-image-name:latest
注意:参数在docker图片名前传递,否则参数无效。 (我遇到过这个,所以请注意!)