[英]Unable to connect to Docker container: Connection Refused
我在linux ec2
上将一个war文件部署为Docker
容器。 但是,当我尝试点击http://ec2-elastic-ip:8080/AppName
,没有任何反应。
我为http
和https
设置了所有security group
入站规则。 所以这不是问题。
调试
我尝试通过ssh-ing
linux实例进行调试。 尝试使用命令curl localhost:8080
,这是响应:
curl: (7) Failed to connect to localhost port 8080: Connection refused
尝试使用127.0.0.1:8080
但响应相同。
我要做的下一件事是列出Docker容器: docker ps
。 我得到:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
<ID> <ecr>.amazonaws.com/<my>-registry:2019-05-16.12-17-02 "catalina.sh run" 24 minutes ago Up 24 minutes 0.0.0.0:32772->8080/tcp ecs-app-24-name
现在,我使用docker exec -it <name> /bin/bash
连接到该容器,并尝试检查tomcat日志,这清楚地表明我的应用程序大战已经开始,并且tomcat已经开始。
我曾经尝试检查docker-machine ip default
但这给了我错误:
Docker machine "default" does not exist. Use "docker-machine ls" to list machines. Use "docker-machine create" to add a new one.
现在卡住了。 无法进一步调试。 期望的结果是通过上面的URL访问应用程序。
该怎么办? 发生问题了吗?
另外,整个基础架构都是通过terraform
管理的。 我首先创建基础映像,使用DockerFile
将战争复制到DockerFile
,推送注册表映像,最后进行terraform apply
以应用所有更改。
当前,您的应用程序在随机主机端口(即32772
,请参阅32772
docker ps
输出。一旦在安全组中允许端口32772
,您就必须能够在http://ec2-ip:32772
上访问您的应用程序。
为了使其能够在主机端口8080上运行,您需要在docker run期间绑定/暴露主机端口-
$ docker run -p 8080:8080 ......
如果您使用的是ECS,则理想情况下,应在服务中使用ALB和TG。
但是,如果您没有使用ALB等,则可以尝试在TD "hostPort": 8080
提供一个静态hostPort(我没有尝试过)。 如果运行良好,则需要确保将部署策略更改为“最低健康百分比= 0”,否则可能会遇到端口冲突问题。
确保apache正在监听docker容器内的所有IP地址,而不仅仅是本地主机。 IP应该像0.0.0.0。
如果任何服务正在docker内部运行并且仅侦听localhost,则只能在该容器内部访问该服务,而不能从主机访问该服务。
您也可以尝试使用端口8080启动apache并将docker 8080端口与主机8080端口绑定
docker run apache -p 8080:8080
如果应用程序需要网络端口,则必须在docker文件中将其暴露 。
EXPOSE <port> [<port>/<protocol>...]
如果需要将该端口映射到网络上的特定端口,则必须在启动新容器时定义该端口。
docker run -p 8080:8080/tcp my_app
如果使用分别运行每个映像,则必须每次都绑定端口。 如果您不想每次都执行此操作,则可以使用docker-compose并在其中添加ports指令。
ports:
- "8080:8080/tcp"
假设您在dockerfile中添加了暴露,则完整的docker-compose.yml如下所示:
version: '1'
services:
web:
build:
ports:
- "8080:8080"
my_app:
image: my_app
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.