Docker组成端口映射

时间:2016-02-16 10:22:10

标签: docker docker-compose

我有一个docker-compose yml文件,如下所示

version: '2'
services:
  nodejs:
    build:
      context: .
      dockerfile: DockerFile
    ports:
      - "4000:4000"
    links:
      - redis
    expose:
      - "6379"
  redis:
    build:
      context: .
      dockerfile: Dockerfile-redis

我的目标是将nodejs-127.0.0.1端口6379转发到redis主机。我已经可以从nodejs机器ping redis,但是没有映射端口。试过暴露选项,但也没有机会。

4 个答案:

答案 0 :(得分:48)

如果要从nodejs容器绑定到redis端口,则必须在redis容器中公开该端口:

version: '2'
services:
  nodejs:
    build:
      context: .
      dockerfile: DockerFile
    ports:
      - "4000:4000"
    links:
      - redis

  redis:
    build:
      context: .
      dockerfile: Dockerfile-redis
    expose:
      - "6379"

expose标记将允许您公开端口而不将它们发布到主机,但它们将暴露给容器网络。

https://docs.docker.com/compose/compose-file/#expose

ports标记将主机端口映射到容器端口 HOST:CONTAINER

https://docs.docker.com/compose/compose-file/#ports

答案 1 :(得分:24)

重要的是要指出所有上述解决方案都将端口映射到计算机上的每个接口。如果您拥有公共IP地址,或者您的计算机在大型网络上具有IP,则这不太理想。您的申请可能会暴露给比您希望的更广泛的受众。

redis:
  build:
    context:
    dockerfile: Dockerfile-redis
    ports:
    - "127.0.0.1:3901:3901"

127.0.0.1是映射到计算机上主机名localhost的IP地址。因此,现在您的应用程序仅通过该界面公开,并且由于127.0.0.1只能通过您的计算机访问,因此您不会将容器暴露给整个世界。

文档进一步解释了这一点,可在此处找到:https://docs.docker.com/compose/compose-file/#ports

答案 2 :(得分:2)

似乎其他答案都误解了您的问题。如果我理解正确,您希望向localhost:6379(redis的默认设置)发出请求,并将其自动转发到redis容器上的同一端口。

https://unix.stackexchange.com/a/101906/38639帮助我找到了正确的答案。

首先,您需要在映像上安装nc命令。在CentOS上,此软件包称为nmap-ncat,因此在下面的示例中,如果您使用其他操作系统作为基本映像,只需将其替换为适当的软件包。

接下来,您需要在每次容器启动时告诉它运行某个命令。您可以使用CMD执行此操作。

# Add this to your Dockerfile
RUN yum install -y --setopt=skip_missing_names_on_install=False nmap-ncat
COPY cmd.sh /usr/local/bin/cmd.sh
RUN chmod +x /usr/local/bin/cmd.sh
CMD ["/usr/local/bin/cmd.sh"]

最后,我们需要在cmd.sh中设置端口转发。我发现nc,即使具有-l-k选项,也会在请求完成后偶尔终止,因此我使用while循环来确保其始终运行。

# cmd.sh
#! /usr/bin/env bash

while nc -l -p 6379 -k -c "nc redis 6379" || true; do true; done &

tail -f /dev/null # Or any other command that never exits

答案 3 :(得分:1)

如果要从主机(127.0.0.1)访问redis,则必须使用ports命令。

redis:
  build:
    context: .
    dockerfile: Dockerfile-redis
    ports:
    - "6379:6379"
相关问题