Search code examples
pythondockerdocker-composezeromqpyzmq

How to expose a ZMQ container port outside of docker/container using docker-compose?


I have a container with several ports. I want remote access to the port 9001 outside of the container.

  • My docker IP is: 172.17.0.1
  • My container IP is: 172.19.0.23
  • My server IP is: 192.168.1.131

I have searched about this issue and I found the expose and ports attributes for ports forwarding but it did not work.

How to expose docker ports to make your containers externally accessible
Reference


This is my docker-compose file:

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"

Here's the code snippet inside the ivms container:

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

I run the above docker-compose via docker-compose up -d

  • But when I use the server_IP:9001 which is 192.168.1.131:9001 or docker_IP:9001 which is 172.17.0.1:9001 can not access either the remote or local mode.
  • But when using container_IP:9001 which is 172.19.0.23:9001 this works in local.

What should I do so that I can have access the server_IP:9001 --> 192.168.1.131:9001?


[NOTE]:

  • In createDB.sh runs several operations such as creating a ZMQ on 9001 port.

  • I have been set the port allowing before, using $ ufw allow 9001

  • I tried on Ubuntu 16.04 and Ubuntu-Server 16.04


Any help would be appreciated.


Solution

  • The problem has been resolved with the below instruction:

    In the ZMQ app (in ivms container) I had used the server's IP to bind the IP and port to establish the connection:

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

    It was working only as below:

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

    Now I edited this line as follows:

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

    And this is my docker-compose.yml configuration:

    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"