Docker-compose:如何将主机名用于 docker 实例,在内部和外部均有效?
Docker-compose: how to use a hostname for a docker instance valid both from inside and outside?
我有这样一种情况,我们使用 docker-compose 来 运行 一个在开发过程中填充了测试数据的数据库。后端程序员(我)运行 只是数据库。前端程序员 运行s 数据库 + 具有不同配置文件的后端。
在第一个场景中,后端需要在本地主机端口 1433 上找到数据库。在第二个场景中,后端需要在我分配给 docker 容器的主机名上找到数据库,这与本地主机。这意味着无法共享配置,我现在已经通过使用不同的配置文件解决了这个问题。
不幸的是,我现在需要将主机名放入数据库中(用于动态查找),但我无法这样做。
有没有办法让 Windows 上的本地管理员在 Docker 桌面下使用 docker-compose 来获得在这两种情况下都能正常工作的主机名?
问题的根源在于,如果没有额外的主机配置,就不可能使容器名称对主机可见。因此,它要么编辑 hosts
文件以获取额外记录(或者甚至调出您自己的 DNS,运行ning in Docker),要么使用 localhost
.
可以通过使用 network_mode
参数(在 swarm 中忽略)使一个容器使用另一个容器的网络堆栈。这应该使两个容器都能够通过 localhost
相互通信,并且开发人员也可以从主机使用 localhost
。
不幸的是,此方法有一些限制:
- 服务必须用不同的
docker-compose
文件分隔,否则会出现错误:
ERROR: Service 'client' uses the network stack of container 'some_unique_container_name' which does not exist.
- 您要使用的网络堆栈容器(在本例中为数据库)必须存在。
- 您需要 运行 两个命令来启动堆栈。
- 不适用于群。如果您在生产中需要它,Kubernetes pods 中的容器默认启用此行为。
这是一个例子:
# server.yml
version: "3"
services:
server:
image: nginx
container_name: some_unique_container_name
---
# client.yml
version: "3"
services:
client:
image: curlimages/curl
network_mode: container:some_unique_container_name
command: curl localhost
要提出来,先运行docker-compose -f server.yml up -d
,然后docker-compose -f client.yml up
。
我有这样一种情况,我们使用 docker-compose 来 运行 一个在开发过程中填充了测试数据的数据库。后端程序员(我)运行 只是数据库。前端程序员 运行s 数据库 + 具有不同配置文件的后端。
在第一个场景中,后端需要在本地主机端口 1433 上找到数据库。在第二个场景中,后端需要在我分配给 docker 容器的主机名上找到数据库,这与本地主机。这意味着无法共享配置,我现在已经通过使用不同的配置文件解决了这个问题。
不幸的是,我现在需要将主机名放入数据库中(用于动态查找),但我无法这样做。
有没有办法让 Windows 上的本地管理员在 Docker 桌面下使用 docker-compose 来获得在这两种情况下都能正常工作的主机名?
问题的根源在于,如果没有额外的主机配置,就不可能使容器名称对主机可见。因此,它要么编辑 hosts
文件以获取额外记录(或者甚至调出您自己的 DNS,运行ning in Docker),要么使用 localhost
.
可以通过使用 network_mode
参数(在 swarm 中忽略)使一个容器使用另一个容器的网络堆栈。这应该使两个容器都能够通过 localhost
相互通信,并且开发人员也可以从主机使用 localhost
。
不幸的是,此方法有一些限制:
- 服务必须用不同的
docker-compose
文件分隔,否则会出现错误:
ERROR: Service 'client' uses the network stack of container 'some_unique_container_name' which does not exist.
- 您要使用的网络堆栈容器(在本例中为数据库)必须存在。
- 您需要 运行 两个命令来启动堆栈。
- 不适用于群。如果您在生产中需要它,Kubernetes pods 中的容器默认启用此行为。
这是一个例子:
# server.yml
version: "3"
services:
server:
image: nginx
container_name: some_unique_container_name
---
# client.yml
version: "3"
services:
client:
image: curlimages/curl
network_mode: container:some_unique_container_name
command: curl localhost
要提出来,先运行docker-compose -f server.yml up -d
,然后docker-compose -f client.yml up
。