无法连接到Docker容器:拒绝连接

时间:2019-05-16 07:33:52

标签: amazon-web-services docker tomcat amazon-ec2 docker-machine

我有一个战争文件作为Docker容器部署在linux ec2上。但是当我尝试按下http://ec2-elastic-ip:8080/AppName时,我没有任何反应。

我为security grouphttp设置了所有https入站规则。所以这不是问题。

调试

我尝试通过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将war复制到webapp,推送注册表映像,最后执行terraform apply以应用所有更改。

3 个答案:

答案 0 :(得分:1)

当前,您的应用程序正在随机主机端口上运行,即32772,请参见docker ps输出。一旦允许端口{{1,您必须能够在http://ec2-ip:32772上访问您的应用程序}}在安全组中。

为了使其能够在主机端口8080上工作,您需要在docker run期间绑定/暴露主机端口-

32772

如果您使用ECS,理想情况下,应在服务中使用ALB和TG。

但是,如果您不使用ALB等,则可以尝试在TD $ docker run -p 8080:8080 ......中提供静态hostPort(我没有尝试过)。如果运行良好,则需要确保将部署策略更改为“最低健康百分比= 0”,否则可能会遇到端口冲突问题。

答案 1 :(得分:0)

确保apache正在侦听docker容器内的所有IP地址,而不仅仅是本地主机。 IP应该像0.0.0.0。

如果任何服务在docker内部运行并且仅在监听localhost,则只能在该容器内部访问该服务,而不能从主机访问该

您还可以尝试使用端口8080启动apache并将docker 8080端口与主机8080端口绑定

docker run apache -p 8080:8080

答案 2 :(得分:0)

如果应用程序需要网络端口,则必须在docker文件中 EXPOSE

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