现在,我要使用包含所有必要软件的Docker镜像(例如:已安装Apache)进行示例应用程序部署(Web应用程序),并保存它。
现在,我处于混乱的状态中,不确定如何检查已部署的应用程序是否正常运行,即包含已部署应用程序的容器的地址是什么。例如:如果我键入http://127.x.x.x(Ubuntu机器的地址),我只会超时。
有人能告诉我如何验证已部署的应用程序吗?此外,程序输出在控制台上的打印工作非常顺畅,因为输出被打印,唯一让我怀疑的是Web应用程序。
有几种方法可以检查你的应用程序是否正在运行。
如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
。这将列出所有正在运行的容器。如果您没有看到您的应用程序,则表示它未运行。它还显示您的应用程序正在公开的端口。您也可以通过远程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地址。你可以通过远程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:80
或http://127.0.0.1:80
访问您的应用程序。docker ps
或远程API检查容器是否正在运行。如果它没有运行,请查看日志以获取原因。Docker容器有独立的IP地址。默认情况下,它是私有的(只能从主机访问)。
Docker通过其API提供所有元数据(包括IP地址):
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <container-id-or-name>
Docker运行自己的网络,您可以运行以下命令来获取有关它的信息:
docker network ls
docker network inspect <network name>
docker inspect <container id>
在输出中,您应该能够找到IP地址。
但是,关于Dockerfile和docker run
命令,您还需要注意以下几点:
EXPOSE
端口时,容器中的服务无法从Docker外部访问,但可以从其他Docker容器内部访问EXPOSE
并使用docker run -p ...
标志时,容器中的服务可以从任何地方访问,甚至从Docker外部访问因此,例如,如果您的apache正在端口8080上运行,则应在Dockerfile中公开它,然后可以运行它:
docker run -d -p 8080:8080 <image name>
,您应该能够从主机上的HTTP://localhost:8080访问它。
这是一个旧的问题/答案,但它可能会帮助其他人;)
截至2020年仍在使用
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id