【问题标题】:Obtaining the ip address of a docker container获取docker容器的ip地址
【发布时间】:2014-06-01 07:40:00
【问题描述】:

我有一台 ubuntu 机器,它是一个我在其中安装了 docker 的 VM。我正在本地 Windows 机器上使用这台机器并执行 ssh ,将终端打开到 ubuntu 机器。

现在,我将拍摄一个包含所有必要软件的 docker 映像,例如:安装在其中的 apache。稍后我将部署一个示例应用程序(这是一个 Web 应用程序)并保存它。

现在,我对如何检查部署的应用程序是否正常运行感到困惑。即,包含已部署应用程序的容器的地址是什么。 例如:- 如果我输入 http://127.x.x.x 这是 ubuntu 机器的地址,我就会超时。

谁能告诉我如何验证部署的应用程序。此外,在控制台上打印程序的输出工作得非常好,因为输出被打印出来,我唯一有一些疑问的是关于 Web 应用程序。

【问题讨论】:

    标签: docker boot2docker


    【解决方案1】:

    有一些方法可以检查您的应用是否正在运行。

    远程 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 现在已向全世界开放!在实际场景中,您需要以某种方式对其进行保护(例如,参见 http://java.dzone.com/articles/securing-docker%E2%80%99s-remote-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 地址。您还可以为容器指定特定的主机名(通过将--hostname="test42" 传递给run 命令)。但是,您大多不需要那个。

    要访问容器中的应用,需要打开容器中的端口并绑定到宿主机上的某个端口。

    在您的 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 虚拟机并尝试从 Windows 机器访问它,请确保您也打开了 VirtualBox 中的端口!)。

    【讨论】:

      【解决方案2】:

      Docker 容器有一个单独的 IP 地址。默认情况下它是私有的(只能从主机访问)。

      Docker 通过其 API 提供所有元数据(包括 IP 地址):

      1. https://docs.docker.io/reference/api/docker_remote_api_v1.10/#inspect-a-container
      2. https://docs.docker.io/reference/api/docker_remote_api_v1.10/#monitor-docker-s-events

      您还可以查看一个名为docker-gen 的小工具以获得灵感。它监控 docker-events 并使用模板在主机上创建配置文件。

      【讨论】:

        【解决方案3】:

        要获取 docker 容器的 ip 地址,如果您知道它的 id(一个长的十六进制字符串)或者如果您命名它:

        docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-id-or-name>
        

        【讨论】:

        • 我刚试过这个,它对我不起作用。可能在 2014 年 12 月工作;)
        【解决方案4】:

        Docker 正在运行自己的网络,要获取有关它的信息,您可以运行以下命令:
        docker network ls
        docker network inspect &lt;network name&gt;
        docker inspect &lt;container id&gt;
        在输出中,您应该能够找到 IP。

        但您还需要注意一些事项,关于 Dockerfile 和 docker run 命令:

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

        例如,如果您的 apache 在端口 8080 上运行,您应该在 Dockerfile 中公开它,然后您可以将其运行为: docker run -d -p 8080:8080 &lt;image name&gt; 并且您应该能够从您的主机上的 HTTP://localhost:8080 访问它。

        这是一个古老的问题/答案,但它可能对其他人有所帮助;)

        【讨论】:

          【解决方案5】:

          从 2020 年开始工作

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

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2014-05-21
            • 2013-06-14
            • 2020-09-01
            • 1970-01-01
            • 1970-01-01
            • 2019-04-14
            相关资源
            最近更新 更多