Docker网络类型

跟VMware对比

VMware

VMware工作模式

  • 1.桥接模式

    • 物理机网卡 和 虚拟机网卡桥接,让虚拟机IP和物理机IP在同一网段(上外网)
  • 2.NAT模式
    • 动态网络地址转换:让物理机的网卡编程路由器,虚拟机分配虚拟地址(上外网)
  • 3.仅主机模式
    • 让物理机成为一个局域网,所有其他虚拟机可自定义网段,但是不能上外网

Docker

Docker工作模式

  • 1.Bridge 桥接模式
  • 2.host模式
  • 3.Container模式
  • 4.none模式
  • 5.自定义网络模式

查看网络模式

# 查看docker网络,网卡模式
[root@db01 ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
095c17b7eaf3 bridge bridge local
48b1d8e70d2e host host local
2a9cba9f52b0 none null local

Docker内置这三个网络,运行容器时,你可以使用该来指定容器应连接到哪些网络

我们在使用docker run创建Docker容器时,可以用

--network 选项指定容器的网络模式,Docker有以下4种网络模式:

  • host模式:使用 --net=host 指定。
  • none模式:使用 --net=none 指定。
  • bridge模式:使用 --net=bridge 指定,默认设置
  • container模式:使用 --net=container:NAME_or_ID 指定

route命令

route 命令能够用于 IP 路由表的显示和操作

# 宿主机执行
[root@db01 ~]$ route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 10.0.0.2 0.0.0.0 UG 100 0 0 eth0
0.0.0.0 172.16.1.2 0.0.0.0 UG 101 0 0 eth1
10.0.0.0 0.0.0.0 255.255.255.0 U 100 0 0 eth0
172.16.1.0 0.0.0.0 255.255.255.0 U 101 0 0 eth1
172.16.2.0 0.0.0.0 255.255.255.0 U 0 0 0 br-195666802e7b
192.168.200.0 0.0.0.0 255.255.255.0 U 0 0 0 docker0 # 容器内执行
/ # route -n
Kernel IP routing table
Destination Gateway Genmask Flags Metric Ref Use Iface
0.0.0.0 172.16.2.1 0.0.0.0 UG 0 0 0 eth0
172.16.2.0 0.0.0.0 255.255.255.0 U 0 0 0 eth0 # Flags 标志说明:
U:Up 表示此路由当前为启动状态
H:Host,表示此网关为一主机
G:Gateway,表示此网关为一路由器
R:Reinstate Route,使用动态路由重新初始化的路由
D:Dynamically,此路由是动态性地写入–》什么时候才会有动态的路由信息呢?
M:Modified,此路由是由路由守护程序或导向器动态修改

Docker的网络工作模式

Bridge模式

不指定是默认也是这种模式,这种模式会为每个容器分配一个独立的network 网卡,同一个宿主机是在同一个网段下可以通信的,类似于 VMware 的 NAT模式

# 使用docker镜像做网络测试
[root@db01 ~]$ docker pull busybox # 运行容器
[root@db01 ~]$ docker run -it -d busybox /bin/sh ## 修改方式一:
# 修改桥接网卡的IP
[root@db01 ~]$ vim /usr/lib/systemd/system/docker.service
ExecStart=/usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock --bip=192.168.100.1/24 [root@db01 ~]$ systemctl daemon-reload
[root@db01 ~]$ systemctl restart docker ## 修改方式二:
# 修改docker配置文件
[root@db01 ~]$ vim /etc/docker/daemon.json {
"bip": "192.168.200.1/24", # 添加外网网段
"registry-mirrors": ["https://pgz00k39.mirror.aliyuncs.com"]
} # 进入容器 查看ip
[root@db01 ~]$ docker exec -it ecc /bin/sh
/ # 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
79: eth0@if80: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:c0:a8:c8:02 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.2/24 brd 192.168.200.255 scope global eth0 # 192.168.200.2
valid_lft forever preferred_lft forever # 查看宿主机网络
[root@db01 ~]$ ip a
4: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
link/ether 02:42:d7:5c:40:a8 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.1/24 brd 192.168.200.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d7ff:fe5c:40a8/64 scope link
valid_lft forever preferred_lft forever

host模式

host模式类似于Vmware的桥接模式,一个Docker容器一般会分配一个独立的Network Namespace。但如果启动容器的时候使用host模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口

# 使用host网络模式启动容器
[root@db01 ~]$ docker run -it --network host -d busybox /bin/sh
e7cefe97f3a9938480e07ef6e7eaca5b951841deb1d0b807e820452b6b7d05e8 # 进入容器查看网络,与宿主机网络一致
[root@db01 ~]$ docker exec -it e7 /bin/sh
/ # 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: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:84:f6:84 brd ff:ff:ff:ff:ff:ff
inet 10.0.0.51/24 brd 10.0.0.255 scope global noprefixroute eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe84:f684/64 scope link
valid_lft forever preferred_lft forever
3: eth1: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast qlen 1000
link/ether 00:0c:29:84:f6:8e brd ff:ff:ff:ff:ff:ff
inet 172.16.1.51/24 brd 172.16.1.255 scope global noprefixroute eth1
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe84:f68e/64 scope link
valid_lft forever preferred_lft forever
4: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue
link/ether 02:42:d7:5c:40:a8 brd ff:ff:ff:ff:ff:ff
inet 192.168.200.1/24 brd 192.168.200.255 scope global docker0
valid_lft forever preferred_lft forever
inet6 fe80::42:d7ff:fe5c:40a8/64 scope link
valid_lft forever preferred_lft forever # 通过namespace隔离,和宿主机共用一块网卡

总结: 模式简单并且性能高,host 模式下面的网络模型是最简单和最低延迟的模式,容器进程直接与主机网络接口通信,与物理机性能一致,host 不利于网络自定配置和管理,并且所有主机的容器使用相同的IP。也不利于主机资源的利用。对网络性能要求比较高。

Container模式

Container:与另一个运行中的容器共享Network Namespace,--net=container:containerID(K8S)

Docker网络container模式是指,创建新容器的时候,通过--net container参数,指定其和已经存在的某个容器共享一个 Network Namespace,但这两个容器在其他的资源上,如文件系统、进程列表等还是隔离的。

# 常规启动容器
[root@db01 ~]$ docker run -itd centos:7 /bin/bash
02e42bf656c9d7c9f88337d6f51bcbc6ed458c705422975a7d0bdaac8564a849 # 进入容器
[root@db01 ~]$ docker exec -it 02e /bin/bash # c7没有ip命令,curl一下本机,不通
[root@02e42bf656c9 /]# curl 172.0.0.1
curl: (7) Failed connect to 172.0.0.1:80; Connection refused # 启动一个容器,使用Container模式与上面使用host模式的容器共享网络
[root@db01 ~]$ docker run -itd --net=container:e7cefe97f3a9 centos:7 /bin/bash
282ecf3dcac6b59713d4224d04da8d07b5ba06d80e0f5198283379a9d26dde81 # 进入容器测试
[root@db01 ~]$ docker exec -it 282ecf3dcac /bin/bash # 网络通畅
[root@db01 /]# curl 127.0.0.1
<!DOCTYPE html>
<!-- saved from url=(0029)http://www.9miao.com/ -->
<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta charset="utf-8">
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="Cache-Control" content="no-store, must-revalidate">
<meta http-equiv="expires" content="0">
<title>微信html5游戏平台——9miao.com国内最大微信开发者社区</title>
<meta name="keywords" content="">
<meta name="description" content="9miao.com国内最大微信开发者社区">
<meta name="viewport" content="width=device-width,initial-scale=1, minimum-scale=1.0, maximum-scale=1, user-scalable=no">
<link rel="stylesheet" href="./img/comm.css">
<link rel="stylesheet" type="text/css" href="./img/info.css" media="screen, projection">
<script>
document.domain = 'mp.9g.com';
</script>

none模式

none模式,顾名思义就是没有网络

使用none容器里面就没有网卡(除了 lo),所以不提供网络服务,无法与别的容器互访,也无法访问主机

# 启动一个使用neno模式的容器
[root@db01 ~]$ docker run -itd --net=none busybox:latest /bin/sh
6c702574f78b04618e4d966bb4478d844842fea586c673baddff1e6742745ff7 # 进入容器查看网卡信息
[root@db01 ~]$ docker exec -it 6c702574f78 /bin/sh # 只有一块本地回环地址的网卡,无网络
/ # ifconfig
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

自定义网络模式

## 创建自定义网络
docker network create -d <网络模式> --subnet <网段> --gateway <网关> <自定义网路名称> [root@db01 ~]$ docker network create -d bridge --subnet 172.16.2.0/24 --gateway 172.16.2.1 my_network
aa9e88d8509e7d76ae3cd9306017d0b285a72a01f9810e3ec22eb395fc449ef9 ## 查看网络
[root@db01 ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
20e5d44191b0 bridge bridge local
48b1d8e70d2e host host local
aa9e88d8509e my_network bridge local
2a9cba9f52b0 none null local ## 使用自定义网络启动容器
[root@db01 ~]$ docker run -it --network my_network -d busybox /bin/sh ## 删除自定义网络
[root@db01 ~]$ docker network rm 网络ID 或者 网络名称 [root@db01 ~]$ docker network rm my_network
my_network
[root@db01 ~]$ docker network ls
NETWORK ID NAME DRIVER SCOPE
20e5d44191b0 bridge bridge local
48b1d8e70d2e host host local
2a9cba9f52b0 none null local -------------------------------------------------------------------------------------------------------------------
# 使用自定义的bridge模式启动多个容器
[root@db01 ~]$ docker run -it --net=my_network -d busybox /bin/sh
068d9f27b5d727877df380fbee0ae7e45f13ee5791d5137510cc4674a7bcb933 [root@db01 ~]$ docker run -it --net=my_network -d busybox /bin/sh
b2cc3594a941b8044ed6217ca9d60dcb38fff314f18c54899c870dd4438eb4af # 进入容器,查看网络信息
[root@db01 ~]$ docker exec -it b2cc3594a9 /bin/sh
/ # 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
91: eth0@if92: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:10:02:03 brd ff:ff:ff:ff:ff:ff
inet 172.16.2.3/24 brd 172.16.2.255 scope global eth0
valid_lft forever preferred_lft forever [root@db01 ~]$ docker exec -it 068d9f27b5d /bin/sh
/ # 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
89: eth0@if90: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue
link/ether 02:42:ac:10:02:02 brd ff:ff:ff:ff:ff:ff
inet 172.16.2.2/24 brd 172.16.2.255 scope global eth0
valid_lft forever preferred_lft forever # 与网段内 容器网络互通
/ # ping 172.16.2.3
PING 172.16.2.3 (172.16.2.3): 56 data bytes
64 bytes from 172.16.2.3: seq=0 ttl=64 time=0.131 ms
64 bytes from 172.16.2.3: seq=1 ttl=64 time=0.101 ms
64 bytes from 172.16.2.3: seq=2 ttl=64 time=0.121 ms # 与宿主机网络互通
PING 10.0.0.51 (10.0.0.51): 56 data bytes
64 bytes from 10.0.0.51: seq=0 ttl=64 time=0.201 ms
64 bytes from 10.0.0.51: seq=1 ttl=64 time=0.103 ms
64 bytes from 10.0.0.51: seq=2 ttl=64 time=0.105 ms # 与外网网络互通
/ # ping www.baidu.com
PING www.baidu.com (180.101.49.12): 56 data bytes
64 bytes from 180.101.49.12: seq=0 ttl=127 time=12.494 ms
64 bytes from 180.101.49.12: seq=1 ttl=127 time=11.972 ms
64 bytes from 180.101.49.12: seq=2 ttl=127 time=12.754 ms

Docker网络类型的更多相关文章

  1. Docker 网络类型

    Docker 网络类型 前言 a. 本文主要为 Docker的视频教程 笔记. b. 环境为 CentOS 7.0 云服务器 c. 上一篇:docker-compose 的使用和负载均衡的初探 1. ...

  2. docker网络类型访问原理

    • bridge –net=bridge 默认网络,Docker启动后创建一个docker0网桥,默认创建的容器也是添加到这个网桥中. • host –net=host 容器不会获得一个独立的netw ...

  3. docker网络

    docker网络   Docker 允许通过外部访问容器或容器互联的方式来提供网络服务. 端口映射允许外部访问容器 --link 容器互联 容器桥接网络 .通过--link容器通信,给test2添加一 ...

  4. 16.2,docker网络

      Docker 允许通过外部访问容器或容器互联的方式来提供网络服务. 端口映射允许外部访问容器 --link 容器互联 容器桥接网络 .通过--link容器通信,给test2添加一个hosts解析记 ...

  5. 037.集群网络-Docker网络实现

    一 Docker网络 1.1 Docker网络类型 标准的Docker支持以下4类网络模式: host模式:使用--net=host指定. container模式:使用--net=container: ...

  6. 五、docker网络

    一.Docker 网络 docker网络主要是解决容器联网问题,也是我们使用容器中最重要的一个环节,如果容器没有网络则无法向网络中提供服务. 网络管理命令:docker network [root@z ...

  7. Docker:容器的四种网络类型 [十三]

    一.None类型 简介:不为容器配置任何网络功能,--net=none 1.创建容器 docker run -it --network none busubox:latest 2.功能测试 [root ...

  8. docker单机网络类型

    docker单机网络类型概述 Docker 安装时会自动在 host 上创建三种网络  分别为 bridge    host   none .   可用 docker network ls 命令查看 ...

  9. Docker的网络类型

    四种网络类型: None:不为容器配置任何网络功能,--net=noneContainer:与另一个运行中的容器共享Network Namespace,--net=container:containe ...

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

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

随机推荐

  1. Windows软件堆栈溢出(stack overflow)的一些解决方法

    欢迎访问我的个人博客:xie-kang.com 原文地址 Windows平台下,有三种方法调整堆栈大小(适用于MSVC编译器): 1)添加编译参数:/F size  #其中size的单位是byte可设 ...

  2. KVM虚拟机根分区磁盘扩容

    CentOS7.6, libvirt 4.5.0 , KVM虚拟机根分区扩容. 在宿主机执行0, 对LVM磁盘进行扩容 0. qemu-img resize 10.0.0.1_node1.qcow2 ...

  3. Web For Pentester File include

    File include(文件包含) Example 1 没有任何过滤 审计源码 没有对我们传参的page进行任何过滤,payload如下 http://172.16.1.104/fileincl/e ...

  4. 如何使用Github创建一个仓库

    创建仓库(对我来说,这是新建) 点击这里的Create repository: 进入到这样一个界面: 其中,Repository name,是我们即将创建完成的仓库名称: 而这里: 需要填写的是对仓库 ...

  5. 02.SQL

    1. SQL通用语法 SQL语句可以单行或者多行书写,以分号结尾 SQL语句可以使用空格或者缩进来增强语句的可读性 MYSQL数据库的SQL语句不区分大小写,关键字建议使用大写 注释: 单行注释:-- ...

  6. 后疫情时代,RTE“沉浸式”体验还能这么玩?丨RTE 2022 编程挑战赛赛后专访

    前言 9 月 17 日,由声网.环信与 RTE 开发者社区联合主办的"RTE 2022 编程挑战赛"圆满落幕.从 300+ 支参赛队伍中冲出重围的 27 支决赛队伍,在元宇宙中用精 ...

  7. 使用LRU加速python应用

    操作系统 :CentOS 7.6.1810_x64 Python 版本 : 3.9.12 一.背景描述 使用python开发过程中,会遇到需要使用缓存加速应用的情况,比如下面这些场景: 数据转换加速 ...

  8. SpringBoot——静态资源及原理

    一.使用 SpringBoot 的步骤 [1]创建 SpringBoot应用,选中自己需要的模块.[2]SpringBoot 已经默认将这些场景配置好,只需要在配置文件中指定少量配置就可以运行起来.[ ...

  9. IDA 逆 WDF 驱动时的函数识别插件

    快一年没更新了,累,工作累,各种累,想换个工作,突然发现找不到合适的工作了,哎,自己往火坑里跳,怪不得别人. import idautils import idaapi import idc prin ...

  10. python之列表详解

    一组数据的集合,可以重复, 集合不可以重复 列表的定义 a=[] list(a) 常用操作 # 增加ss.append(1)#加到末尾ss.insert(0,7)#list_name.insert(i ...