我有一个带有多个端口的容器。我想要远程访问容器外部的端口
9001
。
172.17.0.1
172.19.0.23
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
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 文档
在 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.
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"