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

Ben*_*ari 5 port zeromq pyzmq docker docker-compose

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

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

我已经搜索过该expose port关键字,但找到了关键字,但没有成功。

如何公开泊坞窗口,使您的容器外部访问
参考


这是我的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"
Run Code Online (Sandbox Code Playgroud)

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

  • 但是当我使用server_IP:9001 --> 192.168.1.131:9001docker_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运行中,需要执行多种操作,例如9001port 上创建ZMQ

  • 我已经设置了允许的端口,之前使用 $ ufw allow 9001

  • 我在Ubuntu 16.04和Ubuntu-Server 16.04上尝试过

任何帮助,将不胜感激。

Ben*_*ari 1

问题已通过以下说明解决:

在 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()
Run Code Online (Sandbox Code Playgroud)

它的工作原理如下:

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

现在我将此行编辑如下:

socket.bind("tcp://*:9001")  # Works both locally and remotely.
Run Code Online (Sandbox Code Playgroud)

这是我的 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"
Run Code Online (Sandbox Code Playgroud)