如何实现两台EC2实例上不同Docker容器的网络互通?
跨EC2实例Docker容器互通方案
下面是几种可行的实现方式,根据你的场景选择:
1. 使用Docker Swarm Overlay网络
这种方式会创建一个跨节点的逻辑网络,容器可以直接通过名称访问,适合需要统一网络环境的场景:
- 在EC2实例1上初始化Swarm集群,指定实例的私有IP:
执行后会返回一条docker swarm init --advertise-addr <实例1私有IP>docker swarm join命令,复制下来 - 在EC2实例2上执行刚才复制的命令,加入Swarm集群
- 在实例1上创建可附加的Overlay网络(
--attachable允许普通容器加入,默认仅Swarm服务可用):docker network create --driver overlay --attachable cross-ec2-net - 启动容器时指定该网络:
实例1启动容器1:
实例2启动容器2:docker run -d --name container1 --network cross-ec2-net <你的镜像名>docker run -d --name container2 --network cross-ec2-net <你的镜像名> - 测试:在容器1内直接ping容器2的名称
ping container2,或者访问对应端口即可互通
2. 安全组配置+端口映射(简单场景)
如果不需要统一逻辑网络,这种方式更轻量:
- 配置EC2安全组:给两台实例的安全组添加入站规则,允许对方私有IP访问容器所需的端口(比如容器2要暴露8080端口,就允许实例1的私有IP访问8080)
- 实例2启动容器2时,把容器端口映射到EC2实例端口:
docker run -d --name container2 -p 8080:8080 <你的镜像名> - 实例1的容器1直接通过
实例2私有IP:映射端口访问,比如在容器1内执行curl http://<实例2私有IP>:8080
3. 使用Weave Net网络插件
Weave Net可以快速创建跨主机的容器网络,无需Swarm:
- 在两台EC2实例上分别安装Weave:
curl -L git.io/weave -o /usr/local/bin/weave && chmod a+x /usr/local/bin/weave - 在实例1上启动Weave:
weave launch - 在实例2上连接到实例1的Weave网络:
weave launch <实例1私有IP> - 启动容器时使用Weave网络:
实例1:
实例2:docker run -d --name container1 --network weave <你的镜像名>docker run -d --name container2 --network weave <你的镜像名> - 测试:容器1可以直接通过容器名访问容器2
内容的提问来源于stack exchange,提问作者Farhaan Patel
相关产品推荐
相关产品推荐

