根据我对docker compose / fig的理解,如果您不希望将端口暴露给其他人,则在两个服务/图像之间创建链接是一个主要原因。
像这里 db 不公开任何端口,只链接:
web:
build: .
links:
- db
ports:
- "8000:8000"
db:
image: postgres
web 是否认为 db 在其localhost上运行?我是否可以从 web 中的脚本/程序连接到localhost:5432(来自postgresql的标准端口)以获取数据库连接?
如果这是正确的,如何在不暴露的情况下将端口5432更改为6432? 我会在不同的端口上运行postgresql吗?
更新
一些输入之后有用的链接:
答案 0 :(得分:9)
docker-compose
/ fig
主要是一次启动/管理多个图像的主力,这些图像在某种程度上相互依赖。
要完全理解容器之间的链接,您应该知道创建了一个主机条目,通常在/etc/hosts
文件中,它将docker托管网络中的容器主机名映射到特定的ip地址。因此,如果您想访问 postgres 数据库,则必须指向db
主机名而不是localhost
。
关于暴露的端口,大多数图像已经暴露了一些端口,因此可能只是使用图像并且该端口被暴露,您可以始终将其覆盖到其他位置。
Docker Compose 1.6.0 +中的更新
默认情况下,Compose会为您的应用设置单个网络。服务的每个容器都加入默认网络,并且该网络上的其他容器都可以访问它们,并且它们可以在与容器名称相同的主机名上发现。 source
只有在想要为容器定义别名时才能定义容器之间的链接,如下所示:
version: '2'
services:
web:
build: .
links:
- "db:database"
db:
image: postgres
答案 1 :(得分:3)
web 认为 db 在env变量DOCKER_DB指向的主机上运行,或类似的东西。您的服务应指向该变量(主机),而不是localhost。
db容器再次在变量中将端口(通过EXPOSE)暴露给其链接的容器。你可以在你想要的任何端口上运行db,只要它是EXPOSEd。