通过VM在本地主机上运行docker容器

我是Docker和Containers的新手,我试图在一个容器中运行一个简单的asp.net web应用程序,但遇到问题。 我的操作系统是Windows 10 Home,所以我必须使用Docker Toolbox,它运行在只包含基本Linux操作系统的虚拟机上。 当我旋转容器,似乎开始很好,但我不能在本地主机上查看应用程序。

$ docker run -p 8342:5000 -it jwarren:project

主机环境:生产内容根path:/ app现在正在监听:http:// *:5000应用程序已启动。 按下Ctrl + Cclosures。

$ docker ps -a容器ID图像命令创build状态端口名称98cc4aed7586 jwarren:项目“dotnet运行”8分钟前上传8分钟0.0.0.0:8342->5000/tcp naughty_brattain

我尝试了几个不同的build议,我发现在networking上,但没有任何帮助到目前为止。 但是,我的networking知识是非常有限的,所以也许我不完全理解需要做什么。 我试着用默认的VM机器IP和容器IP访问它。 我知道端口转发不会传递给容器。 任何援助都会很棒,因为这个项目将在周二到期,这是整理之前的最后一个路障。

我发现下面的post真的很有用: 如何从主机(同一networking)[Windows]连接到docker容器 。 按照下面的步骤完美地工作:

  1. 打开Oracle VM VirtualBox Manager
  2. selectDocker使用的虚拟机
  3. 点击设置 – >networking适配器1应该(默认?)被“附加到:NAT”
  4. 单击高级 – >端口转发添加规则:协议TCP,主机端口8080,来宾端口8080(保留主机IP和来宾IP空)

你现在应该可以通过localhost:8080和your-internal-ip:8080浏览你的容器。

启动容器(Dockerfile EXPOSES 5000):docker run -p 8080:5000 -it jwarren:project

能够连接http:// localhost:8080

使用虚拟机networking时,有几件事情需要考虑。

Virtual Box有三种types的networking选项NAT,桥接和主机。

  • NAT将允许您的虚拟机通过您的互联网访问互联网。 但是不允许你的主机访问虚拟机
  • 主机唯一networking将创build一个虚拟机可以到达主机的networking,并且主机可以访问虚拟机。 没有互联网使用这个networking
  • 桥接networking将允许您的虚拟机从您的WiFi路由器或主networking分配另一个IP。 这个IP将允许虚拟机有networking访问以及访问networking上的其他机器。 这将允许主机甚至到达IP

现在,在大多数情况下,当你想在一个虚拟机内部运行Docker并且使用主机访问该虚拟机时,你希望虚拟机只有NAT和Host两个桥接器

现在在端口8342访问您的应用程序需要检查一些东西

  • seliunx,firewalld,ufw在您的虚拟机上禁用(或正确configuration为允许端口)
  • 您的虚拟机具有仅主机networking或桥接networking
  • iptables -S不应该显示拒绝规则

一些VM预先configuration为只允许来自外部networking的端口22。 所以你应该尝试访问<hostonlyip>:8342<bridgedip>:8342上的应用程序。

如果你想testing应用程序是否启动,可以执行以下操作

 docker inspect <containerid> | grep IPA 

从这里获取IP并运行命令

 curl http://<containerip>:5000/ 

这个命令需要在虚拟机内而不是在你的机器上执行。 如果这个命令不起作用,那么你的容器不会在5000上进行监听。有时app只听容器内的127.0.0.1 。 这意味着他们只能在容器内工作,而不能在外面工作。 容器内的应用程序需要听取0.0.0.0

如果没有任何工作,你可以尝试一个SSH隧道方法

 ssh -L 8342:127.0.0.1:8342 user@<VMIP> 

然后你应该能够访问localhost:8342上的应用程序