无法在 Docker-Compose 中内部转发/映射端口

Emixam23

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

文件

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 网络中的服务端口暴露(和映射)到(可能不同的)主机端口。这通常是因为,主机具有单一维度的端口空间 (0...65535),而Docker Compose 网络中的每个服务都有一个端口空间。2 个服务(例如http1http2)可能每个都使用端口,例如,80808080主机上只有一个,因此,要在您的主机上公开这些服务中的每一个,必须让步;一个也可以在主机上,8080但另一个可能需要在其他地方8081

在您的情况下,例如在 Docker Compose 网络中oracle运行并8080在主机的端口上公开10000app服务而言,该服务在 Docker Compose 网络中作为oracle:8080808010000可用

expose语法是纯粹的纪录片并没有功能的影响。

回复评论

如果我按原样运行您的 Compose 脚本,则它不起作用。这是意料之中的,因为例如在 Compose 网络中postgres可用,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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章