运行 Docker 时本地主机的 ERR_EMPTY_RESPONSE

Jac*_*IRR 5 apache docker

这是我的 Dockerfile:

\n\n
# CentOs base image\nFROM centos:centos6.8\n\n# install python, pip, apache and other packages\nRUN yum -y update; yum clean all\nRUN yum -y install epel-release; yum clean all\nRUN yum -y install centos-release-scl; yum clean all\nRUN yum -y install python27; yum clean all\nRUN yum -y install python-devel.x86_64; yum clean all\nRUN yum -y install python-pip; yum clean all\nRUN yum -y install gcc; yum clean all\nRUN yum -y install httpd httpd-devel mod_ssl; yum clean all\n\n# Make a non root user so I can run mod_wsgi without root\n# USER adm\n\n# install Python modules needed by the Python app\nCOPY requirements.txt /usr/src/app/\nRUN pip install --no-cache-dir -r /usr/src/app/requirements.txt\n\n# copy files required for the app to run\nCOPY . /usr/src/app/\n\n# tell the port number the container should expose\nEXPOSE 80\n\n# run the application\n# CMD ["mod_wsgi", "start-server run_apache_server.wsgi"]\n# CMD ["cat", "/etc/passwd"]\n# CMD ["cat", "/etc/group"]\n# CMD ["find", "/"]\nCMD ["/bin/sh", "-c", "/usr/bin/mod_wsgi-express start-server run_apache_server.wsgi --user adm --group apache"]\n
Run Code Online (Sandbox Code Playgroud)\n\n

我可以运行该应用程序:

\n\n
$ docker run -d -P --name myapp jacobirr/pleromatest\n
Run Code Online (Sandbox Code Playgroud)\n\n

并查看 tcp 端口 80:

\n\n
$ docker port myapp\n80/tcp -> 0.0.0.0:32769\n
Run Code Online (Sandbox Code Playgroud)\n\n

这是我的要求.txt:

\n\n
Flask==0.10.1\nFlask-Restless==0.13.1\nFlask-SQLAlchemy==0.16\nJinja2==2.7\nMarkupSafe==0.18\nSQLAlchemy==0.8.2\nWerkzeug==0.9.2\ngunicorn==17.5\nitsdangerous==0.22\nmimerender==0.5.4\npython-dateutil==2.1\npython-mimeparse==0.1.4\nrequests==1.2.3\nsix==1.3.0\nwsgiref==0.1.2\nsetuptools==5.4.2\nmod_wsgi==4.5.15\n
Run Code Online (Sandbox Code Playgroud)\n\n

为什么我无法localhost:32769在浏览器中访问?我怀疑这与:

\n\n

\xe2\x80\xa2运行 apache 的用户/组?

\n\n

\xe2\x80\xa2事实上我正在安装,mod_wsgi但它在docker“文件系统”上不存在,所以我必须使用mod_wsgi-express

\n\n

更新:

\n\n

\'1\' Netstat 显示:

\n\n
[root@9003b0d64916 app]# netstat -l\nActive Internet connections (only servers)\nProto Recv-Q Send-Q Local Address               Foreign Address             State      \ntcp        0      0 *:irdmi                     *:*                         LISTEN      \nActive UNIX domain sockets (only servers)\nProto RefCnt Flags       Type       State         I-Node Path\nunix  2      [ ACC ]     STREAM     LISTENING     113181 /tmp/mod_wsgi-localhost:8000:0/wsgi.1.0.1.sock\n
Run Code Online (Sandbox Code Playgroud)\n\n

\'2\' httpd 似乎正在我的容器中运行:

\n\n
[root@9003b0d64916 mod_wsgi-localhost:8000:0]# ps aux | grep httpd\nroot         1  0.0  0.2  64060  5084 ?        Ss   21:17   0:00 httpd (mod_wsgi-express) -f /tmp/mod_wsgi-localhost:8000:0/httpd.conf -k start -DFOREGROUND\nadm          6  0.0  0.6 350928 13936 ?        Sl   21:17   0:00 (wsgi:localhost:8000:0)  -f /tmp/mod_wsgi-localhost:8000:0/httpd.conf -k start -DFOREGROUND\nadm          7  0.0  0.1  64192  3248 ?        S    21:17   0:00 httpd (mod_wsgi-express) -f /tmp/mod_wsgi-localhost:8000:0/httpd.conf -k start -DFOREGROUND\n
Run Code Online (Sandbox Code Playgroud)\n

Mat*_*ark 2

从您的所有输出来看,您的 httpd / uwsgi 进程肯定绑定到 8000,这是您需要在容器上公开的端口。

netstat 中的这一行显示了 8000 上的绑定,没有其他内容。

tcp        0      0 *:irdmi                     *:*                         LISTEN      
Run Code Online (Sandbox Code Playgroud)

这里并不明显,但是如果您使用该--numeric-ports参数,它不会将 8000 转换为其已知端口

在你的 docker 文件中,你应该再次

EXPOSE 8000
Run Code Online (Sandbox Code Playgroud)

启动容器时,您还可以指定要在主机上使用的端口:

docker run -p 8080:8000 --name ...
Run Code Online (Sandbox Code Playgroud)

之后,您应该能够使用浏览器来点击

localhost:8080  ->  container:8000
Run Code Online (Sandbox Code Playgroud)