以下内容引用Docker —— 从入门到实践

当 Docker 启动时,会自动在主机上创建一个 docker0 虚拟网桥,实际上是 Linux 的一个 bridge,可以理解为一个软件交换机。它会在挂载到它的网口之间进行转发。
同时,Docker 随机分配一个本地未占用的私有网段(在 RFC1918 中定义)中的一个地址给 docker0 接口。比如典型的 172.17.42.1,掩码为 255.255.0.0。此后启动的容器内的网口也会自动分配一个同一网段(172.17.0.0/16)的地址。
当创建一个 Docker 容器的时候,同时会创建了一对 veth pair 接口(当数据包发送到一个接口时,另外一个接口也可以收到相同的数据包)。这对接口一端在容器内,即 eth0;另一端在本地并被挂载到 docker0 网桥,名称以 veth 开头(例如 vethAQI2QT)。通过这种方式,主机可以跟容器通信,容器之间也可以相互通信。Docker 就创建了在主机和所有容器之间一个虚拟共享网络。如图

下面以自定义的容器方式,一步步配置网络, 达到以下目标:

  • 容器间能够通信
  • 容器能够联外网

首先创建一个容器,但不使用默认网络配置,使用--net=none选项:

docker run -t -i --net=none ubuntu:14.04 bash
docker ps # 获取容器id=d344e6e05a99

获取容器pid:

docker inspect d344e6e05a99 | grep -i "\<pid\""
#  "Pid": 27383,
pid=27383

创建netns,并把容器放入新建的netns中,好像不能使用ip netns命令创建,使用以下方法创建:

sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid

验证是否创建成功:

sudo ip netns show
# 27383
# ns1
# test

可见命名为27383的netns已经成功创建!

接下来创建一个veth对,其中一个设置为容器所在的netns

sudo ip link add name veth_d344 type veth peer name veth_d344_peer
sudo ip link set veth_d344_peer netns $pid

进入$pid netns设置网卡名称和ip:

sudo ip netns exec  27383 bash
sudo ip link set veth_d344_peer name eth0
sudo ifconfig  eth0 10.0.0.2/24 # 设置ip为10.0.0.2
ping 10.0.0.2 # 能ping通
exit

在容器中ping 10.0.0.2也能ping通,说明设置正确

ping 10.0.0.2 # 应该不通
docker exec d344e6e05a99 ping 10.0.0.2 # 成功ping通

创建网桥,并把veth另一端的虚拟网卡加入新创建的网桥中:

sudo brctl addbr br0 # 创建新网桥br0
sudo brctl addif br0 veth_d344 # 把虚拟网卡加入网桥br0中
sudo ifconfig br0 10.0.0.1/24 # 设置网桥ip
sudo ip link set veth_d344 up # 启动虚拟网卡

测试下:

ping 10.0.0.2 # 成功ping通
docker exec d344e6e05a99 ping 10.0.0.1 # 成功ping通

若以上两个都能ping通说明配置成功!

最后,我们需要使得容器能够联外网,需要设置NAT,使用iptables设置:

sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o em1 -j MASQUERADE

设置容器默认路由为网桥ip(注意在容器内使用route add 添加, 会出现SIOCADDRT: Operation not permitted错误), 因此只能使用ip netns exec设置:

sudo ip netns exec 27383 route add default gw 10.0.0.1

测试,此时请确保宿主机能够联外网,进入容器内部:

ping baidu.com # 成功ping通,确保icmp没有被禁

转载于:https://www.cnblogs.com/int32bit/p/5310333.html

docker网络原理相关推荐

  1. 深入理解 Docker 网络原理

    作者 | 渡. 来源 | CSDN博客 Docker网络原理 容器是相对独立的环境,相当于一个小型的Linux系统,外界无法直接访问,那他是怎么做的呢,这里我们先了解下Linux veth pair. ...

  2. docker网络原理及cgroup

    docker网络模式的特性  docker初始状态下有三种默认的网络模式 ,bridg(桥接),host(主机),none(无网络设置) 网络模式                            ...

  3. docker 容器之间通信_四、Docker 网络原理、分类及容器互联配置

    本文是<Docker必知必会系列>第四篇,原文发布于个人博客:悟尘纪. 上一篇:Docker必知必会系列(三):基于 Docker-registry/Nexus3 搭建本地仓库 Docke ...

  4. 【云原生】Docker网络原理及Cgroup硬件资源占用控制

    内容预知 1.dockers的网络模式 获取容器的进程号 docker网络模式的特性 1.1 host主机模式 1.2  container模式 1.3  none模式 1.4 bridge 桥接模式 ...

  5. Docker集群(一) —— Docker网络及flannel介绍

    [摘要]本文介绍docker网络原理和设置,以及在docker集群中需要解决的问题.最后介绍flannel在解决docker网络问题中的作用. 1   基础 在介绍docker的网络之前,必须先认识d ...

  6. docker入门,镜像,容器,数据卷,dockerfile,docker网络,springboot微服务打包docker镜像[狂神yyds]

    docker学习大纲 docker概述 docker安装 docker命令 镜像命令 容器命令 操作命令 - docker镜像 容器数据卷 dockerfile docker网络原理 IDEA整合do ...

  7. Kubernetes容器网络(一):Flannel网络原理

    前言 本文主要分享Flannel如何解决跨主机容器之间通信问题的,如果你对主机内容器之间通信流程还不了解,建议先看下这篇文章:Docker网络原理 1.前置网络知识 1).tun/tap设备 tun/ ...

  8. 02@Docker网络介绍及网络模式的使用

    文章目录 Docker网络的介绍 一.Docker网络原理 1.docker网络介绍 2.Docker网络原理 二.docker网络基础 [网络命名空间] 1.Veth 设备对 2.网络原理实验的实现 ...

  9. 高级架构师_Docker_第2章_ Docker核心原理_ 第2节_Docker网络

    高级架构师_Docker_第2章_ Docker核心原理_ 第2节_Docker网络 文章目录 高级架构师_Docker_第2章_ Docker核心原理_ 第2节_Docker网络 Docker网络 ...

最新文章

  1. Java 二维数组的初始化
  2. Visual Studio Code 玩MS SQL
  3. POJ 3991 Seinfeld
  4. php进入文件目录,php文件目录操作
  5. 分类模型的衡量指标,召回率recall和准确率precision
  6. vs2008与oracle数据库连接
  7. java实现所有括号组合的遍历_括号正确嵌套问题的实现(Java)
  8. 正确使用计算机说课稿,计算机优秀说课稿讲课讲稿.pdf
  9. 起风了用计算机打,《起风了》计算机简谱
  10. JAVA-DDD项目结构
  11. Win8快速开关机的奥妙:假关机还是真休眠?
  12. 一夜之间就能肝完的学生信息管理系统
  13. 三子棋小游戏(经过轻微改编可变为五子棋)
  14. 日常使用的共享文件协议服务---FTP、NFS、SMB
  15. 玩安卓从 0 到 1 之架构思考
  16. 干货:服务器网卡组技术原理与实践
  17. 转发和重定向的区别(forward和redirect的区别)
  18. 边缘计算概念以及应用
  19. 自由浏览器 android,百度浏览器发布安卓6.1版 趣味视频弹幕吐槽不停
  20. 中标麒麟桌面版系统(V7.0)安装教程

热门文章

  1. 2020年华科计算机考研机试题答案(没弄懂题目的意思)
  2. php api 无符号整数基数为16的整数参数的字符串表示形式,php基础语法
  3. mysql 烂泥_烂泥:学习mysql的binlog配置
  4. mysql 替换 多个逗号_如何使用mySQL replace()替换多个记录中的字符串?
  5. ArrayList的泛型可以不写吗
  6. oracle 概要文件不存在,oracle 概要文件 - kecy1217的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
  7. 应用计算机测定线性电阻伏安特性实验器材,线性电阻与非线性电阻伏安特性实验的Origin处理...
  8. linux 关闭开机 ftp,解决linux ftp匿名上传、下载开机自启问题
  9. mysql讀取sql_SQL 2008连接读取mysql数据的方法
  10. android 命令启动服务,adb 命令