I have a container that it has several ports, I want to have access to one of its ports (9001
) outside of this docker as remote.
- 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 that and I found expose port
keyword, and I did it but not worked.
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" # exposed disired port
ports:
- "9001:9001"
I run above docker-compose file with: $ docker-compose up -d
- But when I using
server_IP:9001 --> 192.168.1.131:9001
or
docker_IP:9001 --> 172.17.0.1:9001
can not access to that (in remote or local mode)
- But when using
container_IP:9001 --> 172.19.0.23:9001
this
works in local.
What should I do that I can access to 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.
If you want to actually map the port you should use
ivms:
build: .
container_name: ivms
command: bash bashes/createDB.sh
volumes:
- .:/code
ports:
- "8010:8010"
- "9001:9001" # now you can access them locally
warning you are using the same port for these two services ivms and nginx
The EXPOSE instruction informs Docker that the container listens on
the specified network ports at runtime. You can specify whether the
port listens on TCP or UDP, and the default is TCP if the protocol is
not specified.
The EXPOSE instruction does not actually publish the port. It
functions as a type of documentation between the person who builds the
image and the person who runs the container, about which ports are
intended to be published.
-Docker Docs
Problem resolved with below instruction:
In ZMQ app (in ivms
container) I had used from the server IP to binding a connection as follow:
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 was edit this line as the 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"