[TOC]
## 一 容器网络的类型
Docker 网络从覆盖范围可分为单个 host 上的容器网络和跨多个 host 的网络,多host网络又分为原生网络和第三方网络,如下:
* 原生单机网络
* None:不为容器配置任何网络功能,`--net=none
`
* Host:与主机共享Network Namespace,`--net=host
`
* Container:与另一个运行中的容器共享网络名称空间,`--net=container:ID
`
* Bridge:Docker设计的,默认的NAT网络模型,`--net=bridge`
* 原生多机网络
* overlay:基于vxlan的隧道网络
* macvlan:基于网卡虚拟化的大局域网
* 第三方多机网络[本章不讨论]
* flannel
* weave
* calico
> 原生网络和单机网络都是通过不同的driver来实现的,未来可能还会有更多的开源driver
## 二 原生单机网络
docker安装好后,默认会创建三个网络,分别是none,host和bridge,用docker network ls命令查看如下
```sh
[root@docker01 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3cb9e3ca4456 bridge bridge local
4cc3166d4351 host host local
f61ddbb4efdf none null local
```
### A. none网络
none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 `--network=none` 指定使用 none 网络。
```
docker run -it --rm --network=none centos:6.9
[root@5fa702165cb2 /]# ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
```
封闭意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。
比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。
### B. host网络
连接到 host 网络的容器共享 Docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过 `--network=host` 指定使用 host 网络。
在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host 的。
```
docker run -it --rm --network=host busybox
/ # hostname
docker01
/ # ip l|egrep ^[1-9]|awk '{print $1,$2}'
1: lo:
2: eth0:
3: docker0:
9: vethccf4863@if8:
```
Docker host 的网络最大的好处就是性能,如果容器对网络传输效率有较高要求,可以选择 host 网络,但要考虑端口冲突问题
另一个用途是让容器可以直接配置 host 网路。如某些跨 host 的网络解决方案,本身也是以容器方式运行的,需要对网络进行配置,比如管理 iptables
### C. Container网络
container网络严格来说并不是一种网络类型,因为它只是让一个容器使用主容器的网络名称空间,主容器的网络是什么类型都不影响
1. 创建主容器并查看网卡信息
```sh
docker run -d --name bbx --rm busybox sleep 900
[root@docker01 ~]# docker exec -it bbx ip a|egrep eth0|awk '{print $1,$2}'
34: eth0@if35:
inet 172.17.0.2/16
```
2. 创建新容器并使用主容器网络
```sh
[root@docker01 ~]# docker run --network=container:bbx busybox ip a|grep eth0|awk '{print $1,$2}'
34: eth0@if35:
inet 172.17.0.2/16
```
3. 用途说明
可以明显看出来,上诉两个容器使用的是同一个网卡,其他整个网络名称空间用的都是一个,用这种方式组织的容器,容器间通信十分便捷,效率也很高
## 三 **bridge 网络**
### A. bridge网络入门解释
如果不指定`--network`,创建的容器默认都会挂到 `docker0` 上,docker0是安装时创建的linux bridge网络(可以理解为NAT),可以用linux管理bridge的命令进行查看和管理
```sh
yum install bridge-utils
docker container rm -f `docker container ls -a -q`
[root@docker01 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024277f99a61 no
```
可以看到网桥docker0的信息,可以把docker0理解为一个虚拟交换机,现在这个交换机上没有接设备,我们启动一个容器看看结果
```sh
docker run -d --name bbx --rm busybox sleep 900
[root@docker01 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024277f99a61 no veth0652c67
```
交换机docker0已近连接了虚拟接口对(veth pair)的接口`veth0652c67`,该虚拟接口对的另一个接口连接到了刚刚新建的容器bbx中
>veth pair 是一种成对出现的特殊网络设备,可以想象成由一根虚拟网线连接起来的一对网卡,网卡的一头在容器中,另一头挂在网桥 `docker0` 上
```sh
[root@docker01 ~]# ip a|grep veth0652c67|awk '{print $1,$2}'
33: veth0652c67@if32:
[root@docker01 ~]# docker exec -it bbx sh
/ # ip a|grep eth0|awk '{print $1,$2}'
32: eth0@if33:
[root@docker01 ~]# docker network inspect bridge |grep -A1 Subnet
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
```
上面代码解释说明:
* docker主机中多了一块网卡,编号33,名称veth0652c67,对端网卡编号if32
* bbx容器中有一个网卡,编号32,名称eth0,对端网卡边哈if33,正好是一对
* 默认分配的IP地址段是`172.17.0.0/16`,网关IP就是docker0的IP
### B. bridge网络自定义
默认的bridge网络是自动创建的,已有的信息不能修改,但docker支持自定义新的bridge网络,子网段、网关、是否自动分配等都可以自定义
1. 创建简单的自定义bridge网络
```sh
docker network create --driver bridge noah_net
[root@docker01 ~]# brctl show
bridge name bridge id STP enabled interfaces
br-a83f1d0be49e 8000.0242e25e18d4 no
docker0 8000.024277f99a61 no
[root@docker01 ~]# docker network inspect noah_net |grep -A1 Subnet
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
```
2. 创建自定义网段的bridge网络
```sh
docker network create --driver bridge \
--subnet 192.168.4.0/24 \
--gateway 192.168.4.1 \
noah_net2
[root@docker01 ~]# docker network inspect noah_net2 |grep -A1 Subnet
"Subnet": "192.168.4.0/24",
"Gateway": "192.168.4.1"
```
3. 使用自定义网络创建容器
以上两个自定义网络创建好以后,创建容器时只要指定--network=xxx,就可以使用新的bridge网络了.
使用`--subnet`创建的网络,还可以通过--ip手动分配IP,非`--subnet`参数创建的网络不能手动分配IP,会报错
```sh
[root@docker01 ~]# docker run -it --rm --network=noah_net busybox ip addr|grep "172"
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
[root@docker01 ~]# docker run -it --rm --network=noah-net2 --ip 192.168.4.99 busybox ip addr|grep "192"
inet 192.168.4.99/24 brd 192.168.4.255 scope global eth0
```
### C. bridge网络之间通信
先说结论:
* 相同bridge网络下的容器互相之间可以通过IP通信
* 不同bridge网络下的容器互相之间不能通过IP通信
* 不同bridge网络之间不能通过添加路由解决通信问题
* iptables DROP 掉了不同bridge网络间的通信
基于以上原因,要解决不同bridge网络之间的通信问题,常用的解决办法就是为容器配置多个bridge的网卡,通过`docker network connect` 命令实现。
```sh
docker run -d --name bbx1 --network=noah_net busybox sleep 900
docker network connect noah-net2 bbx1
[root@docker01 ~]# docker exec -it bbx1 ip a|grep inet
inet 127.0.0.1/8 scope host lo
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
inet 192.168.4.2/24 brd 192.168.4.255 scope global eth1
[root@docker01 ~]# docker exec -it bbx1 ping -c1 192.168.4.1
PING 192.168.4.1 (192.168.4.1): 56 data bytes
64 bytes from 192.168.4.1: seq=0 ttl=64 time=0.192 ms
```
---
## 四 macvlan网络
### A. 什么是macvlan:
macvlan 本质上是一种网卡虚拟化技术
macvlan 本身是 linux kernel 模块,允许在同一个物理网卡上配置多个 MAC 地址,即多个 interface,每个 interface 可以配置自己的 IP。
使用macvlan可以实现容器跨主机通信:
### B. 创建macvlan:
首先需要再开一台虚拟机,创建好docker环境,然后两台机器都执行下列命令
```
docker network create --driver macvlan
--subnet 10.0.0.0/24
--gateway 10.0.0.254
-o parent=eth0 macvlan_1
```
>说明:docker不会为macvlan创建网关,所以这里的网关要事先存在
macvlan最好自己手动管理IP地址,不要自动分配,容易IP冲突
两台docker主机上分别创建容器测试:
1. docker01:
`docker run -it --network macvlan_1 --ip=10.0.0.111 busybox:latest /bin/sh
`
2. docker02:
`docker run -it --network macvlan_1 --ip=10.0.0.112 busybox:latest /bin/sh
`
## 五 overlay网络
overlay网络是基于 VxLAN 的 隧道网络,VxLAN 可将二层数据封装到 UDP 进行传输,VxLAN 提供与 VLAN 相同的以太网二层服务,但是拥有更强的扩展性和灵活性。
不同overlay网络是互相隔离的,要相互通信的话,也是需要把容器加入多个网络才行.
Docerk overlay 网络需要一个 key-value 数据库用于保存网络状态信息,包括 Network、Endpoint、IP 等。Consul、Etcd 和 ZooKeeper 都支持,这里使用 Consul。
### A. 环境准备工作
1. 分别修改docker配置文件
docker01、02上都增加如下配置在daemon.json文件中
```sh
vim /etc/docker/daemon.json
{
"cluster-store": "consul://10.0.0.11:8500",
"cluster-advertise": "10.0.0.12:2376"
}
systemctl daemon-reload
systemctl restart docker
# cluster-store是consul的地址
# cluster-advertise是自己的地址
```
2. docker01上运行consul
```sh
docker run -d -p 8500:8500 -h consul --name consul progrium/consul -server -bootstrap
```
运行成功后,可以访问consul的web页:http://10.0.0.11:8500/ui/#/dc1/kv/
### B. overlay网络功能测试
1. 创建overlay网络(任意主机)
由于overlay信息会写入数据库,所以在docker02上创建overlay网络,docker01上是可以看到的
```sh
[root@docker02 ~]# docker network create -d overlay olay-1
[root@docker01 ~]# docker network ls|grep olay-1
bda0ae8345d8 olay-1 overlay global
[root@docker01 ~]# docker network inspect olay-1|grep -A1 Subnet
"Subnet": "10.0.1.0/24",
"Gateway": "10.0.1.1"
```
2. 启动容器测试
```sh
[root@docker01 ~]# docker run --rm --network olay-1 busybox ip a s|grep inet
inet 127.0.0.1/8 scope host lo
inet 10.0.1.2/24 brd 10.0.1.255 scope global eth0
inet 172.19.0.2/16 brd 172.19.255.255 scope global eth1
[root@docker02 ~]# docker run --rm --network olay-1 busybox ip a s|grep inet
inet 127.0.0.1/8 scope host lo
inet 10.0.1.2/24 brd 10.0.1.255 scope global eth0
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth1
```
3. 测试结果说明
上面的结果中,每个容器都分别有eth0和eth1两个网卡,其中eth0属于overlay网络,用于跨主机通信,eth1用于与宿主机通信
overlay网络支持docker dns server,支持使用容器名进行通信
### B. overlay IPAM
docker 默认为 overlay 网络分配 24 位掩码的子网(10.0.X.0/24),所有主机共享这个 subnet,容器启动时会顺序从此空间分配 IP。当然我们也可以通过`--subnet`指定 IP 空间。
```
docker network create -d overlay --subnet 10.22.1.0/24 ov_net3
```
- shell编程
- 变量1-规范-环境变量-普通变量
- 变量2-位置-状态-特殊变量
- 变量3-变量子串
- 变量4-变量赋值三种方法
- 变量5-数组相关
- 计算1-数值计算命令和案例
- 计算2-expr命令举例
- 计算3-条件表达式和各种操作符
- 计算4-条件表达式和操作符案例
- 循环1-函数的概念与作用
- 循环2-if与case语法
- 循环3-while语法
- 循环4-for循环
- 其他1-判断传入的参数为0或整数的多种思路
- 其他2-while+read按行读取文件
- 其他3-给输出内容加颜色
- 其他4-shell脚本后台运行知识
- 其他5-6种产生随机数的方法
- 其他6-break,continue,exit,return区别
- if语法案例
- case语法案例
- 函数语法案例
- WEB服务软件
- nginx相关
- 01-简介与对比
- 02-日志说明
- 03-配置文件和虚拟主机
- 04-location模块和访问控制
- 05-status状态模块
- 06-rewrite重写模块
- 07-负载均衡和反向代理
- 08-反向代理监控虚拟IP地址
- nginx与https自签发证书
- php-nginx-mysql联动
- Nginx编译安装[1.12.2]
- 案例
- 不同客户端显示不同信息
- 上传和访问资源池分离
- 配置文件
- nginx转发解决跨域问题
- 反向代理典型配置
- php相关
- C6编译安装php.5.5.32
- C7编译php5
- C6/7yum安装PHP指定版本
- tomcxat相关
- 01-jkd与tomcat部署
- 02-目录-日志-配置文件介绍
- 03-tomcat配置文件详解
- 04-tomcat多实例和集群
- 05-tomcat监控和调优
- 06-Tomcat安全管理规范
- show-busy-java-threads脚本
- LVS与keepalived
- keepalived
- keepalived介绍和部署
- keepalived脑裂控制
- keepalived与nginx联动-监控
- keepalived与nginx联动-双主
- LVS负载均衡
- 01-LVS相关概念
- 02-LVS部署实践-ipvsadm
- 03-LVS+keepalived部署实践
- 04-LVS的一些问题和思路
- mysql数据库
- 配置和脚本
- 5.6基础my.cnf
- 5.7基础my.cnf
- 多种安装方式
- 详细用法和命令
- 高可用和读写分离
- 优化和压测
- docker与k8s
- docker容器技术
- 1-容器和docker基础知识
- 2-docker软件部署
- 3-docker基础操作命令
- 4-数据的持久化和共享互连
- 5-docker镜像构建
- 6-docker镜像仓库和标签tag
- 7-docker容器的网络通信
- 9-企业级私有仓库harbor
- docker单机编排技术
- 1-docker-compose快速入门
- 2-compose命令和yaml模板
- 3-docker-compose命令
- 4-compose/stack/swarm集群
- 5-命令补全和资源限制
- k8s容器编排工具
- mvn的dockerfile打包插件
- openstack与KVM
- kvm虚拟化
- 1-KVM基础与快速部署
- 2-KVM日常管理命令
- 3-磁盘格式-快照和克隆
- 4-桥接网络-热添加与热迁移
- openstack云平台
- 1-openstack基础知识
- 2-搭建环境准备
- 3-keystone认证服务部署
- 4-glance镜像服务部署
- 5-nova计算服务部署
- 6-neutron网络服务部署
- 7-horizon仪表盘服务部署
- 8-启动openstack实例
- 9-添加计算节点流程
- 10-迁移glance镜像服务
- 11-cinder块存储服务部署
- 12-cinder服务支持NFS存储
- 13-新增一个网络类型
- 14-云主机冷迁移前提设置
- 15-VXALN网络类型配置
- 未分类杂项
- 部署环境准备
- 监控
- https证书
- python3.6编译安装
- 编译安装curl[7.59.0]
- 修改Redhat7默认yum源为阿里云
- 升级glibc至2.17
- rabbitmq安装和启动
- rabbitmq多实例部署[命令方式]
- mysql5.6基础my.cnf
- centos6[upstart]/7[systemd]创建守护进程
- Java启动参数详解
- 权限控制方案
- app发包仓库
- 版本发布流程
- elk日志系统
- rsyslog日志统一收集系统
- ELK系统介绍及YUM源
- 快速安装部署ELK
- Filebeat模块讲解
- logstash的in/output模块
- logstash的filter模块
- Elasticsearch相关操作
- ES6.X集群及head插件
- elk收集nginx日志(json格式)
- kibana说明-汉化-安全
- ES安装IK分词器
- zabbix监控
- zabbix自动注册模板实现监控项自动注册
- hadoop大数据集群
- hadoop部署
- https证书
- certbot网站
- jenkins与CI/CD
- 01-Jenkins部署和初始化
- 02-Jenkins三种插件安装方式
- 03-Jenkins目录说明和备份
- 04-git与gitlab项目准备
- 05-构建自由风格项目和相关知识
- 06-构建html静态网页项目
- 07-gitlab自动触发项目构建
- 08-pipelinel流水线构建项目
- 09-用maven构建java项目
- iptables
- 01-知识概念
- 02-常规命令实战
- 03-企业应用模板
- 04-企业应用模板[1键脚本]
- 05-企业案例-共享上网和端口映射
- SSH与VPN
- 常用VPN
- VPN概念和常用软件
- VPN之PPTP部署[6.x][7.x]
- 使用docker部署softether vpn
- softEther-vpn静态路由表推送
- SSH服务
- SSH介绍和部署
- SSH批量分发脚本
- 开启sftp日志并限制sftp访问目录
- sftp账号权限分离-开发平台
- ssh配置文件最佳实践
- git-github-gitlab
- git安装部署
- git详细用法
- github使用说明
- gitlab部署和使用
- 缓存数据库
- zookeeper草稿
- mongodb数据库系列
- mongodb基本使用
- mongodb常用命令
- MongoDB配置文件详解
- mongodb用户认证管理
- mongodb备份与恢复
- mongodb复制集群
- mongodb分片集群
- docker部署mongodb
- memcached
- memcached基本概念
- memcached部署[6.x][7.x]
- memcached参数和命令
- memcached状态和监控
- 会话共享和集群-优化-持久化
- memcached客户端-web端
- PHP测试代码
- redis
- 1安装和使用
- 2持久化-事务-锁
- 3数据类型和发布订阅
- 4主从复制和高可用
- 5redis集群
- 6工具-安全-pythonl连接
- redis配置文件详解
- 磁盘管理和存储
- Glusterfs分布式存储
- GlusterFS 4.1 版本选择和部署
- Glusterfs常用命令整理
- GlusterFS 4.1 深入使用
- NFS文件存储
- NFS操作和部署
- NFS文件系统-挂载和优化
- sersync与inotify
- rsync同步服务
- rsyncd.conf
- rsync操作和部署文档
- rsync常见错误处理
- inotify+sersync同步服务
- inotify安装部署
- inotify最佳脚本
- sersync安装部署
- 时间服务ntp和chrony
- 时间服务器部署
- 修改utc时间为cst时间
- 批量操作与自动化
- cobbler与kickstart
- KS+COBBLER文件
- cobbler部署[7.x]
- kickstart部署[7.x]
- kickstar-KS文件和语法解析
- kickstart-PXE配置文件解析
- 自动化之ansible
- ansible部署和实践
- ansible剧本编写规范
- 配置文件示例
- 内网DNS服务
- 压力测试
- 压测工具-qpefr测试带宽和延时