我有一个战争文件作为Docker
容器部署在linux ec2
上。但是当我尝试按下http://ec2-elastic-ip:8080/AppName
时,我没有任何反应。
我为security group
和http
设置了所有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
以应用所有更改。
答案 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