获取Docker容器的IP地址

8
我有一台Ubuntu机器是虚拟机,我在其中安装了Docker。我从本地的Windows机器连接到这台机器并进行SSH,打开终端连接到Ubuntu机器。
现在,我要使用包含所有必要软件的Docker镜像(例如:已安装Apache)进行示例应用程序部署(Web应用程序),并保存它。
现在,我处于混乱的状态中,不确定如何检查已部署的应用程序是否正常运行,即包含已部署应用程序的容器的地址是什么。例如:如果我键入http://127.x.x.x(Ubuntu机器的地址),我只会超时。
有人能告诉我如何验证已部署的应用程序吗?此外,程序输出在控制台上的打印工作非常顺畅,因为输出被打印,唯一让我怀疑的是Web应用程序。
5个回答

8

有几种方法可以检查你的应用程序是否正在运行。

远程API

如JimiDini所说,一种可能性是使用Docker远程API。您可以使用它来查看所有正在运行的容器(这将是您的用例,对吧?),检查某个容器或启动和停止容器。该API是一个REST-API,具有多种编程语言绑定(在https://docs.docker.io/reference/api/remote_api_client_libraries/)。其中一些已经非常过时。为了从另一台机器上使用Docker远程API,我需要明确打开它:

docker -H tcp://0.0.0.0:4243 -H unix:///var/run/docker.sock -d &

注意:API现在已经向全世界开放! 在实际场景中,您需要以某种方式对其进行保护(例如,请参见此处的示例)。

Docker PS

要查看所有正在运行的容器,请在主机上运行docker ps。这将列出所有正在运行的容器。如果您没有看到您的应用程序,则表示它未运行。它还显示您的应用程序正在公开的端口。您也可以通过远程API执行此操作。

日志

您还可以检查日志。您可以运行docker attach <container id>连接到特定容器并查看其标准输出。您还可以运行docker logs <container id>接收Docker日志。我更喜欢将日志写入特定目录,例如将所有日志写入/var/log,并将此文件夹挂载到主机。然后,您的所有日志都将在主机上的/home/ubuntu/docker-logs中结束。

docker run -p 80:8080 -v /home/ubuntu/docker-logs:/var/log:rw my/application

端口和IP的解释

每个容器都将获得自己的IP地址。你可以通过远程API或直接在主机上使用Docker来检查这个IP地址。你也可以为容器指定一个特定的主机名(通过向run命令传递--hostname="test42")。但是,大多数情况下你不需要这样做。

要访问容器中的应用程序,你需要在容器中打开端口并绑定到主机上的一个端口。

在你的Dockerfile中,你需要EXPOSE你的应用运行的端口:

FROM ubuntu
...
EXPOSE 8080
CMD run-my-app.sh

当您启动容器时,需要将此端口绑定到主机的某个端口:

docker run -p 80:8080 my/application

现在您可以通过http://localhost:80http://127.0.0.1:80访问您的应用程序。
如果您的应用程序没有响应,请通过输入docker ps或远程API检查容器是否正在运行。如果它没有运行,请查看日志以获取原因。
(注意:如果您在类似VirtualBox的东西中运行Ubuntu VM,并尝试从Windows计算机访问它,请确保在VirtualBox中打开了端口!)。

6

3
为了获取一个Docker容器的IP地址,如果你知道它的ID(一个长的十六进制字符串)或者你已经给它取了名字,请按如下方式操作:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-id-or-name>

我刚试了一下,对我没用。可能只适用于2014年12月;) - Don Smith

1

Docker运行自己的网络,您可以运行以下命令来获取有关它的信息:
docker network ls
docker network inspect <network name>
docker inspect <container id>
在输出中,您应该能够找到IP地址。

但是,关于Dockerfile和docker run命令,您还需要注意以下几点:

  • 当您在Dockerfile中EXPOSE端口时,容器中的服务无法从Docker外部访问,但可以从其他Docker容器内部访问
  • 当您使用EXPOSE并使用docker run -p ...标志时,容器中的服务可以从任何地方访问,甚至从Docker外部访问

因此,例如,如果您的apache正在端口8080上运行,则应在Dockerfile中公开它,然后可以运行它: docker run -d -p 8080:8080 <image name>,您应该能够从主机上的HTTP://localhost:8080访问它。

这是一个旧的问题/答案,但它可能会帮助其他人;)


0

截至2020年仍在使用

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id


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