![](/img/trans.png)
[英]Docker-compose migrating from links to networking MongoDB database issue
[英]Links to container in networking with docker-compose
我的目标是使用 docker-compose 通过 URL 从另一个容器访问一个容器。
所以,假设我有以下docker-compose.yml
文件
version: "3.8"
services:
web:
build: web
ports:
- "8000:8000"
depends_on:
- db
db:
image: postgres
ports:
- "8001:5432"
以及文件夹web
的 Dockerfile Dockerfile
FROM alpine:3.7
RUN ping postgres://db:5432
运行docker-compose build
返回
db uses an image, skipping
Building web
Step 1/2 : FROM alpine:3.7
---> 6d1ef012b567
Step 2/2 : RUN ping postgres://db:5432
---> Running in afbfcd27b340
ping: bad address 'postgres://db:5432'
Service 'web' failed to build : The command '/bin/sh -c ping postgres://db:5432' returned a non-zero code: 1
docker compose 中的网络文档( https://docs.docker.com/compose/networking/#links )指出:
每个容器现在都可以查找主机名 web 或 db 并取回相应容器的 IP 地址。 例如,web 的应用程序代码可以连接到 URL postgres://db:5432 并开始使用 Postgres 数据库。
连接到从服务数据库获得的容器的正确 URL 是什么?
在web
映像构建期间,您的db
容器不存在,因此此处使用 RUN 是错误的。
一种选择是在 Dockerfile 中包含 CMD 命令,这将指示web
容器在每次启动容器时运行ping
命令。
此外,我还调整了传递给ping
命令的参数。
因此, web
Dockerfile 将是:
FROM alpine:3.7
CMD ["ping", "db:5432"]
现在,在docker-compose build
和docker-compose up
,您将看到web
容器在 5432 部分 ping db
容器并收到响应。
docker-compose
启动一个桥接网络并将所有容器添加到该网络中,以便它们可以相互通信。 每个容器的主机名与它们在 docker-compose 文件中的服务名称相同。 主机名由内部 DNS 服务解析。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.