似乎无法将 docker 容器端口暴露给主机

Posted

技术标签:

【中文标题】似乎无法将 docker 容器端口暴露给主机【英文标题】:Can't seem to expose docker container port to host 【发布时间】:2017-10-12 18:14:32 【问题描述】:

我可能遗漏了一些荒谬的东西,但是我尝试向主机 (Mac) 公开的每个 docker 容器似乎都不起作用。我可以看出容器正在运行,并且似乎已正确暴露于我选择的端口。我错过了一些明显的东西吗?任何帮助将不胜感激。

我拉下了最新的 ElasticSearch 图片:https://www.elastic.co/guide/en/elasticsearch/reference/current/docker.html

运行 Docker: docker run -d -p 9200:9200 docker.elastic.co/elasticsearch/elasticsearch:5.4.0

请求查看正在运行的图像: 码头工人ps

查看运行图片: 5e8ae3b13f7c docker.elastic.co/elasticsearch/elasticsearch:5.4.0 "/bin/bash bin/es-..." 4 秒前 Up 4 seconds 0.0.0.0:9200->9200/tcp, 9300/tcp eloquent_almeida

运行 lsof 以查看端口 9200 上是否有任何内容 lsof -i tcp:9200

没有返回

Mac 操作系统:10.12.4

Docker 更新版本:

docker version
Client:
 Version:      17.04.0-ce
 API version:  1.27 (downgraded from 1.28)
 Go version:   go1.7.5
 Git commit:   4845c56
 Built:        Wed Apr  5 23:33:17 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Mon Mar 27 16:58:30 2017
 OS/Arch:      linux/amd64
 Experimental: false

已下载 nmap 并针对 9200 localhost 运行。还要确保 9200 现在在 /etc/pf.conf 中打开。

Nmap scan report for localhost (127.0.0.1)
Host is up (0.00016s latency).
Other addresses for localhost (not scanned): ::1
PORT     STATE  SERVICE
9200/tcp closed wap-wsp

还尝试在 mac 的 IP 上使用 docker-machine:

docker-machine ip default
192.168.99.100

Tried 192.168.99.100:9200 and still no luck

【问题讨论】:

netstat -atp tcp | grep 9200 显示什么? 嗨@BorLaze,当我运行该命令时,什么也没有出现,就像 lsof 检查一样(也尝试了 localhost:9200、127.0.0.1:9200,如果该端口上没有任何内容,它当然不会返回)。感谢您的回复。 你在使用 docker-for-mac 吗?还是旧的 docker 机器? 嗨@Robert 我相信我正在使用 docker-for-mac (docker.com/products/docker-toolbox) 我的版本的输出:客户端:版本:1.13.1 API 版本:1.26 Go 版本:go1.7.5 Git 提交:092cba3 构建:2017 年 2 月 8 日星期三 08:47:51 OS/Arch:darwin /amd64 服务器:版本:1.13.1 API 版本:1.26(最低版本 1.12) Go 版本:go1.7.5 Git 提交:092cba3 内置:2017 年 2 月 8 日星期三 08:47:51 OS/Arch:linux/amd64 实验性:false 【参考方案1】:

您知道,下载的图像或 docker 安装似乎有问题。我重复了你的步骤 - 一切都好:

[06:40 PM] borlaze@mac: /tmp $ docker run -d -p 9200:9200 docker.elastic.co/elasticsearch/elasticsearch:5.4.0

[06:41 PM] borlaze@mac: /tmp $ docker ps
CONTAINER ID        IMAGE                                                 COMMAND                  CREATED             STATUS              PORTS                              NAMES
fd05a1fe9b5a        docker.elastic.co/elasticsearch/elasticsearch:5.4.0   "/bin/bash bin/es-..."   9 seconds ago       Up 7 seconds        0.0.0.0:9200->9200/tcp, 9300/tcp   practical_bell

[06:41 PM] borlaze@mac: /tmp $ lsof -i tcp:9200
COMMAND     PID    USER   FD   TYPE             DEVICE SIZE/OFF NODE NAME
com.docke 32108 borlaze   21u  IPv4 0x601aa3189a6fc3e3      0t0  TCP *:wap-wsp (LISTEN)
com.docke 32108 borlaze   22u  IPv6 0x601aa318a167e6cb      0t0  TCP localhost:wap-wsp (LISTEN)

在 OS 10.12.4 上检查,docker

[06:45 PM] borlaze@mac: /tmp $ docker version
Client:
 Version:      17.03.1-ce
 API version:  1.27
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Tue Mar 28 00:40:02 2017
 OS/Arch:      darwin/amd64

Server:
 Version:      17.03.1-ce
 API version:  1.27 (minimum version 1.12)
 Go version:   go1.7.5
 Git commit:   c6d412e
 Built:        Fri Mar 24 00:00:50 2017
 OS/Arch:      linux/amd64
 Experimental: true

尝试删除图像并重复。

【讨论】:

嗨@BorLaze,这是我的输出 客户端:版本:1.13.1 API 版本:1.26 Go 版本:go1.7.5 Git 提交:092cba3 构建:2017 年 2 月 8 日星期三 08:47:51 OS/Arch:darwin/amd64 服务器:版本:1.13.1 API 版本:1.26(最低版本 1.12) Go 版本:go1.7.5 Git 提交:092cba3 内置:2017 年 2 月 8 日星期三 08:47:51 OS/Arch:linux/amd64 实验:false @scarpacci,至少我们有不同的版本。来自https://hub.docker.com/_/elasticsearch/ 的信息:“支持的 Docker 版本:最新版本(尽最大努力降至 1.6)”。我只有一个想法——你的 docker 版本对于这个弹性图像来说太旧了。尝试将 docker 更新到最新版本。 谢谢@BorLaze 我会尝试这样做,看看是否有帮助。再次感谢您的帮助。 我不明白。我刚刚更新并再次尝试,结果相同。我不明白。我想知道我是否有防火墙问题或其他问题。

以上是关于似乎无法将 docker 容器端口暴露给主机的主要内容,如果未能解决你的问题,请参考以下文章

Gitlab CI runner 无法暴露嵌套 Docker 容器的端口

如何在没有端口映射的情况下将 docker 容器的 ip 和端口暴露给外部 docker 主机?

无法通过容器的 ip 和通过 http 暴露的端口访问 Docker 容器中的 Web 应用程序

Docker 和 netstat:netstat 不显示端口,由 docker 容器暴露

使用docker搭建Swagger

为docker容器暴露端口