Docker 容器中的 Wildfly 未启动

Posted

技术标签:

【中文标题】Docker 容器中的 Wildfly 未启动【英文标题】:Wildfly in Docker container not starting 【发布时间】:2020-04-04 01:44:39 【问题描述】:

我正在尝试访问在 Windows 10 Pro 中的 Docker 容器上运行的 Wildfly 的欢迎页面。这就是我所做的:

拉取图片:

docker pull jboss/wildfly

运行 Wildfly 容器(这工作正常,在 Wildfly 日志中我可以看到它正确启动):

docker run -it -p 8080:8080 jboss/wildfly

查找容器 ID:

docker ps

检查IP地址:

docker inspect -f " .NetworkSettings.IPAddress " cac63ed21d78

IP 地址是172.17.0.2,在浏览器中我转到http://172.17.0.2:8080/,但浏览器挂起并超时。我错过了什么?

更新

我也尝试了127.0.0.1:8080,但它也不起作用

更新2

控制台日志:

docker --version

#Docker version 19.03.1, build 74b1e89e8a

docker run hello-world

#Hello from Docker!

docker run --detach --publish 8080:80 --name webserver nginx

#Unable to find image 'nginx:latest' locally
#latest: Pulling from library/nginx
#8ec398bc0356: Pull complete
#465560073b6f: Pull complete
#f473f9fd0a8c: Pull complete
#Digest:  sha256:b2d89d0a210398b4d1120b3e3a7672c16a4ba09c2c4a0395f18b9f7999b768f2
#Status: Downloaded newer image for nginx:latest
#c5cdb6de11240b5fe33bc424779721e1b44948797fd6ff389004d0766b71dd17

docker ps

#CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c5cdb6de1124 
#nginx "nginx -g 'daemon of" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp webserver

【问题讨论】:

查看答案***.com/a/43762751/7873775 并尝试 10.0.75.1:8080 和 10.0.75.2:8080。 抱歉,这不起作用。我在同一台 Windows 10 机器上运行了 docker 和浏览器。10.0.75.x 不是外部地址,浏览器会尝试在网络上找到它吗? 好的,让我们试着找出问题所在。请发布以下 CLI 命令的结果:1.docker --version,2.docker run hello-world,3.docker run --detach --publish 8080:80 --name webserver nginx,4.然后尝试打开localhost:8080 请查看使用控制台日志更新的问题。我试过localhost:8080,它超时了。 docker ps 显示CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES c5cdb6de1124 nginx "nginx -g 'daemon of" 10 minutes ago Up 10 minutes 0.0.0.0:8080->80/tcp webserver @Evgeniy Khyst 我发现this article 谈到了 docker 网络。它说运行在容器内的服务器必须监听所有接口(文章的最后部分),这适用吗? 【参考方案1】:

默认情况下,当您创建一个容器时,它不会向外界发布任何端口。网络 172.17.X.X 是内部网络。如果您需要将 IP 地址绑定到主机 ip,请使用 -p 标志运行 docker 容器,如下所示:

-p 8080:8080

将容器中的TCP 8080端口映射到Docker主机上的8080端口

【讨论】:

如果端口不对外发布,为什么this example可以工作? @你会错误地编辑回复吗,如果你看看这个问题,这正是我在做的。 @ps0604 听起来像是网络问题。在您的情况下检查防火墙规则 我的回答是正确的,因为它基于文档推荐。 Ivan,你的回答和我在问题中描述的设置有什么区别?【参考方案2】:

关键信息是Docker container in Windows 10 Pro - 这是非常通用的规范,说明您的 Docker 在 Windows 上的工作方式。可以有很多选择,例如Docker for Windows 带/不带 Linux containers, Docker toolbox, 远程实例, ....

通常,Windows 上的 Docker 容器在某种虚拟机(Hyper-V、Virtualbox...)中运行。因此有额外的网络层,可能无法直接从您的 Windows 网络命名空间访问。但是linked example 在 Linux 机器上运行,这个额外的网络层不存在。这就是复制/粘贴 Linux 示例在 Windows 上不起作用的原因。所以像往常一样运行容器并暴露端口 8080:

docker run -it -p 8080:8080 jboss/wildfly

但是用于访问的 IP 会有所不同,并且无法使用容器 IP,因为很可能无法从 Windows 访问该内部 docker 网络。而是尝试使用您的 Windows 操作系统的 IP。最终检查使用的Docker on Windows 解决方案的文档,并找出哪个 IP 用于暴露的端口。

如果你有高级的 windows/linux 网络技能,那么你可能会以某种方式从容器网络命名空间路由/转发端口,通过中间 VM 网络层到 Windows 网络层。但它可能相当复杂。

【讨论】:

一月,我安装了Docker Desktop for Windows,下载了镜像并按照上面教程中的说明运行了 Wildfly 容器。在控制台中,我看到它开始正常,8080:8080 理论上应该可以工作,但事实并非如此。我不知道网络,我应该从哪里开始? @ps0604 如果你想盲从Linux教程,那就用Linux吧。正如我提到的 doc 是你的朋友 - docs.docker.com/docker-for-windows/networking 明确提到了 There is no docker0 bridge on Windows: Because of the way networking is implemented in Docker Desktop for Windows, you cannot see a docker0 interface on the host. This interface is actually within the virtual machine.。请处理这个限制。【参考方案3】:

发件人:https://docs.docker.com/docker-for-windows/networking/

端口转发适用于本地主机; --publish、-p 或 -P 都有效。从 Linux 暴露的端口被转发到主机。

所以应该可以从http://localhost:8080访问


如果这不起作用,请尝试 windows 示例

docker run -d -p 80:80 --name webserver nginx

应该可以访问http://localhost:80

https://docs.docker.com/docker-for-windows/index#explore-the-application-and-run-examples


如果失败尝试:

docker-machine ip default

并使用http://[docker-machine-ip]:80

【讨论】:

你能试试我上面贴的例子,看看是 jboss/wildfly 有问题还是你的 windows 网络有问题? 如果 nginx 不起作用,那么您可以运行 'docker-machine ip default' 并尝试使用那里的 IP 而不是 localhost【参考方案4】:

我有一个在 Windows 系统上工作的同事遇到了同样的问题。他为此付出了很多努力,却一事无成。似乎 Docker Desktop for windows 发生了很多奇怪的事情。我们终于为 windows 安装了 linux 子系统并在那里安装了 docker,从那时起它对他来说就像一个魅力。如果您想坚持使用 Windows 并且不介意使用 linux 子系统,我建议您走这条路。我们比 Jan Garaj 的建议走得更远,只是发现这是浪费时间。 Docker Desktop for Windows 旨在成为一个环境,您可以在其中完全工作 - 使用开发容器等。Host-Container 的东西对它来说很痛苦。

【讨论】:

是的,我同意,我将在 Ubuntu 而不是 Windows 中创建容器,那里没有问题。唯一的问题是我是在windows下开发的,所以我要测试3次,一次是在windows中开发,然后是在linux容器中,最后是在我将容器上传到云端的时候。如果我可以在 Windows 中运行容器,那么我只会测试两次。 这就是我建议使用 linux 子系统的原因。你实际上不必更改上下文 3 次,也许 2-2.5 次;)

以上是关于Docker 容器中的 Wildfly 未启动的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Dockerfile 在启动 docker 容器上运行 jboss-cli

docker 运行启动容器,但 localhost 未加载(Windows 10)

docker 容器中未指定应用程序加密密钥

Docker - 容器未运行

reboot 后 Docker服务及容器自动启动设置

Spring Boot 应用程序和 MongoDB 在不同的 Docker 容器上。应用程序未启动