一、docker网络介绍

  大量的互联网应用服务需要多个服务组件,这往往需要多个容器之间通过网络通信进行相互配合

  docker 网络从覆盖范围可分为单个 host 上的容器网络跨多个 host 的网络

  docker 目前提供了映射容器端口到宿主主机和容器互联机制来为容器提供网络服务,在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容器内部的网络应用和服务的

  docker 安装时会自动在host上创建三个网络,我们查看一下docker网络:

[root@ren8 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
5ada5821d5d1 bridge bridge local
011f63e62210 host host local
12362c774cf8 none null local

docker有四种网络模式:

  (1)bridge模式

  docker网络隔离基于网络命名空间,在物理机上创建docker容器时会为每一个docker容器分配网络命名空间,并且把容器IP桥接到物理机的虚拟网桥上。

  (2)none模式

  此模式下创建容器是不会为容器配置任何网络参数的,如:容器网卡、IP、通信路由等,全部需要自己去配置。

  (3)host模式

  此模式创建的容器没有自己独立的网络命名空间,是和物理机共享一个Network Namespace,并且共享物理机的所有端口与IP,并且这个模式认为是不安全的。

  (4)container模式(用户自定义网络)

  此模式和host模式很类似,只是此模式创建容器共享的是其他容器的IP和端口而不是物理机,此模式容器自身是不会配置网络和端口,创建此模式容器进去后,你会发现里边的IP是你所指定的那个容器IP并且端口也是共享的,而且其它还是互相隔离的,如进程等。

二、docker --- none 网络

  none 网络就是什么都没有的网络。挂在这个网络下的容器除了 lo,没有其他任何网卡。容器创建时,可以通过 --network=none 指定使用 none 网络。

[root@ren8 ~]# docker run -it --network=none 192.168.11.7:5000/busybox:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
/ #

none 网络的应用

  封闭的网络意味着隔离,一些对安全性要求高并且不需要联网的应用可以使用 none 网络。

  比如某个容器的唯一用途是生成随机密码,就可以放到 none 网络中避免密码被窃取。

三、docker --- host 网络

  连接到 host 网络的容器共享 docker host 的网络栈,容器的网络配置与 host 完全一样。可以通过 --network=host 指定使用 host 网络

[root@ren8 ~]# docker run --rm -it --network=host 192.168.11.7:5000/busybox:latest
/ # ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: ens33: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:14:ac:76 brd ff:ff:ff:ff:ff:ff
inet 192.168.11.8/24 brd 192.168.11.255 scope global ens33
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe14:ac76/64 scope link
valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
link/ether 02:42:cb:36:e1:bf brd ff:ff:ff:ff:ff:ff
inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
valid_lft forever preferred_lft forever

  在容器中可以看到 host 的所有网卡,并且连 hostname 也是 host 的。host 网络的使用场景又是什么呢?

  直接使用 Docker host 的网络最大的好处就是性能如果容器对网络传输效率有较高要求,则可以选择 host 网络。当然不便之处就是牺牲一些灵活性,比如要考虑端口冲突问题,Docker host 上已经使用的端口就不能再用了。

  Docker host 的另一个用途是让容器可以直接配置 host 网路。比如某些跨 host 的网络解决方案,其本身也是以容器方式运行的,这些方案需要对网络进行配置,比如管理 iptables

四、docker --- bridge 网络

  docker 安装时会创建一个 命名为 docker0 的 linux bridge。如果不指定--network,创建的容器默认都会挂到 docker0 上:

[root@ren7 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242b89f778c no

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

[root@ren7 ~]# docker run -d mirrorgooglecontainers/pause-amd64:3.1
26e1529c8d5cb206ca6c6ec47adde1ef29e35f46159615225453246dab7eb30a
[root@ren7 ~]# brctl show
bridge name bridge id STP enabled interfaces
docker0 8000.0242b89f778c no veth4506620

  一个新的网络接口 veth4506620 被挂到了 docker0 上,veth4506620就是新创建容器的虚拟网卡。

  进入刚才运行的容器查看网络,容器有一个网卡 eth0@if34

  实际上 eth0@if34 和 veth4506620是一对 veth pair

  veth pair 是一种成对出现的特殊网络设备,可以把它们想象成由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if34)在容器中,另一头(veth4506620)挂在网桥 docker0 上,其效果就是将 eth0@if34 也挂在了 docker0 上

  eth0@if34 已经配置了 IP 172.17.0.2,为什么是这个网段呢?
  看一下 bridge 网络的配置信息:

docker network inspect bridge

  bridge 网络配置的 subnet 就是 172.17.0.0/16,并且网关是 172.17.0.1,在docker0上

  容器创建时,docker 会自动从 172.17.0.0/16 中分配一个 IP,这里 16 位的掩码保证有足够多的 IP 可以供容器使用

五、创建 user --- defined 网络

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

(1)利用bridge驱动创建名为my-net2网桥(docker会自动分配网段):

docker network create --driver brigde my-net2

(2)查看一下当前 host 的网络结构变化:

docker network ls

(3)查看容器bridge网桥配置(bridge就是容器和网桥形成一对veth pair)

docker network inspect bridge

(4)利用bridge驱动创建名为my-net3网桥(user-defined网段及网关)

docker network create --driver brigde --subnet 172.22.1.0/24 --gateway 172.22.1.1 my-net3 

(5)启动容器使用新建的my-net3网络

docker run -it --network=my-net3 httpd 

(6)启动容器使用my-net3网络并指定ip(只有使用 --subnet 创建的网络才能指定静态 IP,如果是docker自动分配的网段不可以指定ip)

docker run -it --network=my-net3 --ip 172.22.1.10 httpd

(7)让已启动不同vlan的ningx容器连接到my-net2(其实在ningx中新建了my-net2的网卡)

docker run -it --network=my-net3 ningx
docker network connect my-net2 ningx

(8)使用--name指定启动容器名字,可以使用docker自带DNS通信,但只能工作在user-defined 网络,默认的 bridge 网络是无法使用 DNS 的

docker run -it --network=my_net2 --name=bbox1 busybox
docker run -it --network=my_net2 --name=bbox2 busybox

(9)容器之间的网络互联

  a). 首先创建一个 db 容器

docker run -dti --name db centos:7.0

  b). 创建一个 web 容器,并使其连接到 db

docker run -dti --name web --link db:dblink centos:7.0/bin/bash

  --link db:dblink 实际是连接对端的名字和这个链接的名字,也就是和 db 容器建立一个叫做 dblink 的链接

  c). 查看链接的情况

docker ps -a

  d). 使用 ping 命令来测试网络链接的情况

(10)容器端口映射

  在启动容器的时候,如果不指定参数,在容器外部是没有办法通过网络来访问容器内部的网络应用和服务的

  当容器需要通信时,我们可以使用 -P (大) &&-p (小)来指定端口映射

  -P : Docker 会随机映射一个 49000 ~ 49900 的端口到容器内部开放的网络端口
  -p :则可以指定要映射的端口,并且在一个指定的端口上只可以绑定一个容器。

  支持的格式有

  IP : HostPort : ContainerPort
  IP : : ContainerPort
  IP : HostPort :

  查看映射:

docker port

  a)映射所有接口地址,此时绑定本地所有接口上的 5000 到容器的 5000 接口,访问任何一个本地接口的 5000 ,都会直接访问到容器内部

docker run -dti -p 5000:5000 centos:7.0 /bin/bash

  b)多次使用可以实现多个接口的映射

docker run -dti -p 5000:5000 -p 5022:22 centos:7.0 /bin/bash

  c)映射到指定地址的指定接口

  此时会绑定本地 192.168.4.169 接口上的 5000 到容器的 5000 接口

docker run -dti -p 192.168.4.169:5000:5000 centos:7.0 /bin/bash

  d) 映射到指定地址的任意接口

  此时会绑定本地 192.168.4.169 接口上的任意一个接口到容器的 5000 接口

docker run -dti -p 192.168.4.169::5000 centos:7.0 /bin/bash

  e) 使用接口标记来指定接口的类型

docker run -dti -p 192.168.4.169::5000/UDP centos:7.0 /bin/bash

(11)实验:通过端口映射实现访问本地的 IP:PORT 可以访问到容器内的 web

  a)将容器80端口映射到主机8080端口

docker run -itd -p 8080:80 --name http-test httpd 

  b) 查看刚运行docker

docker ps

  c) 进入容器

docker exec -it httpd-test

  d) 容器内部编辑网页文件 index.html

********#echo “hhhhhhhhhhhh” > /var/www/html/index.html

  e)到宿主机上打开浏览器输入 IP:PORT 访问验证

  http://192.168.4.170:8080

  网络排排查命令:

iptables -t nat -L
ip r
tcpdump -i docker0 -n icmp
tcpdump -i eth0 -n icmp

Docker网络(5)的更多相关文章

  1. 理解Docker(5):Docker 网络

    本系列文章将介绍 Docker的相关知识: (1)Docker 安装及基本用法 (2)Docker 镜像 (3)Docker 容器的隔离性 - 使用 Linux namespace 隔离容器的运行环境 ...

  2. docker网络配置方法总结

    docker启动时,会在宿主主机上创建一个名为docker0的虚拟网络接口,默认选择172.17.42.1/16,一个16位的子网掩码给容器提供了65534个IP地址.docker0只是一个在绑定到这 ...

  3. 【转】Docker网络详解及pipework源码解读与实践

    好文必转 原文地址: http://www.infoq.com/cn/articles/docker-network-and-pipework-open-source-explanation-prac ...

  4. Docker网络模式

    [编者的话] 本文是<Docker网络及服务发现>一书的一个章节,介绍了搭建Docker单主机网络的基础内容.关于Docker网络的更多内容,包括多主机的网络,请参考该书的其他章节. @C ...

  5. docker网络-如何让外部网络访问容器资源

    docker网络-如何让外部网络访问容器资源 安装httpd 服务: docker:/root# docker exec -it f63b2633d146 bash bash-4.1# yum ins ...

  6. docker网络解析

    Docker概念和默认网络 什么是Docker网络呢?总的来说,网络中的容器们可以相互通信,网络外的又访问不了这些容器.具体来说,在一个网络中,它是一个容器的集合,在这个概念里面的一个容器,它会通过容 ...

  7. docker网络访问(三)

    docker网络访问 ifconfig查看网卡,启动docker的时候,docker会帮我们创建一个docker0的网桥. 1.随机映射 docker run -P 2.指定映射 -p hostPor ...

  8. [Docker网络]模拟一台交换机的拓扑

    [Docker网络]模拟一台交换机的拓扑 本例主要对Docker网络进行实际运用. 背景介绍 一台虚拟机如何模拟成一台多端口交换机分别连接多台虚拟机? bridge网桥技术 实验准备 docker d ...

  9. Docker 网络之理解 bridge 驱动

    笔者在前文<Docker 网络之进阶篇>中介绍了 CNM(Container Network Model),并演示了 bridge 驱动下的 CNM 使用方式.为了深入理解 CNM 及最常 ...

  10. Docker 网络之进阶篇

    笔者在<Docker 基础 : 网络配置>一文中简单介绍了容器网络的基本用法,当时网络的基本使用方式还处于 --link 阶段.时过境迁,随着 docker 的快速发展,其网络架构也在不断 ...

随机推荐

  1. 源码篇:Handler那些事

    前言 Handler属于八股文中非常经典的一个考题了,导致这个知识点很多时候,考官都懒得问了:这玩意很久之前就看过,但是过了一段时间,就很容易忘记,但是处理内存泄漏,aidlHandler之类的考点答 ...

  2. 如何在CSS中映射的鼠标位置,并实现通过鼠标移动控制页面元素效果

    映射鼠标位置或实现拖拽效果,我们可以在 JavaScript 中做到这一点.但实际上,在CSS中有更加简洁的方法,我们可以在不使用JavaScript 的情况下,仍然可以实现相同的功能! 只使用CSS ...

  3. Day11_49_HashTable

    HashTable * HashTable是较早期的使用Hash算法的一种容器结构,现在基本已被淘汰,单线程多使用HashMap,多线程使用ConcurrentHashMap. * HashTable ...

  4. Vue入门学习

    目录 Vue 简介 第一个Vue程序 Vue基本语法 双向绑定 组件 Axios异步通信 计算属性 Slot 自定义事件 第一个Vue-cli程序 webpack学习使用 Vue-Router路由 v ...

  5. 1.4.19- HTML标签之注释标签

    有的时候我们输入的代码,让你别人看,别人不知道你的思路,可能就看不懂,或者或一段时间自己就看不懂了,这个时候我们需要对代码进行注释,解释我们的代码什么意思: <!DOCTYPE html> ...

  6. 【MySQL】SQL中On和Where的区别

    数据库再通过链接两张表或者多张表时来返回记录时,都会生成一张中间的临时表,然后再将这张表返回给用户: 在使用left jion时,on和where条件的区别如下: 1. on条件是在生成临时表时使用的 ...

  7. hdu 3062 基础的2sat

    题意: Party Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Sub ...

  8. LA3266田忌赛马

    题意:       田忌和齐王赛马,两个人每人n匹马,每个马都有自己的速度,赢一场得到200分,输一场失去200分,平则不得分,问田忌可能得到的最高得分是多少? 思路:       又是一个比较经典的 ...

  9. 线程操作与进程挂起(Windows核心编程)

    0x01 线程挂起与切换 对于挂起进程,挂起线程则比较简单,利用 ResumeThread 与 SuspendThread 即可,当线挂起时线程用户状态下的一切操作都会暂停 #include < ...

  10. nodejs-Stream(流)

    Node.js Stream(流) 描述++++++++++++++++++++++++++++++++++++++++++++++++++++ Stream 是一个抽象接口,Node 中有很多对象实 ...