繁体   English   中英

使用 docker-compose 链接到网络中的容器

[英]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 builddocker-compose up ,您将看到web容器在 5432 部分 ping db容器并收到响应。

docker-compose启动一个桥接网络并将所有容器添加到该网络中,以便它们可以相互通信。 每个容器的主机名与它们在 docker-compose 文件中的服务名称相同。 主机名由内部 DNS 服务解析。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM