我希望我的Web Docker容器能够从Web容器中访问127.0.0.1:6379上的Redis。我已将Docker Compose文件设置如下。我得到了ECONNREFUSED
:
version: "3"
services:
web:
build: .
ports:
- 8080:8080
command: ["test"]
links:
- redis:127.0.0.1
redis:
image: redis:alpine
ports:
- 6379
有什么想法吗?
答案 0 :(得分:0)
对此的简短回答是“不要”。 Docker容器每个都有自己的loopback接口127.0.0.1,它与主机环回和其他容器分开。你无法重新定义127.0.0.1,如果可以,那几乎肯定会破坏其他东西。
有一种技术上可行的方法,可以通过直接在主机上运行所有容器来实现:
network_mode: "host"
但是,这会删除容器所需的docker网络隔离。
您还可以将一个容器附加到另一个容器的网络(因此它们具有相同的环回接口):
docker run --net container:$container_id ...
但是我不确定在docker-compose
中是否存在这样做的语法,并且它在群集模式下不可用,因为容器可能在不同的节点上运行。我对此语法的主要用途是附加网络调试工具,如nicolaka/netshoot。
您应该做的是将redis数据库的位置作为webapp容器的配置参数。将位置作为环境变量,配置文件或命令行参数传递。如果Web应用程序无法直接支持此功能,请使用在启动Web应用程序之前运行的入口点脚本更新配置。这会将您的撰写yml文件更改为:
version: "3"
services:
web:
# you should include an image name
image: your_webapp_image_name
build: .
ports:
- 8080:8080
command: ["test"]
environment:
- REDIS_URL=redis:6379
# no need to link, it's deprecated, use dns and the network docker creates
#links:
# - redis:127.0.0.1
redis:
image: redis:alpine
# no need to publish the port if you don't need external access
#ports:
# - 6379