
# 基于华为云弹性云服务器自建容器并实现通信
#### 操作场景
在不使用华为云容器产品的情况下，支持用户在华为云弹性云服务器中部署容器，并实现同一个子网中不同弹性云服务器内的容器相互通信。
#### 方案优势
- 云服务器内部署容器，容器地址非VPC网络地址，通过VPC路由方式转发。
- 只需简单配置路由表，就可实现容器网络的互通，灵活方便。
 
#### 典型拓扑
此场景下对网络拓扑有如下要求：
- 弹性云服务器在同一子网内。如图中VPC子网网段为192.168.0.0/24，弹性云服务器的IP地址为192.168.0.2和192.168.0.3。
- 容器网段与VPC子网不在一个网段，同一台弹性云服务器内的容器在同一个网段，不同弹性云服务器内容器的网段不同。如图中ECS1中容器网段为10.0.2.0/24，ECS2中容器网段为10.0.3.0/24。
- 发送给容器的数据包下一跳为容器所在弹性云服务器。如图中发送给10.0.2.0/24网段的数据包下一跳为192.168.0.2，发送给10.0.3.0/24网段的数据包下一跳为192.168.0.3。
图1网络拓扑   
![](https://support.huaweicloud.com/bestpractice-vpc/zh-cn_image_0268337419.png)
#### 配置步骤
1. **创建VPC** **及VPC** **网段** 。
   
   具体操作请参见[创建虚拟私有云和子网](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0013935842.html)。
   
   
2. **创建弹性云服务器** 。
   
   具体方法请参见[自定义购买ECS](https://support.huaweicloud.com/usermanual-ecs/ecs_03_7002.html)。
   创建完成后在弹性云服务器网卡上取消源地址校验，如[图2]所示。
   图2取消源地址校验   
   ![](https://support.huaweicloud.com/bestpractice-vpc/zh-cn_image_0268337422.png)
   
   
3. **在弹性云服务器上部署容器。**
   
   您可以使用Docker CE完成容器的部署，详细操作步骤，请参考第三方软件的帮助文档，本文不做详细说明。
   ![](https://support.huaweicloud.com/bestpractice-vpc/public_sys-resources/note_3.0-zh-cn.png)
   同一台ECS内的容器需要在同一个网段，且不同ECS内容器网段不能重叠。
   
   
4. **添加VPC** **路由表信息** 。
   
   在VPC路由表中添加路由信息。让发送给10.0.2.0/24网段的数据包下一跳为192.168.0.2，发送给10.0.3.0/24网段的数据包下一跳为192.168.0.3，也就是让发送给容器的数据包下一跳都为容器所在ECS。
   ![](https://support.huaweicloud.com/bestpractice-vpc/public_sys-resources/note_3.0-zh-cn.png)
   - 单个VPC中内默认支持50个不同网段的容器部署，如需扩大，请申请扩大VPC路由表数目。
   
   - 容器迁移到其他弹性云服务器后，需要在VPC路由表中添加新的路由信息。
    
   
   
5. **添加安全组规则。**
   
   为了能够通过traceroute命令和ping命令测试容器网络是否连通，为弹性云服务器的安全组添加如[表1]所示规则，开放ICMP和UDP规则。
   具体操作请参见[添加安全组规则](https://support.huaweicloud.com/usermanual-vpc/zh-cn_topic_0030969470.html)。
    表1安全组规则 
   | 方向  | 协议/应用 | 端口 | 源地址       |
   |:---|:---|:---|:---|
   | 入方向 | ICMP  | 全部 | 0.0.0.0/0 |
   | 入方向 | UDP   | 全部 | 0.0.0.0/0 |
      
   
   
 
#### 配置验证
分别在两台弹性云服务器上部署容器，通过ping来测试容器网络是否能连通。
以使用Docker部署容器为例，在ECS1上先创建一个网络连接my-net并指定容器网段为10.0.2.0/24，然后创建容器并指定使用my-net。
```
$ docker network create  --subnet 10.0.2.0/24 my-net
$ docker run -d --name nginx --net my-net -p 8080:80  nginx:alpine
```
在ECS2上同样创建网络连接和容器，容器网段为10.0.3.0/24。
```
$ docker network create  --subnet 10.0.3.0/24 my-net
$ docker run -d --name nginx --net my-net -p 8080:80  nginx:alpine
```
将弹性云服务器上iptables里面filter表的FORWARD链的默认策略设置为ACCEPT。
![](https://support.huaweicloud.com/bestpractice-vpc/public_sys-resources/note_3.0-zh-cn.png)
此处设置是因为Docker为安全性将iptables里面filter表的FORWARD链默认策略设置成了drop，因此需要修改。
```
$ iptables -P FORWARD ACCEPT
```
进入10.0.2.2这个容器，尝试ping和traceroute 10.0.3.2，可以看到能够ping通，且traceroute路由路径为10.0.2.2 -\> 10.0.2.1 -\> 192.168.0.3 -\> 10.0.3.2，与前面设置的路由转发规则一致。
```
[root@ecs1 ~]# docker exec -it nginx /bin/sh
/ # traceroute -d 10.0.3.2
traceroute to 10.0.3.2 (10.0.3.2), 30 hops max, 46 byte packets
 1  10.0.2.1 (10.0.2.1)  0.007 ms  0.004 ms  0.007 ms
 2  192.168.0.3 (192.168.0.3)  0.232 ms  0.165 ms  0.248 ms
 3  10.0.3.2 (10.0.3.2)  0.366 ms  0.308 ms  0.158 ms
/ # ping 10.0.3.2
PING 10.0.3.2 (10.0.3.2): 56 data bytes
64 bytes from 10.0.3.2: seq=0 ttl=62 time=0.570 ms
64 bytes from 10.0.3.2: seq=1 ttl=62 time=0.343 ms
64 bytes from 10.0.3.2: seq=2 ttl=62 time=0.304 ms
64 bytes from 10.0.3.2: seq=3 ttl=62 time=0.319 ms
```
