【问题标题】:Access Docker hosted web application from Host machine从主机访问 Docker 托管的 Web 应用程序
【发布时间】:2021-11-06 07:13:28
【问题描述】:

我创建了一个 php Web 应用程序并将其托管在 Docker 中。 现在我尝试从主机(不是通过 docker)访问应用程序,但无法打开它。任何帮助将不胜感激!

详情- 操作系统 - Catalina

Accessing :- http://localhost:60
Error-
This page isn’t workinglocalhost didn’t send any data.
ERR_EMPTY_RESPONSE


Followed the below steps :-
Shrutis-MacBook-Pro:MyDockerImages shrutipatnaik$ ls
index.php       world.txt
Dockerfile      

Shrutis-MacBook-Pro:MyDockerImages shrutipatnaik$ docker build -t jenkins_php .
Sending build context to Docker daemon  653.8MB
Step 1/3 : FROM php:7.4-apache
---> 05e7c943eaa9
Step 2/3 : COPY . /var/www/html
---> e30136f8e0c7
Step 3/3 : CMD ls &&     whoami &&     pwd ;
---> Running in 4c29020952fb
Removing intermediate container 4c29020952fb
---> dd0a9d7f8ccd
Successfully built dd0a9d7f8ccd
Successfully tagged jenkins_php:latest


Shrutis-MacBook-Pro:MyDockerImages shrutipatnaik$docker run -it -d -p 60:60 
jenkins_php:latest /bin/sh
26e3590f0e6a249f26251c33020a8180610ce07ff11004dc3dc2460a3aa41790



Shrutis-MacBook-Pro:MyDockerImages shrutipatnaik$ docker ps -a
CONTAINER ID        IMAGE                 COMMAND                  CREATED             
STATUS                      PORTS                                NAMES
26e3590f0e6a        jenkins_php:latest    "docker-php-entrypoi…"   6 hours ago         
Up 6 hours                  60/udp, 0.0.0.0:60->60/tcp, 80/tcp   kind_chatelet

【问题讨论】:

  • 我不使用 MacOS,但我相信您不能使用 localhost 从主机访问 Docker 容器(在 VM 上运行)。相反,您可以使用host.internal.docker。此外,您引用端口 60 和端口 80。PHP 应用程序服务于哪个端口?

标签: docker web-applications localhost


【解决方案1】:

确定两件事:

首先 - 当您使用 /bin/sh 命令运行容器时,最后是容器正在运行的命令,而不是您的 Web 应用程序。 查看您使用的 docker 镜像 dockerfileENTRYPOINTCMD 命令。

当您在docker run 命令的末尾添加命令时,您会覆盖预配置的启动命令:

用法:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

为此运行docker run -dp 60:60 jenkins_php:latest

nginx 示例:

当按照问题中的建议运行时:

docker run -itdp 80:80 nginx /bin/sh

我们尝试通过 chrome 访问:

当“定期”运行时:

docker run -dp 80:80 nginx

甚至

docker run -itdp 80:80 nginx

我们尝试通过 chrome 访问:

在任何一种情况下,当运行 docker ps 时,它不会显示新命令,而是显示旧的入口点脚本(就像问题中一样),即使它已被覆盖:

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                               NAMES
3fe92585a40c   nginx     "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   0.0.0.0:80->80/tcp, :::80->80/tcp   adoring_heisenberg

第二 - 也有可能在修复它之后它不会工作导致您还发布端口 80/tcp 并且除非您特别选择默认情况下在 80 上发布更有意义,所以我会一路检查.

为了那个运行docker run -dp 80:80 jenkins_php:latest

如果我们尝试像之前的错误配置一样进行复制,我们会得到同样的错误

CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS         PORTS                                           NAMES
146d05cc5275   nginx     "/docker-entrypoint.…"   3 seconds ago   Up 2 seconds   80/tcp, 0.0.0.0:80->1000/tcp, :::80->1000/tcp   goofy_lamport

localhost 没有发送任何数据。 ERR_EMPTY_RESPONSE

【讨论】:

  • 我在没有 /bin/sh 的情况下尝试了以下建议,容器退出并出现相同的错误(无法访问此站点 localhost 拒绝连接)。
  • 的MacBook $搬运工运行-itdp 160:160 jenkins_php:最新的nginx d914159e6aa2deab1280e36774ea7a2f19fcaad67f836a9d626bbf04e99d2e4f容器ID IMAGE命令创建状态端口NAMES d914159e6aa2 jenkins_php:最新的 “搬运工-PHP-entrypoi ...” 2分钟前结束(127)2分钟前objective_davinci
  • 当我尝试使用 80:80 时,出现以下错误。 MacBook$docker run -itdp 80:80 jenkins_php:latest apache eaf3ec71bb04b34ed1be848ff347fe463d258eaba8871dfd99bf4d6e25ec9046 docker:来自守护进程的错误响应:端口不可用:监听 tcp 0.0.0.0:80:绑定:地址已在使用中。
  • 可能是因为 80 端口已经被容器或其他程序使用了,所以您不必在容器中绑定到主机上的 80 端口。使用端口 8080 代替例如 8080:80
  • 尝试使用 8080:80,我仍然收到 ERR_EMPTY_RESPONSE 不知道为什么。容器状态也显示为exited。
猜你喜欢
  • 2018-03-18
  • 1970-01-01
  • 2017-01-01
  • 2019-01-07
  • 2022-11-29
  • 2019-09-16
  • 1970-01-01
  • 2017-08-06
  • 1970-01-01
相关资源
最近更新 更多