9

根据我对 docker compose / fig 的理解,如果您不想将端口暴露给其他人,那么在两个服务/图像之间创建链接是主要原因之一。

像这里db不公开任何端口,只链接:

web:
  build: .
  links:
   - db
  ports:
   - "8000:8000"   
db:
  image: postgres

web是否认为db在其本地主机上运行?我会从网络中的脚本/程序连接到 localhost:5432(来自 postgresql 的标准端口)以获取数据库连接吗?

如果这是正确的,您如何将端口 5432 更改为 6432 而不暴露?我会在不同的端口上运行 postgresql 吗?

更新:

一些输入后有用的链接:

http://docs.docker.com/userguide/dockerlinks/

https://docs.docker.com/compose/yml/#links

4

2 回答 2

10

docker-compose/fig主要是用于一次启动/管理多个图像的主力,这些图像以某种方式相互依赖。

要完全理解容器之间的链接,您应该知道创建了一个主机条目,通常在/etc/hosts文件内部,它将 docker 管理网络中的容器主机名映射到特定的 IP 地址。所以如果你想访问postgres db,你必须指向db主机名而不是localhost.

关于暴露的端口,大多数图像已经暴露了一些端口,因此可能是您只使用一个图像并且该端口已暴露,您始终可以将其覆盖为其他内容。

Docker Compose 1.6.0+ 中的更新

默认情况下,Compose 会为您的应用程序设置一个网络。服务的每个容器都加入默认网络,并且可以被该网络上的其他容器访问,并且可以通过与容器名称相同的主机名被它们发现。 资源

仅当您想为容器定义别名时,才可以定义容器之间的链接,如下所示:

version: '2'
services:
  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres
于 2015-04-10T22:12:07.960 回答
3

web认为db在环境变量 DOCKER_DB 或类似的东西指向的主机上运行。您的服务应该指向该变量(主机),而不是本地主机。

db 容器将端口(通过 EXPOSE)暴露给其链接的容器,同样在变量中。你可以在任何你想要的端口上运行 db,只要它是 EXPOSEd 的。

于 2015-04-10T15:33:17.733 回答