docker网络原理
以下内容引用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网络原理相关推荐
- 深入理解 Docker 网络原理
作者 | 渡. 来源 | CSDN博客 Docker网络原理 容器是相对独立的环境,相当于一个小型的Linux系统,外界无法直接访问,那他是怎么做的呢,这里我们先了解下Linux veth pair. ...
- docker网络原理及cgroup
docker网络模式的特性 docker初始状态下有三种默认的网络模式 ,bridg(桥接),host(主机),none(无网络设置) 网络模式 ...
- docker 容器之间通信_四、Docker 网络原理、分类及容器互联配置
本文是<Docker必知必会系列>第四篇,原文发布于个人博客:悟尘纪. 上一篇:Docker必知必会系列(三):基于 Docker-registry/Nexus3 搭建本地仓库 Docke ...
- 【云原生】Docker网络原理及Cgroup硬件资源占用控制
内容预知 1.dockers的网络模式 获取容器的进程号 docker网络模式的特性 1.1 host主机模式 1.2 container模式 1.3 none模式 1.4 bridge 桥接模式 ...
- Docker集群(一) —— Docker网络及flannel介绍
[摘要]本文介绍docker网络原理和设置,以及在docker集群中需要解决的问题.最后介绍flannel在解决docker网络问题中的作用. 1 基础 在介绍docker的网络之前,必须先认识d ...
- docker入门,镜像,容器,数据卷,dockerfile,docker网络,springboot微服务打包docker镜像[狂神yyds]
docker学习大纲 docker概述 docker安装 docker命令 镜像命令 容器命令 操作命令 - docker镜像 容器数据卷 dockerfile docker网络原理 IDEA整合do ...
- Kubernetes容器网络(一):Flannel网络原理
前言 本文主要分享Flannel如何解决跨主机容器之间通信问题的,如果你对主机内容器之间通信流程还不了解,建议先看下这篇文章:Docker网络原理 1.前置网络知识 1).tun/tap设备 tun/ ...
- 02@Docker网络介绍及网络模式的使用
文章目录 Docker网络的介绍 一.Docker网络原理 1.docker网络介绍 2.Docker网络原理 二.docker网络基础 [网络命名空间] 1.Veth 设备对 2.网络原理实验的实现 ...
- 高级架构师_Docker_第2章_ Docker核心原理_ 第2节_Docker网络
高级架构师_Docker_第2章_ Docker核心原理_ 第2节_Docker网络 文章目录 高级架构师_Docker_第2章_ Docker核心原理_ 第2节_Docker网络 Docker网络 ...
最新文章
- Java 二维数组的初始化
- Visual Studio Code 玩MS SQL
- POJ 3991 Seinfeld
- php进入文件目录,php文件目录操作
- 分类模型的衡量指标,召回率recall和准确率precision
- vs2008与oracle数据库连接
- java实现所有括号组合的遍历_括号正确嵌套问题的实现(Java)
- 正确使用计算机说课稿,计算机优秀说课稿讲课讲稿.pdf
- 起风了用计算机打,《起风了》计算机简谱
- JAVA-DDD项目结构
- Win8快速开关机的奥妙:假关机还是真休眠?
- 一夜之间就能肝完的学生信息管理系统
- 三子棋小游戏(经过轻微改编可变为五子棋)
- 日常使用的共享文件协议服务---FTP、NFS、SMB
- 玩安卓从 0 到 1 之架构思考
- 干货:服务器网卡组技术原理与实践
- 转发和重定向的区别(forward和redirect的区别)
- 边缘计算概念以及应用
- 自由浏览器 android,百度浏览器发布安卓6.1版 趣味视频弹幕吐槽不停
- 中标麒麟桌面版系统(V7.0)安装教程
热门文章
- 2020年华科计算机考研机试题答案(没弄懂题目的意思)
- php api 无符号整数基数为16的整数参数的字符串表示形式,php基础语法
- mysql 烂泥_烂泥:学习mysql的binlog配置
- mysql 替换 多个逗号_如何使用mySQL replace()替换多个记录中的字符串?
- ArrayList的泛型可以不写吗
- oracle 概要文件不存在,oracle 概要文件 - kecy1217的个人空间 - 51Testing软件测试网 51Testing软件测试网-软件测试人的精神家园...
- 应用计算机测定线性电阻伏安特性实验器材,线性电阻与非线性电阻伏安特性实验的Origin处理...
- linux 关闭开机 ftp,解决linux ftp匿名上传、下载开机自启问题
- mysql讀取sql_SQL 2008连接读取mysql数据的方法
- android 命令启动服务,adb 命令