文章目录

  • 一、Docker网络实现原理
  • 二、Docker的网络模式
    • 1.Host模式
    • 2.Container模式
    • 3.None模式
    • 4.Bridge模式
  • 三、自定义网络
    • 1.查看网络模式列表
    • 2.查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)
    • 3.指定分配容器IP地址
  • 四、暴露端口
  • 五、为容器创建端口映射
  • 总结

一、Docker网络实现原理

  • Docker使用Linux桥接,在宿主机许你一个docker容器网桥(docker0)
  • Docker启动一个容器时会根据docker网桥的网段分配给容器一个IP地址,称为Container-IP
  • 同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能通过容器的Container-IP直接通信

Docker网桥是宿主机虚拟出来的,并不是真正存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主机**(端口映射)**,即docker run创建容器的时候,通过-p或者-P参数来启用。访问容器的时候,就通过【宿主机IP】:【容器端口】访问容器

二、Docker的网络模式

Host:容器不会虚拟出自己的网卡,配置主机的IP等,而是使用宿主机的IP和端口
Container:创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口的范围
None:该模式关闭了容器的网络功能
Bridge:默认为该模式,桥接,此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker0的虚拟网桥,通过docker0网桥以及iptables nat表配置与宿主机通信

1.Host模式

  • host模式:使用–net=host指定
  • 相当于VMware中的桥接模式,与宿主机在同一个网络中,但是没有独立的IP地址
  • Docker使用了Linux的Namespace技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace隔离网络等
  • 一个Network Namespace提供了一份独立的网络环境,包括网卡,路由,iptables规则等都与其他Network Namespace隔离
  • 一个Docker容器一般会分配一个独立的Network Namespace

但是如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口,此时容器不再拥有隔离的、独立的网络栈,不拥有所有端口资源

创建容器web1,指定网络模式为host
因为是host模式,所有宿主机和容器共享ip和端口
docker run -d --name web1 --net=host nginx访问宿主机的ip和80端口,则可以访问到web1的nginx服务
curl http://192.168.226.128:80

2.Container模式

  • Container模式:使用–net=container:NAME_or_ID指定
  • 这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围等。可以在一定程度上节省网络资源,容器内依然不会拥有所有端口
  • 同样,两个容器除了网络方面,其他的如文件系统,进程列表等还是隔离的
  • 两个容器的进程可以通过io网卡设备通信

#基于镜像centos:7创建一个名为test1的容器
[root@docker ~]# docker run -itd --name test1 centos:7 /bin/bash
05be595884ac29b325597409c20402465e2e136200f2b818db545f464e9a53b2#查看该容器的pid号
[root@docker ~]# docker inspect -f '{{.State.Pid}}' test1
29186#查看该容器的命名空间编号
[root@docker ~]# ls -l /proc/29186/ns
总用量 0
lrwxrwxrwx 1 root root 0 10月 17 23:36 ipc -> ipc:[4026532576]
lrwxrwxrwx 1 root root 0 10月 17 23:36 mnt -> mnt:[4026532574]
lrwxrwxrwx 1 root root 0 10月 17 23:35 net -> net:[4026532579]
lrwxrwxrwx 1 root root 0 10月 17 23:36 pid -> pid:[4026532577]
lrwxrwxrwx 1 root root 0 10月 17 23:36 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 10月 17 23:36 uts -> uts:[4026532575]#创建test2容器,使用container网络模式,和test1共享network Namespace
[root@docker ~]# docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
e3807bb98e822c0223c05d2a50dbaaa1fafcff2b8663cb4bdfa6fd361c0ebdc6#查看test2容器的pid
[root@docker ~]# docker inspect -f '{{.State.Pid}}' test2
29906#查看该容器的命令空间编号
[root@docker ~]# ls -l /proc/29906/ns
总用量 0
lrwxrwxrwx 1 root root 0 10月 17 23:38 ipc -> ipc:[4026532651]
lrwxrwxrwx 1 root root 0 10月 17 23:38 mnt -> mnt:[4026532649]
lrwxrwxrwx 1 root root 0 10月 17 23:38 net -> net:[4026532579]
lrwxrwxrwx 1 root root 0 10月 17 23:38 pid -> pid:[4026532652]
lrwxrwxrwx 1 root root 0 10月 17 23:38 user -> user:[4026531837]
lrwxrwxrwx 1 root root 0 10月 17 23:38 uts -> uts:[4026532650]

3.None模式

  • None模式:使用–net=none指定
  • 使用none模式,docker容器有自己的Network Namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个docker容器没有网卡,ip,路由等信息
  • 这种网络模式下,容器只有lo回环网络,没有其它网卡
  • 这种类型没有办法联网,但是封闭的网络能很好的保证容器的安全性
  • 该容器将完全独立于网络,用户可以根据需要为容器添加网卡。此模式拥有所有端口(none网络模式配置网络)
  • 特殊情况下才会用到,一般不用

4.Bridge模式

Bridge模式是docker的默认网络模式,不写–net参数,就是bridge模式

相当于VMware中的nat模式,容器使用独立的Network Namespace,并连接到docker0虚拟网卡。通过docker0网桥以及iptables nat表配置与宿主机通信,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker容器连接到一个虚拟网桥上

  • 当docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机启动的docker容器会连接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中
  • 从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。在主机上创建一堆虚拟网卡veth pair设备。veth设备总是承兑出现的,它们组成了一个数据通道,数据从一个设备进入,就会从另一个设备出来。因此,veth设备常用来连接两个网络设备
  • docker将veth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以veth这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看
  • 容器之间通过veth pair进行访问
  • 使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以是同iptables -t nat -vnL查看

[root@docker ~]# docker run -itd --name test3 centos:7 /bin/bash
77dba076efff1650ed30e43e0595209d8aeb643e6d93cbd6399f6fd4c8bbeb25
[root@docker ~]# docker inspect test3 | grep -i 'networkmode'"NetworkMode": "default",

三、自定义网络

1.查看网络模式列表

docker network ls

2.查看容器信息(包含配置、环境、网关、挂载、cmd等等信息)

docker inspect 容器ID


3.指定分配容器IP地址

[root@docker ~]# docker run -itd --name test1 --network bridge --ip 172.17.0.10 centos:7 /bin/bash
7503b80e9f1531d0e11327ea4def47728cb9fd90c66d1471de2d4798e9c9a817
docker: Error response from daemon: user specified IP address is supported on user defined networks only.
#以上会出现报错,因为用户使用的IP地址不被规则所允许,docker0定义的就是按照顺序来,所以需要创建一个docker network create --subnet=172.18.0.0/16 mynetwork


自定义完网络,我们再指定IP

docker run -itd --name test2 --network mynetwork --ip=172.18.0.10 centos:7 /bin/bash

四、暴露端口

两个容器如果端口一致的情况下,暴露出去会产生地址冲突,所以需要再docker0上做一个端口映射,通过ens33暴露出去的端口不同就可以了

-p 自定义端口(宿主机端口:容器内端口)
-P 随机端口(-P 49153起始 49153到65535)
#自定义端口
docker run itd -p 8081:80 nginx:latest /bin/bash
#需要在容器中开启nginx
docker exec -it cd796c68ce60 /bin/bash -c nginx# 随机端口
docker run -itd -P nginx:latest /bin/bash

自定义端口

随机端口

浏览器访问

五、为容器创建端口映射

随机映射端口(从32768开始)
docker run -d --name 为容器指定名称 -P 镜像
指定映射端口
docker run -d --name 为容器指定名称 -p 宿主机端口:容器内端口 镜像
#使用nginx镜像创建容器,名称为web1,随机映射端口
docker run -d --name web1 -P nginx
docker ps -a#使用nginx镜像创建容器,名称为web2,将容器内的80端口映射到宿主机的40000端口
docker run -d --name web2 -p 40000:80 nginx
docker ps -a#访问
curl http://192.168.130.100:49154
curl http://192.168.130.100:40000#主机查看端口号
netstat -natp|grep docker#实际上是通过nat表进行转发的iptables -nL -t nat





总结

1、Docker网络模式有哪些?分别提供哪些功能?

  • Host :与宿主机共享网络名称空间/网络协议栈
  • Container:多个容器之间共享一个network namespaces
  • None :自闭空间
  • bridge:默认模式通过Veth对连接容器与docker0网桥,网桥分配给容器IP,同时docker 0作为“局域网”内容器的网关,最后和宿主机网卡进行通讯
  • overlay:叠加网络模式

Docker--网络模式相关推荐

  1. docker网络--理解linux底层实现机制、docker网络模式

    1. Linux网络基础 Linux内核具有非常成熟和高性能的TCP / IP堆栈实现.Docker网络使用linux内核的网络堆栈作为低级原语来创建高级网络驱动程序.简而言之,Docker网络就是 ...

  2. Docker网络模式与数据管理

    Docker网络模式与数据管理 前言 一.四种网络模式 (1)Host模式 (2)Container模式 (3)Bridge模式(默认) (4)None模式 (5)overlay2 二.自定义网络 ( ...

  3. Docker网络模式解析

    目录 前言 一.常用基本命令 (一)查看网络 (二)创建网络 (三)查看网络源数据 (四)删除网络 二.网络模式 (一)总体介绍 (二)容器实例内默认网络IP生产规则 (三)案例说明 1.bridge ...

  4. 【k8s】docker网络模式(必知)

    docker网络部分的视频我看了很多,讲解最透彻的还是https://www.bilibili.com/video/BV123411y7TB?p=8 获取本文方式:见谷粒商城文尾,备注[docker网 ...

  5. docker学习笔记(四):docker网络模式及桥接配置

    2019独角兽企业重金招聘Python工程师标准>>> 1.docker网络模式:有如下五种: host模式(--net=host)            container模式  ...

  6. 【Docke进阶篇】Docker网络模式与容器间通信

    本篇主要是Docker网络模式与容器间通信. 上一篇:[Docker基础篇]Docker核心概念与指令 文章目录 一.预备知识点 二.Docker网络模式 1.查看Docker网络模式 2.bridg ...

  7. docker网络模式

    目录 一.四种网络模式 1.1 Host模式 1.2 Container模式 1.3 Bridge模式(默认) 1.4 None模式(躺平) 二.自定义网络 2.1 查看网络模式列表 2.2 查看容器 ...

  8. 七、Docker网络模式详解

    目录 一.docker网络概述 1.docker网络实现的原理 2.容器的端口映射 1).端口映射 2).四种端口映射 3).端口映射演示 (1).随机端口映射(-P) (2).指定端口映射(-p 宿 ...

  9. Docker网络模式详解

    文章目录 一.docker网络概述 1.docker网络实现的原理 二. docker的网络模式 1.默认网络 2.使用docker run 创建Docker容器时,可以用--net或--networ ...

  10. 查看此docker网络连接模式_Docker系列-Docker 网络模式及配置

    一.Docker网络模式 docker run 创建 Docker 容器时,可以用 –net 选项指定容器的网络模式,Docker 有以下 4 种网络模式: host 模式,使用 –net=host ...

最新文章

  1. 微信小程序和vue双向绑定哪里不一样_vue和微信小程序的区别、比较
  2. 最短路径问题经典题目汇总
  3. 12 HTML5中的影音播放
  4. MTK 平台上如何给 camera 添加一种 preview size
  5. 当ABAP遇到OLE
  6. php ci 表单校验,表单验证 - CodeIgniter 中文手册|用户手册|用户指南|Wiki文档
  7. docker容器的标准使用过程_phpStorm中使用xdebug工具调试docker容器中的程序
  8. Design-patterns-JS:用JavaScript实现23种设计模式
  9. 【杂记】我为什么要坚持写博客
  10. python xlwt设置单元格的自定义背景颜色
  11. 【报告分享】数据资产化之路----数据资产的估值与行业实践.pdf
  12. HTML+CSS简单应用实例——购物网站的制作(一)
  13. C++实现 酒店管理系统
  14. UI设计理论和UI总结
  15. Gitea v1.17.0 正式发布 | 集成软件包管理器、容器镜像仓库
  16. CSDN下载频道2013下半年超人气精华资源汇总
  17. 打印机驱动无法安装到计算机是,打印机驱动在电脑哪个位置 打印机驱动安装不上怎么办【详解】...
  18. Vert.x(vertx) 创建HTTP服务
  19. ByteBuffer使用揭秘
  20. 微信小程序8__一行2 列的布局,一行2列的图片布局

热门文章

  1. 东方通中间件 - TongWeb 初级
  2. java全栈系列之JavaSE-面向对象(类与对象的创建)032
  3. 优达学城《无人驾驶入门》学习笔记——卡尔曼滤波器实现详解
  4. JS 删除字符串中所有的数字
  5. THUSC 2017 游记
  6. MATLAB中判断两字符串是否相等
  7. 渠道二维码的基础玩法总结
  8. Vue keyframe动画不生效
  9. 计算机音乐加减乘除是什么音,音乐课堂里的“加减乘除”
  10. 2022零碳中国优秀案例及零碳技术解决方案