了解docker撰写中的端口和链接

时间:2015-04-10 14:40:40

标签: docker fig docker-compose

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

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

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

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

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

更新

一些输入之后

有用的链接:

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

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

2 个答案:

答案 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。