如何使用docker-compose在docker / container外部公开容器端口?

时间:2018-07-10 08:04:17

标签: docker docker-compose port zeromq pyzmq

我有一个容器,它具有多个端口,我想以远程方式访问此Docker外部的端口之一(9001)。

  • 我的docker IP为:172.17.0.1
  • 我的容器IP是:172.19.0.23
  • 我的服务器IP为:192.168.1.131

我已经搜索过该关键字,但发现了expose port关键字,但确实没有用。

  

如何公开docker端口以使您的容器可外部访问
  Reference


这是我的docker-compose文件:

version: '3'

services:
  nginx:
      image: nginx:latest
      container_name: nginx
      ports:
        - "8010:8010"

      volumes:
        - .:/code
        - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

      links:
        - ivms

      restart: unless-stopped

  ivms:
      build: .
      container_name: ivms
      command: bash bashes/createDB.sh
      volumes:
        - .:/code
      expose:
        - "8010"
        - "9001"  # exposed disired port
      ports:
        - "9001:9001"

我在docker-compose文件上方运行:$ docker-compose up -d

  • 但是当我使用 server_IP:9001 --> 192.168.1.131:9001 docker_IP:9001 --> 172.17.0.1:9001 无法访问(在远程或本地模式下)
  • 但是使用 container_IP:9001 --> 172.19.0.23:9001 时, 在本地工作。

我应该怎么做才能访问 server_IP:9001 --> 192.168.1.131:9001


[注意]:

  • createDB.sh中运行多项操作,例如在以下位置创建 ZMQ 9001端口

  • 我已经使用$ ufw allow 9001

  • 设置了允许的端口
  • 我尝试了Ubuntu 16.04和Ubuntu-Server 16.04

任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

如果要实际映射端口,则应使用

ivms:
  build: .
  container_name: ivms
  command: bash bashes/createDB.sh
  volumes:
    - .:/code
  ports:
    - "8010:8010"
    - "9001:9001"  # now you can access them locally

警告您为这两个服务ivms和nginx使用相同的端口

  

EXPOSE指令通知Docker容器正在侦听   运行时指定的网络端口。您可以指定是否   端口侦听TCP或UDP,如果协议为,则默认为TCP   未指定。

     

EXPOSE指令实际上并未发布端口。它   充当构建者之间的一种文档类型   图片和运行容器的人,关于哪些端口是   打算出版。   -Docker文档

答案 1 :(得分:0)

问题通过以下说明解决:

在ZMQ应用(在ivms容器中)中,我曾使用服务器IP来绑定连接,如下所示:

import zmq

if __name__ == '__main__':
    context = zmq.Context()
    socket = context.socket(zmq.SUB)
    socket.setsockopt(zmq.SUBSCRIBE, "")
    socket.bind("tcp://192.168.1.131:9001")  # doesn't work with server or docker IP

    while True:
        data = socket.recv_json()

它只能按以下方式工作:

socket.bind("tcp://192.168.1.131:9001")  # works, but can't access as remote

现在我按如下方式编辑此行:

socket.bind("tcp://*:9001")  # Works both locally and remotely.

这是我的docker-compose.yml配置:

version: '3'

services:
  nginx:
      image: nginx:latest
      container_name: nginx
      ports:
        - "8010:8010"

      volumes:
        - .:/code
        - ./nginx/default.conf:/etc/nginx/conf.d/default.conf

      links:
        - ivms

      restart: unless-stopped

  ivms:
      build: .
      container_name: ivms
      command: bash bashes/createDB.sh
      volumes:
        - .:/code
      expose:
        - "8010"
      ports:
        - "9001:9001"