在docker中撰写如何创建到localhost的别名/链接?

gal*_*ben 8 docker docker-compose

在我的docker-compose文件中,需要多个容器来知道特定容器的主机名,包括此特定容器.

链接不起作用,因为容器无法链接到自身.

基本上,我正在寻找的是一种在docker-compose中对localhost进行别名的方法.

Kin*_*ang 18

你应该避免使用链接.相反,同一个Docker网络上的服务可以通过使用服务名称作为DNS名称来找到彼此.使用它来引用您描述的特定容器,包括它引用自身的时间.

例如,在下面组成的Docker Compose文件中,如果someservice是在端口80上anotherservice服务的Web服务器,则服务将能够连接到它http://someservice/,因为它们位于公共网络上the_net.

version: '3'

services:
  someservice:
    image: someserviceimage
    networks:
      - the_net

  anotherservice:
    image: anotherserviceimage
    networks:
      - the_net

networks:
  the_net:
Run Code Online (Sandbox Code Playgroud)

someservice也可以达到自己http://someservice/.

  • 谢谢,但是如果我想要别名怎么办?链接不就是别名吗?例如,anotherservice 需要访问someservice,但我不想使用名称 another service,而是使用名称“specialservice”。这不是链接的用途吗?另外,为什么不使用链接?他们有什么问题? (5认同)
  • 为什么要避免使用链接? (2认同)
  • 别名可以定义为服务网络声明的一部分。有关更多详细信息,请参阅 [Compose 文件参考中的别名](https://docs.docker.com/compose/compose-file/#aliases)。 (2认同)

gal*_*ben 17

extra_hosts 帮我解决了这个问题。

extra_hosts:
    - "hostname:127.0.0.1"
Run Code Online (Sandbox Code Playgroud)

来自 docker-compose 文档:

extra_hosts 添加主机名映射。使用与 docker 客户端 --add-host 参数相同的值。

extra_hosts: - "somehost:162.242.195.82" - "otherhost:50.31.209.229" 一个包含 IP 地址和主机名的条目将在容器内的 /etc/hosts 中为此服务创建,例如:

162.242.195.82 某个主机 50.31.209.229 其他主机

  • 当 IP 地址是动态的(例如另一个容器的 IP)时,这不是一个解决方案。 (7认同)

pen*_*han 15

我认为正确的答案来自

别名可以定义为服务网络声明的一部分。有关更多详细信息,请参阅Compose 文件参考中的别名。– King Chung Huang 2017 年 4 月 24 日 15:18

这是文档中的示例

version: '2'

services:
  web:
    build: ./web
    networks:
      - new

worker:
  build: ./worker
  networks:
    - legacy

db:
  image: mysql
  networks:
    new:
      aliases:
        - database
    legacy:
      aliases:
        - mysql

networks:
  new:
  legacy:
Run Code Online (Sandbox Code Playgroud)

您可以访问db此 docker-compose 中的 ,也可以用于mysql连接此db

  • 值得注意的是:如果您只需要一个额外的别名,则不必指定新网络。您可以在示例中指定 `default` 作为网络,而不是例如 `new`。 (3认同)
  • `localhost` 似乎不能作为别名使用,因为它总是解析为 127.0.0.1 (2认同)

rzl*_*vmp 9

external_links是本线程中未提及的一个更有用的参数:

external_links:
  - redis_1
  - project_db_1:mysql
  - project_db_2:postgresql
  - {CONTAINER}:{ALIAS}
Run Code Online (Sandbox Code Playgroud)

它接近extra_hosts

extra_hosts:
  - "somehost:127.0.0.1"
  - "otherhost:127.0.0.2"
  - {HOSTNAME}:{IP}
Run Code Online (Sandbox Code Playgroud)

但允许设置动态容器IP

此外,还可以在网络级别添加别名。这是如何向网络添加别名的两个答案 [ 1 , 2 ],但我想添加额外的信息:

如果您没有在 docker 文件中设置网络,您可以使用将default别名添加到默认网络:

services:
  db:
    networks:
      default:
        aliases:
          - database
          - postgres
Run Code Online (Sandbox Code Playgroud)

感谢这个答案