【发布时间】:2019-05-23 01:19:48
【问题描述】:
如何在 Docker 容器内的端口上运行一个简单的服务器侦听?
(如果重要的话,这是一台 MacOS X 10.13.6 主机。)
当我运行一个简单的 HTTP 服务器时:
python3 -m http.server 8001
进程正确启动,并在该端口上正确侦听(通过telnet localhost 8001 确认)。
当我运行 Docker 容器时,它也可以正确运行进程,但现在连接被拒绝。
web-api/Dockerfile:
FROM python:3.7
CMD python3 -m http.server 8001
docker-compose.yaml:
version: '3'
services:
web-api:
hostname: web-api
build:
context: ./web-api/
dockerfile: Dockerfile
expose:
- "8001"
ports:
- "8001:8001"
networks:
- api_network
networks:
api_network:
driver: bridge
当我启动容器时,它正在运行 HTTP 服务器:
$ docker-compose up --detach --build
Building web-api
[…]
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1db4cd1daaa4 ipsum_web-api "/bin/sh -c 'python3…" 8 minutes ago Up 8 minutes 0.0.0.0:8001->8001/tcp ipsum_web-api_1
$ docker-machine ssh lorem
docker@lorem:~$ ps -ef | grep http.server
root 12883 12829 0 04:40 ? 00:00:00 python3 -m http.server 8001
docker@lorem:~$ telnet localhost 8001
[connects successfully]
^D
docker@lorem:~$ exit
$ telnet localhost 8001
Trying ::1...
telnet: connect to address ::1: Connection refused
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host
这里的配置不正确,使得服务器在内部 Docker 容器中工作;但是当从容器的暴露端口外部连接时,端口 8001 上的连接被拒绝?
【问题讨论】:
-
您正在 docker 机器内运行容器。所以获取机器的IP并尝试使用该IP。
docker-machine ls列出和docker-machine ip <<name>>。我相信这就是为什么当你在机器内时它与 localhost 一起工作,而当你在退出后尝试时被拒绝。
标签: docker networking docker-compose