什么时候更改 EC2 实例类型我遇到了一个问题。机器3 个需要重启的 Docker 容器重启后其端口变得无法访问。
可能是什么问题以及我应该如何获取其他必要的调试信息?
安全组未发生任何变化AWS 内的配置,所有必需的端口仍然处于启用状态。
我是仍然可以使用 SSH进入 EC2 实例,但 Docker 使用的端口(80、8181)无法访问(连接超时)。
在 Web 浏览器中,无论我尝试访问是否正在使用的端口,浏览器的行为始终相同(加载指示器在开始时停止,然后超时,没有任何内容记录在 Apache 的 access.log 或 error.log 中)。
在 Web 浏览器中,无法通过公共 DNS(IPv4)、IPv4 公共 IP 或原始域名来寻址实例。
重新启动实例或再次更改其类型无济于事
我能够从实例内部 ping/telnet/wget Docker 容器使用的端口:
$ docker exec f227cf8d9481 wget 127.0.0.1:8181
converted 'http://127.0.0.1:8181' (ANSI_X3.4-1968) -> 'http://127.0.0.1:8181' (UTF-8)
--2018-01-15 23:49:10-- http://127.0.0.1:8181/
Connecting to 127.0.0.1:8181... connected.
HTTP request sent, awaiting response... 401 Unauthorized
但从外部看却不行(IP 地址仍然能被解析):
$ wget <aws-ip>.<aws-zone>.<instance>.amazonaws.com:8181
--2018-01-16 00:53:32-- http://<aws-ip>.<aws-zone>.<instance>.amazonaws.com:8181/
Resolving <aws-ip>.<aws-zone>.<instance>.amazonaws.com... xxx.xxx.xxx.xxx
Connecting to <aws-ip>.<aws-zone>.<instance>.amazonaws.com|xxx.xxx.xxx.xxx|:8181... failed: Operation timed out.
Retrying.
Docker 容器正在运行,并且 Docker 端口之间的映射已正确完成:
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f227cf8d9481 cloud9 "forever /cloud9/s..." 3 seconds ago Up 2 seconds 0.0.0.0:8080-8081->8080-8081/tcp, 80/tcp, 0.0.0.0:8181->8181/tcp, 0.0.0.0:81->3000/tcp my-cloud9
fa0d2bbce863 wordpress "docker-entrypoint..." 59 minutes ago Up 59 minutes 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp goofy_torvalds
6ada961a5ea0 mysql "docker-entrypoint..." About an hour ago Up About an hour 0.0.0.0:3306->3306/tcp
Iptables 设置似乎已启用 Docker 端口:
$ sudo iptables --table nat --list
Chain PREROUTING (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere anywhere ADDRTYPE match dst-type LOCAL
Chain INPUT (policy ACCEPT)
target prot opt source destination
Chain OUTPUT (policy ACCEPT)
target prot opt source destination
DOCKER all -- anywhere !loopback/8 ADDRTYPE match dst-type LOCAL
Chain POSTROUTING (policy ACCEPT)
target prot opt source destination
MASQUERADE all -- <aws-ip>.<aws-zone>.<instance>.internal/16 anywhere
MASQUERADE tcp -- <aws-ip>.<aws-zone>.<instance>.internal <aws-ip>.<aws-zone>.<instance>.internal tcp dpt:mysql
MASQUERADE tcp -- <aws-ip>.<aws-zone>.<instance>.internal <aws-ip>.<aws-zone>.<instance>.internal tcp dpt:https
MASQUERADE tcp -- <aws-ip>.<aws-zone>.<instance>.internal <aws-ip>.<aws-zone>.<instance>.internal tcp dpt:http
MASQUERADE tcp -- <aws-ip>.<aws-zone>.<instance>.internal <aws-ip>.<aws-zone>.<instance>.internal tcp dpt:8181
MASQUERADE tcp -- <aws-ip>.<aws-zone>.<instance>.internal <aws-ip>.<aws-zone>.<instance>.internal tcp dpt:tproxy
MASQUERADE tcp -- <aws-ip>.<aws-zone>.<instance>.internal <aws-ip>.<aws-zone>.<instance>.internal tcp dpt:webcache
MASQUERADE tcp -- <aws-ip>.<aws-zone>.internal <aws-ip>.<aws-zone>.<instance>.internal tcp dpt:hbci
Chain DOCKER (2 references)
target prot opt source destination
RETURN all -- anywhere anywhere
DNAT tcp -- anywhere anywhere tcp dpt:mysql to:<docker-ip>:3306
DNAT tcp -- anywhere anywhere tcp dpt:https to:<docker-ip>:443
DNAT tcp -- anywhere anywhere tcp dpt:http to:<docker-ip>:80
DNAT tcp -- anywhere anywhere tcp dpt:8181 to:<docker-ip>:8181
DNAT tcp -- anywhere anywhere tcp dpt:tproxy to:<docker-ip>:8081
DNAT tcp -- anywhere anywhere tcp dpt:webcache to:<docker-ip>:8080
DNAT tcp -- anywhere anywhere tcp dpt:81 to:<docker-ip>:3000
不,使用 EC2 实例的监控工具似乎没有任何明显的网络活动(每 5 分钟约 2KB)。除了我使用 SSH 登录时的一些峰值:
答案1
问题出在 DNS 和 SSL 证书配置上,因为实例配置为仅使用 HTTPS。
更改实例类型后,新实例会自动分配一个新的 URL,必须使用 DNS 提供商和 CA 进行更新。