<commit_before>---
layout: post
title: "初识docker网络之桥接模式"
date: 2016-10-17
excerpt: "介绍docker四种网络模式中的桥接模式"
tags: [docker]
comments: true
---

在了解了docker的一般使用规则之后，笔者再次较为深入的研究了docker的桥接模式

## 桥接模式工作原理

### 在我们创建docker应用之后，docker会自动在我们的宿主机上生成一个docker0的网卡，可以认为该网卡是所有docker容器的管理网卡，然后一般会为这个网卡生成一个内网IP地址，并且在之后容器的创建中为容器分配该网段的地址。

## 桥接模式具体工作流程

桥接模式网络拓扑图:
![docker_network](../picture/docker_br_network.PNG)

在每个容器创建之后，docker会为容器自动分配一对虚拟网卡，veth pair设备。该设备会桥接到docker0的网卡上，类似于OVS的交换机原理。在这个通道中进行所有的信息传输。
一般为容器分配的网卡为eth0，主机分配的网卡为veth*。容器在桥接模式下创建成功之后，我们在宿主机上<code>ifconfig</code>命令就可以看到了。

## 通信流程
现在我们大致知道了，是在怎样的虚拟网卡中开始我们的通信。然后就是具体的通信流程。

* 假设我们的容器需要ping谷歌的IP地址，是怎么做到的那？
首先，在我们的容器中除了有网卡eth0,然后会在我们的容器中生成默认路由，到主机docker0.ICMP包根据默认路由到达docker0.docker0再根据本机SNAT规则将包转发给外网网卡，最终将包转发出去。




<commit_msg>完成docker桥接模式理解<commit_after>---
layout: post
title: "初识docker网络之桥接模式"
date: 2016-10-17
excerpt: "介绍docker四种网络模式中的桥接模式"
tags: [docker]
comments: true
---

在了解了docker的一般使用规则之后，笔者再次较为深入的研究了docker的桥接模式

## 桥接模式工作原理

### 在我们创建docker应用之后，docker会自动在我们的宿主机上生成一个docker0的网卡，可以认为该网卡是所有docker容器的管理网卡，然后一般会为这个网卡生成一个内网IP地址，并且在之后容器的创建中为容器分配该网段的地址。

## 桥接模式具体工作流程

桥接模式网络拓扑图:
![docker_network](../picture/docker_br_network.PNG)

在每个容器创建之后，docker会为容器自动分配一对虚拟网卡，veth pair设备。该设备会桥接到docker0的网卡上，类似于OVS的交换机原理。在这个通道中进行所有的信息传输。
一般为容器分配的网卡为eth0，主机分配的网卡为veth*。容器在桥接模式下创建成功之后，我们在宿主机上<code>ifconfig</code>命令就可以看到了。

## 通信流程
现在我们大致知道了，是在怎样的虚拟网卡中开始我们的通信。然后就是具体的通信流程。

* 容器发包 
假设我们的容器需要ping谷歌的IP地址，是怎么做到的那？
首先，在我们的容器中除了有网卡eth0,然后会在我们的容器中生成默认路由，到主机docker0.ICMP包根据默认路由到达docker0.docker0再将IP包发到宿主机的网卡上，最终将包转发出去。所有容器对外都是不可见的。感觉这个包就是宿主机自己发出去的一样。

* 容器收包
在知道了容器如何发包之后，简单理解一下容器是如何收包的。
在桥接模式下，所有的容器都需要端口映射，比如。我将容器的80端口映射到主机的8080端口。可以简单的理解，容器对外而言就只是宿主机的一个端口。当一个包到达宿主机8080端口之后，宿主机就知道这个包应该发到容器中去，所以将包发给docker0。再由docker0将包发到容器里面做出相应的措施。




{'fraction_non_alphanumeric': 0.09617547806524185, 'fraction_numerical': 0.023622047244094488, 'mean_word_length': 13.007874015748031, 'pattern_counts': {'":': 0, '<': 7, '<?xml version=': 0, '>': 7, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '6174480', 'n_tokens_mistral': 1408, 'n_tokens_neox': 1578, 'n_words': 56}