【发布时间】:2017-08-04 21:49:32
【问题描述】:
我正在编写两个容器,一个用于 Web 服务,一个用于数据库。
这是我的撰写文件:
version: '3.3'
services:
web:
image: microsoft/aspnetcore:1.1
container_name: web
ports:
- 5555:80
links:
- db
db:
image: microsoft/mssql-server-linux:rc1
container_name: db
ports:
- 1533:1433
environment:
- "ACCEPT_EULA=Y"
- "MSSQL_SA_PASSWORD=MyAdminPwd2017"
- "MSSQL_PID=Developer"
因此,从我在 web 服务中运行的 asp.net 核心应用程序中,我可以使用 db 作为主机名访问位于 db 的数据库。但是db 在主机上是不可见的(我有一个默认的桥接网络)。如果我检查正在运行的数据库容器并找到它的 IP 地址,我可以从主机访问我的数据库,然后我可以连接到<ip>,1533。
问题是,web 容器和主机都使用存储用于访问数据库的凭据的文件。所以我需要一种方法来命名db,这样我就可以从两个世界访问(在群体内部和外部,从我的主机)
有没有办法做到这一点?我尝试在我的 docker-compose 文件中定义一个主机网络,并让两个服务都使用该网络,但我收到一条消息,说只能定义一个主机网络。
编辑:尝试改进问题标题,但我仍然不相信,欢迎改进
【问题讨论】:
-
从您的主机上,您可以使用“localhost:
”访问数据库。您可以在主机中创建一个别名,从“localhost: ”到“db”。这对你有帮助吗?通过拥有主机网络,您不会获得容器网络隔离的好处。 -
谢谢,在我的主机 (Windows) 中创建别名是指在
C:\Windows\System32\drivers\etc\hosts中创建一个条目,对吗?我真的不想那样做。如果我不关心容器网络隔离并且我希望容器和我的主机都在同一个网络中怎么办?我能做到吗? -
在 Docker 内部,dns 解析发生在 Docker 引擎中用于容器,并使用外部 dns 服务器处理未解析的名称。主机不知道 Docker 引擎的 DNS 数据库。在您的情况下,您希望容器和主机具有用于 db 的相同 DNS 数据库。最简单的方法是托管别名,这对您似乎不可用。我能想到的一种方法是使用像 consul 这样的外部 dns 服务器,并将服务从容器发布到外部服务器,并让容器和主机都使用该 dns 服务器。
-
谢谢 IP 地址呢?当我启动 Windows 容器时,它们每个都有一个 IP 地址,我可以从另一个容器连接到主机本身。我可以使用 Linux(常规)容器实现这一目标吗?
-
桥接网络中的容器ip地址可以从主机访问。对于覆盖网络,无法从主机访问容器 IP 地址。对于 Linux 和 Windows 容器,此行为相同。
标签: docker asp.net-core docker-compose docker-for-windows