了解 docker compose 中的端口和链接

Understanding ports and links in docker compose

根据我对 docker compose / fig 的理解,如果您不想向其他人公开端口,那么在两个 services/images 之间创建一个 link 是一个主要原因。

喜欢这里 db 不公开任何端口,仅 linked:

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

web 认为 db 运行s 在其本地主机上吗?我会从 web 中的 script/program 连接到 localhost:5432 (来自 postgresql 的标准端口)以获得数据库连接吗?

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

更新:

一些输入后 links 有用:

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

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

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

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

docker-compose / fig 主要是 starting/managing 多个图像的主力,这些图像在某种程度上相互依赖。

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

关于暴露的端口,大部分镜像已经暴露了一些端口,所以可能你只是使用一个图像并且那个端口是暴露的,你可以随时覆盖它。

更新 Docker Compose 1.6.0+

By default Compose sets up a single network for your app. Each container for a service joins the default network and is both reachable by other containers on that network, and discoverable by them at a hostname identical to the container name. source

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

version: '2'
services:
  web:
    build: .
    links:
      - "db:database"
  db:
    image: postgres