我的Docker容器在Windows的Docker环境中(使用Hyper-V原生)无法在本地主机(0.0.0.0)启动。

9
我正在按照Digital Ocean的教程学习如何启动一个nginx docker容器(目前在第4步)。目前这是他们的输出:
$ docker run --name docker-nginx -p 80:80 -d nginx
d3ccb73a91985651ec61231bca9f9c716f0dec807e354a29eeef2144f883a01c

$ docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                         NAMES
b91f3ce26553        nginx               "nginx -g 'daemon off"   About a minute ago   Up About a minute   0.0.0.0:80->80/tcp, 443/tcp   docker-nginx

但是当我运行它时,这是我的输出(注意容器的不同IP):
C:\>docker run --name docker-nginx -p 80:80 -d nginx
d3ccb73a91985651ec61231bca9f9c716f0dec807e354a29eeef2144f883a01c

C:\>docker ps
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                           NAMES
d3ccb73a9198        nginx               "nginx -g 'daemon off"   14 hours ago        Up 2 seconds        10.0.75.2:80->80/tcp, 443/tcp   docker-nginx

为什么会发生这种情况?我该如何获得与Digital Ocean相同的结果?(在本地主机上启动服务器)

编辑:我正在使用最近发布的Docker for windows,它显然使用Hyper-V本地运行。我的docker-machine ls输出如下:

C:\>docker-machine ls
NAME   ACTIVE   DRIVER   STATE   URL   SWARM   DOCKER   ERRORS

C:\>

请告诉我们您的环境是什么?Windows?Linux? - Hemerson Varela
4个回答

11
但当我运行它时,输出结果不同(注意容器IP的不同)。
由于这是一台Windows机器,我认为你正在使用 Docker for Windows。10.0.75.2 是虚拟机boot2docker的IP地址。
如果您使用的是Windows或Mac OS,您需要某种形式的虚拟化才能运行Docker。您刚才看到的IP地址是那个轻量级虚拟机的IP地址。
如何获得与Digital Ocean相同的结果?(让服务器在localhost上启动)
使用Linux发行版!另外,您可以在Docker For Windows设置中启用“将容器端口暴露在localhost上”。

enter image description here


我正在使用在Windows上运行的Docker,它使用Hyper-V本地运行,请查看我在问题描述中更新的说明。 - sgarcia.dev
@sgarcia 前往 Docker 设置 > 网络,勾选“在本地主机上暴露容器端口”并重启。 - Ali Dehghani
1
请将此评论发布为答案,或在您的答案中编辑此@Ali,以便我可以将其标记为正确,因为这解决了问题! - sgarcia.dev

9

尽管你是在本地机器上创建了容器,但这些容器实际上运行在另一台机器上(一台虚拟机)。

首先,请检查 Docker 机器(即虚拟机)的 IP 地址。

$docker-machine ls
NAME      ACTIVE   DRIVER       STATE     URL                         SWARM
default   *        virtualbox   Running   tcp://192.168.99.100  

然后运行 curl 命令(或打开浏览器)以查看容器内您的 nginx Web 服务器上的默认网站。

curl http://192.168.99.100:80

我正在使用在Windows上本地运行的Hyper-V来运行Docker,可以查看我的问题描述进行更新。根据docker-machine ls,我没有任何Docker机器在运行,但所有容器都可以正常运行。 - sgarcia.dev
在Windows的Docker中,没有虚拟化。根据这篇文档(https://blog.docker.com/2016/03/docker-for-mac-windows-beta/),您应该打开浏览器并输入“http://docker”。 - Hemerson Varela
1
Docker 的核心是运行 Linux 容器(除了 Windows Server 2016),而 Windows 没有自带的 Linux。因此,Docker for Windows 以虚拟化形式带来了自己的 Linux。虚拟化仍然存在,但形式更加无缝、 less painful。 - Ali Dehghani
老兄,你救了我的命。 - Aymen

0

当我第一次运行此命令时:docker run -d -p 80:80 --name docker-tutorial docker101tutorial

出现了以下错误:

docker:守护进程的错误响应:冲突。容器名称“/docker-tutorial”已经被“LONG_CONTAINER_ID”容器使用。您必须删除(或重命名)该容器才能重新使用该名称。

因此,我尝试使用以下命令删除此容器:docker rm -f LONG_CONTAINER_ID

然后我运行了以下命令:docker run -d -p 3080:80 --name docker-tutorial docker101tutorial

注意这里使用了3080:80而不是80:80。如果我从Docker桌面运行此命令,则会看到以下默认选项:

options in docker desktop


0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接