簡體   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