无法在 Docker-Compose 内部 forward/map 移植

Unable to forward/map port internaly in Docker-Compose

我目前有一个包含 3 个不同数据库的应用程序(用于测试)。我有以下 docker 图片:

Docker 文件

FROM golang:1.15

WORKDIR /myapp

# Download wait for it tool. 
ADD https://raw.githubusercontent.com/vishnubob/wait-for-it/master/wait-for-it.sh /wait-for-it
RUN chmod +x /wait-for-it

及以下docker-compose.yml

version: '3.7'

services:
  app:
    build:
      context: .
      dockerfile: Dockerfile.dev
    volumes:
      - .:/app
    command: sh -c "/wait-for-it postgres:10001 -- /wait-for-it oracle:10000 -- /wait-for-it mongodb:10002"
    depends_on:
      - oracle
      - mongodb
      - postgres
    ports:
      - "8080:8080"
  oracle:
    image: chameleon82/oracle-xe-10g:latest
    ports:
      - "10000:8080"
    expose:
      - 10000
  postgres:
    image: postgres:9.6-alpine
    ports:
      - "10001:5432"
    environment:
      - POSTGRES_HOST_AUTH_METHOD=trust
      - POSTGRES_DB=testdb
    expose:
      - 10001
  mongodb:
    image: mongo:latest
    ports:
      - "10002:27017"
    expose:
      - 10002

如您所见,我的应用程序在 8080 上侦听,但 Oracle 也是如此。我知道我可以更改我的应用程序端口,但我仍然想将 Oracle 切换到另一个端口。我试图通过端口映射实现它,但我确实觉得它只适用于主机,不适用于 docker-compose,我错了吗?

将 Docker Compose 网络(即 apporacle)中的服务视为不同的主机。每个都可以通过其服务名称寻址,即 app 应该通过该名称 (oracle) 引用 oracle 服务。

端口映射允许您将 Docker Compose 网络中的服务端口公开(和映射)到(可能不同的)主机端口。这通常是因为主机具有端口 spaces (0...65535) 的单一维度,而 Docker Compose 网络中的 each 服务具有端口 space。 2 个服务(例如 http1http2)可以各自使用端口,例如8080 但主机上只有一个 8080,因此,要在您的主机上公开这些服务中的每一个,就必须让步;一个也可以在主机的 8080 上,但另一个需要在其他地方,也许 8081.

在你的情况下,例如oracle 运行 在 Docker Compose 网络中的 8080 上,并暴露在主机的端口 10000 上。就 app 服务而言,此服务在 Docker Compose 网络中以 oracle:80808080 而不是 10000)的形式提供。

expose 语法纯粹是记录性的,没有任何功能作用。

正在回复评论

如果我 运行 你的 Compose 脚本 as-is,它不起作用。这是预期的,因为例如postgres 在 Compose 网络中的 5432 上可用,但在 10001

上可用
docker-compose logs app
Attaching to 63690852_app_1
app_1       | wait-for-it: waiting 15 seconds for postgres:10001
app_1       | wait-for-it: timeout occurred after waiting 15 seconds for postgres:10001
app_1       | wait-for-it: waiting 15 seconds for oracle:10000
app_1       | wait-for-it: timeout occurred after waiting 15 seconds for oracle:10000
app_1       | wait-for-it: waiting 15 seconds for mongodb:10002
app_1       | wait-for-it: timeout occurred after waiting 15 seconds for mongodb:10002

如果我更正端口:

command: sh -c "/wait-for-it postgres:5432 -- /wait-for-it oracle:8080 -- /wait-for-it mongodb:27017"

它按预期工作:

docker-compose logs app
Attaching to 63690852_app_1
app_1       | wait-for-it: waiting 15 seconds for postgres:5432
app_1       | wait-for-it: postgres:5432 is available after 0 seconds
app_1       | wait-for-it: waiting 15 seconds for oracle:8080
app_1       | wait-for-it: oracle:8080 is available after 8 seconds
app_1       | wait-for-it: waiting 15 seconds for mongodb:27017
app_1       | wait-for-it: mongodb:27017 is available after 0 seconds