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

问题描述 投票:0回答:2

我有一个带有多个端口的容器。我想要远程访问容器外部的端口

9001

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

我搜索过这个问题,发现了用于端口转发的

expose
ports
属性,但它不起作用。

如何公开 docker 端口以使容器可从外部访问
参考


这是我的

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"
      ports:
        - "9001:9001"

这是

ivms
容器内的代码片段:

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()

我通过

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
    中运行多个操作,例如在 9001
    端口
    .

  • 我之前已经设置过允许的端口,使用

    $ ufw allow 9001

    
    

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


如有任何帮助,我们将不胜感激。

python docker docker-compose zeromq pyzmq
2个回答
4
投票
如果您想实际映射您应该使用的端口

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 文档


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

在 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"
    
© www.soinside.com 2019 - 2024. All rights reserved.