资讯专栏INFORMATION COLUMN

Docker 高级网络配置

jhhfft / 2578人阅读

摘要:默认指定了接口的地址和子网掩码,让主机和容器之间可以通过网桥相互通信。解决方法是创建一对接口,分别放到两个容器中,配置成点对点链路。点到点链路不需要子网和子网掩码。

容器访问控制 检查本地系统的转发支持
sysctl net.ipv4.ip_forward
sysctl -w net.ipv4.ip_forward=1  # 手动打开
如果在启动Docker服务的时候设定--ip-forward=true,Docker会自动设定
容器之间相互访问,需要:
1 容器的网络拓扑是否已经互联,默认连接在docker0网桥
2 本地防火墙是否允许通过
访问所有端口
默认情况下,不同容器之间是允许网络互通的, 为了安全,可以禁止。

vim /etc/default/docker
DOCKER_OPTS=--icc=false
访问指定端口
通过 -icc=false 关闭网络访问后,还可以通过 --link=CONTAINER_NAME:ALIAS 来访问容器的开放端口
容器访问外部实现
docker run -p or -P 本质是在本地iptables的nat表添加相应的规则 
iptables -t nat -nL  # 查看主机的NAT规则

如果希望永久绑定到某个固定的IP地址
vim /etc/docker/daemon.json

{
    "ip":"0.0.0.0"
}
配置docker0网桥
Docker服务默认会创建一个docker0网桥,在内核层联通了其他的物理或者虚拟网卡,将所有的容器和本地主机都放到同一个物理网络。
Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
查看网桥和端口连接信息
yum install bridge-utils -y
brctl show

每次新创建一个容器的时候,Docker从可用的地址段中选择一个空闲的IP分配给容器的eth0端口,使用本地的docker0接口IP作为所有容器的默认网关。
sudo docker run -it --rm base /bin/bash
ip addr show eth0
ip route
自定义网桥
启动Docker服务时使用 -b BRIDGE 或 --bridge=BRIDGE 来指定使用的网桥

若服务已运行,先停止服务并删除旧的网桥
sudo systemctl stop docker
sudo ip link set dev docker0 down
sudo brctl delbr docker0

然后创建一个新的网桥bridge0
sudo brctl addbr bridge0
sudo ip addr add 192.168.5.1/24 dev bridge0
sudo ip link set dev bridge0 up

ip addr show bridge0  # 查看确认网桥创建并启动

vim /etc/docker/daemon.json  将Docker默认桥接到创建的网桥上。
{
    "bridge": "bridge0",
}
外部工具
pipework  # shell脚本,可以帮助用户在比较复杂的场景中完成容器的连接
playground Docker容器网络拓扑管理的Python库,包括路由器、NAT防火墙,以及其他一些基本服务。
编辑网络配置文件
Docker 1.2.0以后支持在运行中的容器编辑 /etc/hosts, /etc/hostname, /etc/resolve.conf文件
但是这些修改都是临时的,只在运行中的容器中保留。
创建点对点的连接
用户需要有时候在两个容器之间可以直连通信,而不用通过主机网桥进行桥接。
解决方法是:创建一对peer接口,分别放到两个容器中,配置成点对点链路。

1 启动两个容器
docker run -it --rm --net=none base /bin/bash
docker run -it --rm --net=none base /bin/bash

2 找到进程号,然后创建网络命名空间的跟踪文件
docker inspect -f "{{.State.Pid}}" e9f076fc2447
docker inspect -f "{{.State.Pid}}" 762086c10c65

sudo mkdir -p /var/run/netns
sudo ln -s /proc/2989/ns/net /var/run/netns/2989
sudo ln -s /proc/3004/ns/net /var/run/netns/3004

3 创建一对peer接口,然后配置路由
sudo ip link add A type veth peer name B

sudo ip link set A netns 2989
sudo ip netns exec 2989 ip addr add 10.1.1.1/32 dev A
sudo ip netns exec  2989 ip link set A up
sudo ip netns exec 2989 ip route add 10.1.1.2/32 dev A

sudo ip link set B netns 3004
sudo ip netns exec 3004 ip addr add 10.1.1.1/32 dev B
sudo ip netns exec  3004 ip link set B up
sudo ip netns exec 3004 ip route add 10.1.1.2/32 dev B

到此2个容器可以相互ping通,并成功建立连接。点到点链路不需要子网和子网掩码。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/27483.html

相关文章

  • Kubernetes Master High Availability 高级实践

    摘要:才云科技云开源高级工程师唐继元受邀社群,在线分享高级实践,介绍如何构建环境。除命令外的停止都是异常停止。 才云科技云开源高级工程师唐继元受邀DBAplus社群,在线分享《Kubernetes Master High Availability 高级实践》,介绍如何构建Kubernetes Master High Availability环境。 以下是分享实录: 大家好,我是才云科技的唐继...

    JiaXinYi 评论0 收藏0
  • Docker容器网络指南

    摘要:同时,众多创业公司也已经开发出定制的平台来管理容器,而传统的供应商,如思科和使他们的网络管理工具控制容器。虚拟网络产品的思科的等个项目是第一批被支持的第三方网络工具。 尽管媒体对容器技术存在大肆宣传,但是,应用程序打包技术仍在不断发展之中,特别是与网络有关的。 在过去的一年里,虽然Docker容器自身在网络功能方面有着长足的进步。但与此同时,Docker也构建了一个插件架构,允许更先进...

    ThreeWords 评论0 收藏0
  • 来说说Kubernetes的运作机制

    摘要:提供用于获取有关容器和容器组状态的实时信息的服务,以及有关群集中开发人员操作的详细信息。集群最高级别的抽象是指运行本身是集群应用程序的一组机器及其管理的容器,一个集群必须有一个,即命令和控制集群中所有其他机器的系统。Docker容器改变了人们对开发、部署和维护软件的思考方式,利用现代操作系统的本机隔离功能,容器支持类似于虚拟机的关注点分离,但是与基于虚拟机监控程序的虚拟机相比,它的开销要小得...

    yanest 评论0 收藏0
  • Docker企业级管理平台开放下载,免费使用

    摘要:云帮能解决什么问题新一代企业平台让开发人员轻松地开发部署和运维应用,让架构师和运营人员利用熟知和可靠技术打造一个受控的运行环境。有助于加速企业级应用服务于市场,实现内部资源的有效利用。 云帮是什么? 云帮 是一款基于容器技术的应用管理平台。社区版针对个人、企业完全免费,您可以自由的下载与传播,但需要遵循我们的社区版协议。 云帮从哪里来? 云帮是 北京好雨科技有限公司 结合容器技术整合的...

    sumory 评论0 收藏0

发表评论

0条评论

jhhfft

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<