006.Docker网络管理
一 docker网络模式
1.1 四种模式
- host模式
- container模式
- none模式
- bridge模式
root@docker:~# docker network ls #默认已经创建好三种模式,且无法删除
NETWORK ID NAME DRIVER SCOPE
4237839afd99 bridge bridge local
c7a14aafc3b5 host host local
3cc2eba3eb5f none null local
1.2 host模式
- host模式下的容器没有隔离的 network namespace;
- 容器的 IP 地址同 Docker host 的 IP 地址;
- 需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突;
- host 模式能够和其它模式共存。

root@docker:~# docker run -d --name docker_host1 --network host training/webapp python app.py
root@docker:~# docker exec -it docker_host1 /bin/bash
root@docker:/opt/webapp# ifconfig -a

1.3 container模式

root@docker:~# docker run -dit --name docker_host2 centos7-xhy /bin/bash
root@docker:~# docker run -dit --name docker_host3 --network container:docker_host2 centos7-xhy /bin/bash
root@docker:~# docker exec -it docker_host2 /bin/bash
[root@c9b51e88f75a /]# ifconfig -a

root@docker:~# docker exec -it docker_host3 /bin/bash
[root@c9b51e88f75a /]# ifconfig -a

1.4 none模式
root@docker:~# docker run -dit --name docker_host4 --network none centos7-xhy /bin/bash
root@docker:~# docker exec -it docker_host4 /bin/bash

1.5 bridge模式
二 bridge模式
2.1 bridge模式简介
root@docker:~# iptables -t nat -vnL


2.2 bridge模式特点
- 使用一个 linux bridge,默认为 docker0;
- 使用 veth 对,一端在容器的网络 namespace 中,另一端在 docker0 上;
- 该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内;
- Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的网络可以主动将网络报文发送至容器内部;
- 外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port;
- NAT 模式基于三层网络上的实现方式,故肯定会影响网络的传输效率;
- 容器拥有独立、隔离的网络栈,以便于使得容器和宿主机以外的网络通过NAT建立通信;

root@docker:~# docker run -dit --name docker_host5 -p 5005:80 training/webapp python app.py
root@docker:~# docker exec -it docker_host5 /bin/bash
root@951e6cd51cd0:/opt/webapp# ifconfig -a

root@docker:~# iptables -t nat -vnL #查看端口映射

root@docker:~# iptables-save
……
-A POSTROUTING -s 172.17.0.3/32 -d 172.17.0.3/32 -p tcp -m tcp --dport 80 -j MASQUERADE
……
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 5005 -j DNAT --to-destination 172.17.0.3:80
三 docker容器的DNS和主机名
3.1 DNS和主机名配置文件
root@docker:~# docker run -dit --name docker_host6 centos7-xhy /bin/bash
root@docker:~# docker exec -it docker_host6 /bin/bash
[root@12ac200c6a4c /]# mount
...
/dev/sda4 on /etc/resolv.conf type ext4 (rw,relatime,data=ordered)
/dev/sda4 on /etc/hostname type ext4 (rw,relatime,data=ordered)
/dev/sda4 on /etc/hosts type ext4 (rw,relatime,data=ordered)
...
3.2 修改dns和主机名
- -h HOSTNAME 或 --hostname=HOSTNAME:设置容器的主机名,此名称会写入/etc/hostname和/etc/hosts文件中,也会在容器的bash提示符看到。但是在外部,容器的主机名是无法查看的,不会出现在其他容器的hosts文件中,即使使用docker ps命令也无法查看。此参数是docker run命令的参数,而非docker daemon的启动参数。
- --dns=IP_ADDRESS...:为容器配置DNS,写入/etc/resolv.conf中。该参数可以在docker daemon 启动的时候设置,也可以在docker run时设置,默认为8.8.8.8或8.8.4.4。
四 多节点docker网络
- 直接路由方式;
- 桥接方式(如pipework);
- Overlay隧道方式(如flannel、ovs+gre)等。
- 一类是基于 VxLAN ,对跨节点网络的原生支持;
- 另一种是通过插件(plugin)方式引入的第三方实现方案,比如 Flannel,Calico 等等。
4.1 直接路由方式
4.2 桥接-pipework方式

root@docker01:~# apt-get install bridge-utils #两台docker宿主机都建议安装此工具
root@docker02:~# apt-get install bridge-utils #两台docker宿主机都建议安装此工具
root@docker01:~# docker run -dit --name container01 --net=none centos:7 /bin/bash
root@docker01:~# docker run -dit --name container02 --net=none centos:7 /bin/bash
root@docker02:~# docker run -dit --name container03 --net=none centos:7 /bin/bash
root@docker02:~# docker run -dit --name container04 --net=none centos:7 /bin/bash root@docker01:~# git clone https://github.com/jpetazzo/pipework
root@docker02:~# git clone https://github.com/jpetazzo/pipework
root@docker01:~# cp pipework/pipework /usr/local/bin/
root@docker02:~# cp pipework/pipework /usr/local/bin/
root@docker01:~# chmod u+x /usr/local/bin/pipework
root@docker01:~# brctl show #查看当前默认的桥接网卡

root@docker01:~# pipework br0 container01 172.24.8.201/24@172.24.8.2
root@docker01:~# pipework br0 container02 172.24.8.202/24@172.24.8.2
root@docker02:~# pipework br0 container03 172.24.8.203/24@172.24.8.2
root@docker02:~# pipework br0 container04 172.24.8.204/24@172.24.8.2
root@docker01:~# brctl show

root@docker02:~# brctl show

- 查看主机是否包含br0(可以自定义)网桥,如果不存在就创建;
- 向容器实例添加一块网卡(可以设置网卡名),并配置相应的固定IP;
- 若容器实例已经有默认的路由,则删除掉,将@后面的IP设置为默认路由的网关;
- 将容器实例连接到创建的br0网桥上。
root@docker01:~# docker network create --driver bridge --subnet 172.24.8.0/24 --gateway 172.24.8.2 br1
root@docker:~# docker network inspect br1

root@docker01:~# ip addr add 172.24.8.90/24 dev br0;\
ip addr del 172.24.8.90/24 dev eth0;\
brctl addif br0 eth0;\
ip route del default;\
ip route add default via 172.24.8.2 dev br0
root@docker02:~# ip addr add 172.24.8.91/24 dev br0 ;\
ip addr del 172.24.8.91/24 dev eth0;\
brctl addif br0 eth0;\
ip route del default;\
ip route add default via 172.24.8.2 dev br0


root@docker01:~# ping 172.24.8.201

4.3 基于etcd Docker原生overlay网络
4.4 基于Flannel的overlay网络
006.Docker网络管理的更多相关文章
- Docker网络管理机制实例解析+创建自己Docker网络
实例解析Docker网络管理机制(bridge network,overlay network),介绍Docker默认的网络方式,并创建自己的网络桥接方式,将开发的容器添加至自己新建的网络,提高Doc ...
- docker 实践十:docker 网络管理
本篇是关于 docker 网络管理的内容,同时也包含了 docker 网络的高级应用. 注:环境为 CentOS7,docker 19.03. docker 网络基础 docker 网络模型 在 do ...
- Docker 网络管理及容器跨主机通信
1.网络模式 docker支持四种网络模式,使用--net选项指定: host,--net=host,如果指定此模式,容器将不会获得一个独立的network namespace,而是和宿主机共用一个. ...
- Docker网络管理
一.Docker的四种网络模式(host.container.none.bridge) 1. host模式,使用docker run时使用--net=host指定,docker使用的网络实际上和宿主机 ...
- Docker网络管理-外部访问容器
注意:这里使用的方法是端口映射,需要说明的是端口映射是在容器启动的时候才能完成端口映射的. 1,搭建1个web服务器,让外部机器访问. docker run -itd centos /bin/bash ...
- Docker系统六:Docker网络管理
Docker网络 I. Docer的通信方式 默认情况下,Docker使用网桥(brige)+ NAT的通信模型. Docker启动时会自动创建网桥Docker0,并配置ip 172.17.0.1/1 ...
- Docker入门 - 006 Docker 多种数据库的安装
Docker 安装 MySQL 查找Docker Hub上的mysql镜像 root@VM_16_14_centos ~# docker search mysql INDEX NAME DESCRIP ...
- Docker 网络管理
网络模式 容器网络访问原理 桥接宿主机网络和配置固定IP地址 Docker 支持五种网络模式: 1.网络模式: --net 1.1 bridge 默认网络,Docker启动后默认创建一个docke ...
- ubuntu-docker入门到放弃(五)docker网络管理
查看docker宿主机的网卡信息我们会发现,有一个docker0的网卡,这个网卡就是用于跟docker容器进行通讯的,这个网段跟我们docker容器的网段是一样的: #ifconfig docker容 ...
随机推荐
- html5移动端页面分辨率设置及相应字体大小设置的靠谱使用方式
对于html5移动端网页编写CSS网上有很多介绍的文章,但在实际使用过程中还是会纠结. 网上的资料太多,且大多都是技术介绍型,特别是针对android上,网上写的各种麻烦,各种复杂,各种不接地气儿.. ...
- C++ vector 使用笔记
map 插入 vector #include <string> #include <iostream> #include <algorithm> #include ...
- swift计算 switch case
var year = var month = var day = ; let daysOfFeb = year % == && year% != || year % == ?: var ...
- python3爬虫二
1.获取列表页文章url集合: scrapy shell http://blog.jobbole.com/all-posts/ response.css('div.post-meta a.archiv ...
- 【黑客免杀攻防】读书笔记8 - 软件逆向工程基础2(if-else,三目运算符)
0x1 if-else分支 if-else分支4种状态 1.1 以常量为判断条件的简单if-else分支 C源代码: 单层if-else判断,常量为判断条件 int _tmain(int argc, ...
- 梯度优化算法总结以及solver及train.prototxt中相关参数解释
参考链接:http://sebastianruder.com/optimizing-gradient-descent/ 如果熟悉英文的话,强烈推荐阅读原文,毕竟翻译过程中因为个人理解有限,可能会有谬误 ...
- The videobuf2 API【转】
转自:https://blog.csdn.net/paul_liao/article/details/8986999 The videobuf2 API Author:CJOK Contact:cjo ...
- 在try-catch机制优化IO流关闭时,OutputStreamWriter 数据流被截断
1.前言 try-catch常规的格式是try{……}catch(){……}finallly{……},如果优化成try(……){……}catch(){……}finallly{……},此时流就可以自动关 ...
- mysql 5.6 在线 DDL
原文链接地址:http://seanlook.com/2016/05/24/mysql-online-ddl-concept/ 做MySQL的都知道,数据库操作里面,DDL操作(比如CREATE,DR ...
- Laravel API 限速异常 HTTPException Too Many Attemps
最近线上 Laravel 错误日志发现了一个异常 HTTPException Too Many Attemps 而我一个同事在本地开发的过程中也频繁遇到这个异常.测试环境:Laravel 5.5. 网 ...