本章内容

1.dokcer默认自带的几种网络介绍

2. 自定义网络

3. 容器间通信

4. 容器与外界交互

docker网络分为单个主机上的容器网络和多个主机上的哇网络,本文主要讲解单个主机上的容器网络。

1. dokcer默认自带的几种网络介绍

一、none

二、host

三、bridge

可以使用如下命令进行查看

[root@ken1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
d8cf2efc8881 bridge bridge local
2fb7c9abfab5 host host local
d300d17755a4 none null local

一、none网络

none网络没有网络,只有lo即本地地址,没有任何的网卡。创建容器时可以使用--network=none来指定none网络:

[root@ken1 ~]# docker run --network=none -it busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever

none网络的应用场景主要是用于对于安全性要求比较高的场景。

二、host网络

连接到host的网络的容器共享主机的网络栈,容器的网络配置与宿主机完全一样,创建容器时可以通过--network=host指定使用host网络:

[root@ken1 ~]# docker run --network=host -it busybox
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast qlen
link/ether :0c::2d:5b:b8 brd ff:ff:ff:ff:ff:ff
inet 172.20.10.2/ brd 172.20.10.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 :84e1::da2a:20c:29ff:fe2d:5bb8/ scope global dynamic
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe2d:5bb8/ scope link
valid_lft forever preferred_lft forever
: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu qdisc noqueue qlen
link/ether :::da:: brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/ brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
: virbr0-nic: <BROADCAST,MULTICAST> mtu qdisc pfifo_fast master virbr0 qlen
link/ether :::da:: brd ff:ff:ff:ff:ff:ff
: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue
link/ether ::::: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/ brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80:::59ff:fe83:/ scope link
valid_lft forever preferred_lft forever
: vetha2d50be@if34: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue master docker0
link/ether 3e:ba:6b::3a:e6 brd ff:ff:ff:ff:ff:ff
inet6 fe80::3cba:6bff:fe44:3ae6/ scope link
valid_lft forever preferred_lft forever

并且hostname也是宿主机的

/ # hostname
ken1

直接使用主机的网络最大的好处就是性能,如果容器对网络传输效率有较高的要求,则可以选择宿主机的网络。但是需要考虑端口冲突的问题,宿主机已经使用的端口就不能再用了。

三、bridge网络

docker安装时会创建一个docker0的linux brdge。如果不指定--network,创建的容器more都会挂到docker0上:

[root@ken1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024259833389 no
virbr0 .525400da7083 yes virbr0-nic

当前的docker0上interfaces处没有任何其他的网络设备,我们创建一个容器看看有什么变化:

[root@ken1 ~]# docker run -it busybox
/ #

[root@ken1 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.024259833389 no vethca1bd59
virbr0 8000.525400da7083 yes virbr0-nic

再来看一下网卡信息

[root@ken1 ~]# ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue state UNKNOWN group default qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
inet6 ::/ scope host
valid_lft forever preferred_lft forever
: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc pfifo_fast state UNKNOWN group default qlen
link/ether :0c::2d:5b:b8 brd ff:ff:ff:ff:ff:ff
inet 172.20.10.2/ brd 172.20.10.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 :84e1::da2a:20c:29ff:fe2d:5bb8/ scope global mngtmpaddr dynamic
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe2d:5bb8/ scope link
valid_lft forever preferred_lft forever
: virbr0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu qdisc noqueue state DOWN group default qlen
link/ether :::da:: brd ff:ff:ff:ff:ff:ff
inet 192.168.122.1/ brd 192.168.122.255 scope global virbr0
valid_lft forever preferred_lft forever
: virbr0-nic: <BROADCAST,MULTICAST> mtu qdisc pfifo_fast master virbr0 state DOWN group default qlen
link/ether :::da:: brd ff:ff:ff:ff:ff:ff
: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue state UP group default
link/ether ::::: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/ brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80:::59ff:fe83:/ scope link
valid_lft forever preferred_lft forever
: vethca1bd59@if40: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu qdisc noqueue master docker0 state UP group default
link/ether ca::1f:2a:2a:3d brd ff:ff:ff:ff:ff:ff link-netnsid
inet6 fe80::c882:1fff:fe2a:2a3d/ scope link
valid_lft forever preferred_lft forever

使用ip a可以发现我们每启动一个容器相关的网卡信息也都会显示出来。

我们启动了一个容器,产生了一个新的网络接口vethca1bd59被挂到了docker0上,vethca1bd59就是新创建容器的虚拟网卡。下面看一下容器的网络配置:

[root@ken1 ~]# docker run -it busybox
/ #
/ # ip a
: lo: <LOOPBACK,UP,LOWER_UP> mtu qdisc noqueue qlen
link/loopback ::::: brd :::::
inet 127.0.0.1/ scope host lo
valid_lft forever preferred_lft forever
: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu qdisc noqueue
link/ether ::ac::: brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/ brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever

容器有一个网卡eth0@if41,实际上eth0@if41和vethccd6a69是一对veth pair。veth pair是一种成对出现的椰树网络设备,可以把它想象成一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if41)在容器中,另一头(vethca1bd59)挂在docker0上,其效果就是将eth0@if41也挂在了docker0上。

可以看到eth0@if41已经配置开了IP 172.17.0.3,那为什么会是这个网段那?可以通过如下的命令查看网络的配置信息:

[root@ken1 ~]# docker network inspect bridge
[
{
"Name": "bridge",
"Id": "d8cf2efc88817902c3a1c8fff7adb22194ee3c78a427bda5b0543987c1db1bd7",
"Created": "2019-01-26T20:27:17.164824695+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
...

原来beidge网络配置的subnet就是172.17.0.0/16,并且网关是172.17.0.1,其实这个网关就是docker0.

容器创建时,docker会自动从172.17.0.0/16中分配一个IP。

2. 自定义网络

除了none,host,bridge这三个自动创建的网络,用户也可以根据业务需要创建 user-defined 网络。

Docker 提供三种 user-defined 网络驱动:bridge, overlay 和 macvlan。overlay 和 macvlan 用于创建跨主机的网络,后面单独讨论。

我们可通过 bridge 驱动创建类似前面默认的 bridge 网络,例如:

新增了一个网桥 br-e2e6bf5189a6,这里 br-e2e6bf5189a6 正好新建 bridge 网络ken 的短 id。执行 docker network inspect 查看一下 my_net 的配置信息:

这里 172.19.0.0/16 是 Docker 自动分配的 IP 网段。

我们可以自己指定 IP 网段吗?
答案是:可以。

只需在创建网段时指定 --subnet 和 --gateway 参数:

[root@ken1 ~]# docker network  create --driver bridge --subnet 172.21.0.0/ --gateway 172.21.0.1 ken3
504f7cd9a219ebad812a673f86fef67b2e5d20fd388a56854d055f807cb415e3

查看网络

容器要使用新的网络,需要在启动时通过 --network 指定:

到目前为止,容器的 IP 都是 docker 自动从 subnet 中分配,我们能否指定一个静态 IP 呢?

答案是:可以,通过--ip指定。

注:只有使用 --subnet 创建的网络才能指定静态 IP

3. 容器间通信

容器之间可通过 IP,Docker DNS Server 或 joined 容器三种方式通信。

我们接下来启动两个容器并且指定同一个网络验证是否可以通信:

可见同一网络中的容器、网关之间都是可以通信的。

再ping一个不是同一个网段 的容器:

显然是不能通信的,那如何实现不同网段之间的容器间的通信那?

答案是:为 另外一个 容器添加一块 ken3的网卡。这个可以通过docker network connect 命令实现。

[root@ken1 ~]# docker network connect ken3 dc4c1258f267

查看网络信息

容器中增加了一块网卡eth1,分配了ken3的IP,现在两个容器之间就可以访问了。

从上面的列子可以得出这样一个结论:两个容器要能通信,必须要有属于同一个网络的网卡。

满足这个条件后,容器就可以通过 IP 交互了。具体做法是在容器创建时通过 --network 指定相应的网络,或者通过 docker network connect 将现有容器加入到指定网络。

Docker DNS Server

通过 IP 访问容器虽然满足了通信的需求,但还是不够灵活。因为我们在部署应用之前可能无法确定 IP,部署之后再指定要访问的 IP 会比较麻烦。对于这个问题,可以通过 docker 自带的 DNS 服务解决。

从 Docker 1.10 版本开始,docker daemon 实现了一个内嵌的 DNS server,使容器可以直接通过“容器名”通信。方法很简单,只要在启动时用 --name 为容器命名就可以了。

使用 docker DNS 有个限制:只能在 user-defined 网络中使用。也就是说,默认的 bridge 网络是无法使用 DNS 的。下面验证一下:

joined容器

joined 容器是另一种实现容器间通信的方式。

joined 容器非常特别,它可以使两个或多个容器共享一个网络栈,共享网卡和配置信息,joined 容器之间可以通过 127.0.0.1 直接通信。请看下面的例子:

先创建一个 busybox 容器,名字为 web1。

[root@ken1 ~]# docker run --rm -it --name=web1 busybox
/ #

查看信息

然后创建 busybox 容器并通过 --network=container:web1 指定 jointed 容器为 web1:

看!busybox 和 web1 的网卡 mac 地址与 IP 完全一样,它们共享了相同的网络栈。busybox 可以直接用 127.0.0.1 访问 web1。

joined 容器非常适合以下场景:

  1. 不同容器中的程序希望通过 loopback 高效快速地通信,比如 web server 与 app server。

  2. 希望监控其他容器的网络流量,比如运行在独立容器中的网络监控程序。

4. 容器与外界交互

容器访问外部世界:

只要宿主机可以访问外网,默认容器是可以访问外网的:

外部世界访问容器:

即端口映射详情参考我之前的文章《Docker端口映射及创建镜像演示(二)--技术流ken

Docker网络(五)--技术流ken的更多相关文章

  1. Docker端口映射及创建镜像演示(二)--技术流ken

    前言 在上一篇博客<Docker介绍及常用操作演示--技术流ken>中,已经详细介绍了docker相关内容以及有关镜像和容器的使用命令演示. 现在我们已经可以自己下载镜像,以及创建容器了. ...

  2. Docker之使用Dockerfile创建定制化镜像(四)--技术流ken

    前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...

  3. Docker数据卷Volume实现文件共享、数据迁移备份(三)--技术流ken

    前言 前面已经写了两篇关于docker的博文了,在工作中有关docker的基本操作已经基本讲解完了.相信现在大家已经能够熟练配置docker以及使用docker来创建镜像以及容器了.本篇博客将会讲解如 ...

  4. 五分钟彻底学会iptables防火墙--技术流ken

    iptables简介 IPTABLES 是与最新的 3.5 版本 Linux内核集成的 IP 信息包过滤系统.如果 Linux 系统连接到因特网或 LAN.服务器或连接 LAN 和因特网的代理服务器, ...

  5. 网站集群架构(LVS负载均衡、Nginx代理缓存、Nginx动静分离、Rsync+Inotify全网备份、Zabbix自动注册全网监控)--技术流ken

    前言 最近做了一个不大不小的项目,现就删繁就简单独拿出来web集群这一块写一篇博客.数据库集群请参考<MySQL集群架构篇:MHA+MySQL-PROXY+LVS实现MySQL集群架构高可用/高 ...

  6. Jenkins+Git+Gitlab+Ansible实现持续集成自动化部署动态网站(二)--技术流ken

    项目前言 在上一篇博客<Jenkins+Git+Gitlab+Ansible实现持续化集成一键部署静态网站(一)--技术流ken>中已经详细讲解了如何使用这四个工具来持续集成自动化部署一个 ...

  7. 分布式系统监视zabbix讲解七之分布式监控--技术流ken

    分布式监控 概述 Zabbix通过Zabbix proxy为IT基础设施提供有效和可用的分布式监控 代理(proxy)可用于代替Zabbix server本地收集数据,然后将数据报告给服务器. Pro ...

  8. MySQL/MariaDB数据库忘掉密码解决办法--技术流ken

    前言 有些时候我们常常会忘掉一些服务的密码,比如系统密码,我们可以进入救援模式进行修改密码,可参考我之前的博客<Centos7破解密码的两种方法--技术流ken>.但有些时候我们也会忘掉数 ...

  9. k8s集群监控(十一)--技术流ken

    Weave Scope   在我之前的docker监控中<Docker容器监控(十)--技术流ken>就已经提到了weave scope. Weave Scope 是 Docker 和 K ...

随机推荐

  1. leetcode-只出现一次的数字合并两个有序数组

    题目:合并两个有序数组 给定两个有序整数数组 nums1 和 nums2,将 nums2 合并到 nums1 中,使得 num1 成为一个有序数组. 说明: 初始化 nums1 和 nums2 的元素 ...

  2. .NET题目(收集来自网络)

    1: .NET和c#有什么区别? 答: .NET一般是指.NET FrameWork框架,是一种平台,一种技术 c#是一种编程语言,是可以基于.NET平台的应用 2: c#中的委托是什么?事件是不是一 ...

  3. verilog中timescale

    1. `timescale `timescale是Verilog中的预编译指令,指定位于它后边的module的时间单位和时间精度,直到遇到新的`timescale指令或者`resetall指令.它的语 ...

  4. barrel_shift

    barrel_shift的目的就是在一个bus中根据idx动态选择一部分数据输出如: *dw-:]; -:];// 0~132 *dw-:]; 上面就要求从256的数据单元中选择124个数据单元输出, ...

  5. kali linux学习笔记(四) : 网络端口大全介绍

    端口大全介绍 2端口:管理实用程序 3端口:压缩进程 5端口:远程作业登录 7端口:回显 9端口:丢弃 11端口:在线用户 13端口:时间 17端口:每日引用 18端口:消息发送协议 19端口:字符发 ...

  6. JVM,Tomcat与OSGi类加载机制比较

    首先一个思维导图来看下Tomcat的类加载机制和JVM类加载机制的过程 类加载 在JVM中并不是一次性把所有的文件都加载到,而是一步一步的,按照需要来加载. 比如JVM启动时,会通过不同的类加载器加载 ...

  7. Python 远程开机

    用 Python 关机你肯定听过或者实践过,那么用 Python 开机呢?这是一个神奇的方法,教你如何用 Python 来开机. 本文目标 远程开机原理 Python 远程开机代码实现 Python ...

  8. PHPWord导出word文档

    最近接了个把数据导出到word文档的需求,之前一直都是使用PHPExcel库导出excel的,还是头次接到导出到word文档的需求,我想既然有PHPExcel,那么肯定也会有PHPWord库吧,在网上 ...

  9. 怎么使用zepto.js的tap事件引起的探索

    前言:   在使用zepto.js之前,你首先要知道它是什么?为什么要使用它?以及它和jquery有什么区别? ①:简单来说zepto是一个轻量级的针对现代高级浏览器的JavaScript库, 它与j ...

  10. DOM事件第二弹(UIEvent事件)

    此文章主要总结UIEvent相关的事件,如有不对的地方,欢迎指正. 一.uitls.js(绑定事件公共类) var fixs = { 'focusin': { standard: 'focus', i ...