使用 docker-compose 将多个 docker 容器链接到一个别名为 localhost 的容器

Linking multiple docker containers to one container with alias localhost using docker-compose

我正在尝试 link 一个内存缓存服务器和一个 mongo 服务器到我的网络服务器,但是我的代码使用 localhost 作为它们的主机名。所以我想 link 他们作为本地主机。

我正在做这个-

webserver:
  build: ./webserver
ports:
  - "127.0.0.1:80:80"
volumes:
  - /var/www/html:/var/www/html
links:
  - memcachedserver:localhost
  - mongoserver:localhost

但进入网络服务器后

docker exec -it acb51XXXX081 bash

cat /etc/hosts

我明白了-

127.0.0.1       localhost
::1     localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.2      adocker_memcachedserver_1 4a11d0cb3126
172.17.0.2      localhost 4a11d0cb3126 adocker_memcachedserver_1
172.17.0.2      memcachedserver_1 4a11d0cb3126 adocker_memcachedserver_1
172.17.0.3      adocker_mongoserver_1 a505d8de4736
172.17.0.3      mongoserver_1 a505d8de4736 adocker_mongoserver_1

只有内存缓存服务器正在获取别名 localhost,mongo 服务器没有。

在我手动将 localhost 添加到 mongo 的条目后,它开始运行良好。

172.17.0.3      localhost adocker_mongoserver_1 a505d8de4736

但我想在 docker-compose.yml 文件中自动执行此操作

有什么想法吗?

您不能为两个不同的主机指定相同的名称。你真的应该改变你的代码——硬编码 localhost 作为不同服务的主机名是个坏主意。 (最好为每个服务设置不同的主机名。如果它们实际上 运行 在同一台主机上,您可以为这些主机名设置别名以指向它。)

如果您真的无法更改您的代码,您可以设置从实际localhost到托管服务的容器的隧道。

正如其他答案已经指出的,您不能两次使用相同的别名。您可能会做的是在其他服务中使用 net:webserver(在 v2 中这将是 network_mode:webserver)。

这样所有容器将共享同一个网络堆栈,并且 localhost 可以工作。