Docker-compose端口范围转发

7
文档在这里确实缺乏详细说明。
ports:
  - "20000-20100"

该方法适用于单个端口(但是“20000”并不奏效,似乎会绑定到某个在40k以上的随机端口),但我找不到一种可靠的方法来转发一个端口范围而不仅仅是一个。

- "20000-20100"
- "10000-10100:20000-20100"
- "20000-20100:20000-20100"

这些都不起作用。

我在Dockerfile中也暴露了20000-30000,但我认为这实际上并不重要。我是在错怪自己吗?这似乎是一个很容易的问题,但我已经花费数小时时间无法使连接正常工作。

编辑:

使用“20000-20010”公开这些端口:

0.0.0.0:43809->20000/tcp,0.0.0.0:43808->20001/tcp,0.0.0.0:43807->20002/tcp,0.0.0.0:43806->20003/tcp,0.0.0.0:43805->20004/tcp,0.0.0.0:43804->20005/tcp,0.0.0.0:43803->20006/tcp,0.0.0.0:43802->20007/tcp,0.0.0.0:43801->20008/tcp,0.0.0.0:43800->20009/tcp,0.0.0.0:43799->20010/tcp

使用“20000-20010:20000-20010”公开这些端口:

0.0.0.0:20000-20010->20000-20010/tcp

看起来是正确的,但我无法实际与它们建立任何连接。

编辑2:Docker-compose

version: '3.2'
services:
  sshd:
    build: .
    ports:
      - "23:22"
      - "20000-20010:20000-20010"
    environment:
      REDIS_ADDRESS: redis
      DEBUG: 'sshd:*,ioredis:*'
  web:
    image: controller_web
    ports:
      - target: 3000
        published: 3000
        protocol: tcp
        mode: host
    environment:
      REDIS_ADDRESS: redis
      DEBUG: 'sshd:*,ioredis:*'
  redis:
    image: "redis"

Dockerfile

FROM node:alpine

# add openssh and clean
RUN apk add --update openssh \
&& rm  -rf /tmp/* /var/cache/apk/*

RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app

ARG NODE_ENV
ENV NODE_ENV $NODE_ENV
COPY package.json /usr/src/app/

RUN apk add --no-cache --virtual .gyp \
    python \
    make \
    g++

RUN npm install && npm cache clean --force
COPY . /usr/src/app

#make sure we get fresh keys
RUN rm -rf /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_dsa_key

EXPOSE 22
EXPOSE 20000-30000
ENTRYPOINT ["sh", "entrypoint.sh"]
CMD ["npm", "start"]

你能否发布这个服务的compose文件和Dockerfile?我刚刚测试了一下,一切都按预期工作。另外,看起来文档没问题 - https://docs.docker.com/compose/compose-file/#ports,在你的情况下只是不起作用 :) - johnharris85
请具体说明“不起作用”的情况,您是如何测试的?您的应用程序是否在容器内监听所有这些端口,并绑定到0.0.0.0? - BMitch
已添加 Dockerfile 和 compose 文件。它们还包括一些 sshd 相关的内容,这是我用来测试这些端口的。 - Excludos
1个回答

10
我认同 docker-compose 端口文档 并未提供关于端口范围映射语法的足够信息。如需了解该语法,请查看 docker run 端口文档
特别地,
- "20000-20100" means: Expose the container ports in the range 20000 to 20100 into random ports on the host machine
- "10000-10100:20000-20100" means: Expose the container ports in the range 20000 to 20100 into random ports on the host machine in the range of 10000 to 10100
- "20000-20100:20000-20100" similar to the above

在您的情况下,所有这些都应该允许您访问容器化的应用程序


谢谢,这真的很好知道,虽然我已经自己基本解决了这个问题。但我仍然困惑为什么它可以使用单个端口而不是范围。 - Excludos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接