文章目录

  • 一、Docker网络原理
    • 1.1**容器内先安装net-tools工具yum install -y net-tools然后查看容器IP(container ip)**
    • 1.2**默认网络**

一、Docker网络原理

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

[root@localhost ~]# ifconfig
docker0: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255ether 02:42:b1:c5:3b:4f  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

1.1容器内先安装net-tools工具yum install -y net-tools然后查看容器IP(container ip)

[root@localhost ~]# yum install -y net-tools
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND       CREATED         STATUS    PORTS     NAMES
2d1f43c3d536   tomcat:latest   "/bin/bash"   6 seconds ago   Created             reverent_banzai#使用大写p进行随机端口映射
[root@localhost ~]# docker run -itd --name test1 -P tomcat
95fffcb47dbbd93ed798ada33a54b2aa5b17d8fb1e4a7ab73fb638501ca54a5b
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND             CREATED         STATUS                            PORTS                                         NAMES
95fffcb47dbb   tomcat          "catalina.sh run"   5 seconds ago   Up 4 seconds                      0.0.0.0:49153->8080/tcp, :::49153->8080/tcp   test1
2d1f43c3d536   tomcat:latest   "/bin/bash"         2 minutes ago   Exited (137) About a minute ago                                                 reverent_banzai#使用小写p加端口进行指定的端口映射
[root@localhost ~]# docker run -itd --name test2 -p 49110:80 tomcat
581f77fc4c7cd42d2c41bd9126d9ff0226583e3368d8366dedb1a56e4417a389
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND             CREATED         STATUS                       PORTS                                               NAMES
581f77fc4c7c   tomcat          "catalina.sh run"   3 seconds ago   Up 2 seconds                 8080/tcp, 0.0.0.0:49110->80/tcp, :::49110->80/tcp   test2
95fffcb47dbb   tomcat          "catalina.sh run"   2 minutes ago   Up 2 minutes                 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp         test1
2d1f43c3d536   tomcat:latest   "/bin/bash"         4 minutes ago   Exited (137) 3 minutes ago                                                       reverent_banzai#测试
分别登录192.168.237.141:49110和192.168.237.141:49153可以访问tomcat页面#可以访问是因为通过iptables的DNAT进行了转换
[root@localhost ~]# iptables -nL -t nat
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0            0.0.0.0/0            ADDRTYPE match dst-type LOCALChain INPUT (policy ACCEPT)
target     prot opt source               destination         Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
DOCKER     all  --  0.0.0.0/0           !127.0.0.0/8          ADDRTYPE match dst-type LOCALChain POSTROUTING (policy ACCEPT)
target     prot opt source               destination
MASQUERADE  all  --  172.17.0.0/16        0.0.0.0/0
RETURN     all  --  192.168.122.0/24     224.0.0.0/24
RETURN     all  --  192.168.122.0/24     255.255.255.255
MASQUERADE  tcp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  udp  --  192.168.122.0/24    !192.168.122.0/24     masq ports: 1024-65535
MASQUERADE  all  --  192.168.122.0/24    !192.168.122.0/24
MASQUERADE  tcp  --  172.17.0.2           172.17.0.2           tcp dpt:8080
MASQUERADE  tcp  --  172.17.0.3           172.17.0.3           tcp dpt:80Chain DOCKER (2 references)
target     prot opt source               destination
RETURN     all  --  0.0.0.0/0            0.0.0.0/0
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:49153 to:172.17.0.2:8080
DNAT       tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:49110 to:172.17.0.3:80

1.2默认网络

当你安装Docker时,它会自动创建三个网络。你可以使用以下docker network ls命令列出这些网络

[root@localhost ~]# docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
69b39f1a9e1a   bridge    bridge    local
da57f14ea87a   host      host      local
b3681285c530   none      null      local

Docker网络类型

网络类型 描述
Host 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口
Container 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围
None 该模式关闭了容器的网络功能
Bridge 默认为该模式,此模式会为每一个 容器分配、设置IP等,并将容器连接到一个docker0虛拟网桥,通过docker0网桥以及iptables nat表配置与宿主机通信
自定义网络模式 安装Docker时,它会自动创建三个网络,bridge (创建容器默认连接到此网络)、none 、host

使用docker run 创建Docker容器时,可以用–net或–network 选项指定容器的网络模式

网络类型 描述
host模式 使用–net=host指定
Container模式 使用–net=none 指定
None模式 使用–net=container:NAME_ _or_ID指定
Bridge模式 使用–net=bridge指定,默认设置,可省略

Host模式
Host 模式并没有为容器创建一个隔离的网络环境。而之所以称之为host模式,是因为该模式下的 Docker 容器会和 host 宿主机共享同一个网络 namespace,故 Docker Container可以和宿主机一样,使用宿主机的eth0,实现和外界的通信。换言之,Docker Container的 IP 地址即为宿主机 eth0 的 IP 地址,其特点包括:

(1)这种模式下的容器没有隔离的 network namespace
(2)容器的 IP 地址同 Docker host 的 IP 地址
(3)需要注意容器中服务的端口号不能与 Docker host 上已经使用的端口号相冲突
(3)host 模式能够和其它模式共存
container模式
Container 网络模式是 Docker 中一种较为特别的网络的模式。处于这个模式下的 Docker 容器会共享其他容器的网络环境,因此,至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的容器存在网络隔离

[root@localhost ~]# docker inspect -f '{{.State.Pid}}' 95fffcb47dbb   #查看容器进程PID
5996
[root@localhost ~]# ls -l /proc/5996/ns
总用量 0
lrwxrwxrwx. 1 root root 0 7月  10 23:58 ipc -> ipc:[4026532623]
lrwxrwxrwx. 1 root root 0 7月  10 23:58 mnt -> mnt:[4026532621]
lrwxrwxrwx. 1 root root 0 7月  10 23:38 net -> net:[4026532626]   #查看container模式的Network Namespace
lrwxrwxrwx. 1 root root 0 7月  10 23:58 pid -> pid:[4026532624]
lrwxrwxrwx. 1 root root 0 7月  10 23:58 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 7月  10 23:58 uts -> uts:[4026532622][root@localhost ~]# docker run -itd --name test4 --net=container:95fffcb47dbb centos bash
590162d14ba58f544969ab80754389f6667799f27e92b276013f6cc83b71907f
[root@localhost ~]# docker ps -a
CONTAINER ID   IMAGE           COMMAND             CREATED          STATUS                        PORTS                                               NAMES
590162d14ba5   centos          "bash"              27 seconds ago   Up 26 seconds                                                                     test4
431ecd6d0eec   tomcat          "bash"              5 minutes ago    Up 5 minutes                                                                      test3
581f77fc4c7c   tomcat          "catalina.sh run"   25 minutes ago   Up 25 minutes                 8080/tcp, 0.0.0.0:49110->80/tcp, :::49110->80/tcp   test2
95fffcb47dbb   tomcat          "catalina.sh run"   27 minutes ago   Up 27 minutes                 0.0.0.0:49153->8080/tcp, :::49153->8080/tcp         test1
2d1f43c3d536   tomcat:latest   "/bin/bash"         30 minutes ago   Exited (137) 29 minutes ago                                                       reverent_banzai
[root@localhost ~]# docker inspect -f '{{.State.Pid}}' 590162d14ba5
6713
[root@localhost ~]# ls -l /proc/6713/ns
总用量 0
lrwxrwxrwx. 1 root root 0 7月  11 00:06 ipc -> ipc:[4026532845]
lrwxrwxrwx. 1 root root 0 7月  11 00:06 mnt -> mnt:[4026532843]
lrwxrwxrwx. 1 root root 0 7月  11 00:06 net -> net:[4026532626]   #container模式的Network Namespace和上面的一致
lrwxrwxrwx. 1 root root 0 7月  11 00:06 pid -> pid:[4026532846]
lrwxrwxrwx. 1 root root 0 7月  11 00:06 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 7月  11 00:06 uts -> uts:[4026532844]

none模式
网络模式为 none,即不为 Docker 容器构造任何网络环境。一旦Docker 容器采用了none 网络模式,那么容器内部就只能使用loopback网络设备,不会再有其他的网络资源。Docker Container的none网络模式意味着不给该容器创建任何网络环境,容器只能使用127.0.0.1的本机网络
bridge模式
Docker 容器默认使用 bridge 模式的网络。其特点如下:

(1)使用一个 linux bridge,默认为 docker0
(2)使用 veth 对,一头在容器的网络 namespace 中,一头在 docker0 上
(3)该模式下Docker Container不具有一个公有IP,因为宿主机的IP地址与veth pair的 IP地址不在同一个网段内
(4)Docker采用 NAT 方式,将容器内部的服务监听的端口与宿主机的某一个端口port 进行“绑定”,使得宿主机以外的世界可以主动将网络报文发送至容器内部
(5)外界访问容器内的服务时,需要访问宿主机的 IP 以及宿主机的端口 port
(6)NAT 模式由于是在三层网络上的实现手段,故肯定会影响网络的传输效率
(7)容器拥有独立、隔离的网络栈;让容器和宿主机以外的世界通过NAT建立通信
自定义网络模式创建步骤

[root@localhost ~]# docker network create --subnet=172.18.0.0/16 --opt "com.docker.network.bridge.name"="docker1" mynetwork
dc47693a08090ecfbccdfef829aad2dfe1e6104dbe35f663935c0b3937e39d25[root@localhost ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.17.0.1  netmask 255.255.0.0  broadcast 172.17.255.255inet6 fe80::42:b1ff:fec5:3b4f  prefixlen 64  scopeid 0x20<link>ether 02:42:b1:c5:3b:4f  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 12  bytes 1668 (1.6 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0docker1: flags=4099<UP,BROADCAST,MULTICAST>  mtu 1500inet 172.18.0.1  netmask 255.255.0.0  broadcast 172.18.255.255ether 02:42:94:ae:e6:48  txqueuelen 0  (Ethernet)RX packets 0  bytes 0 (0.0 B)RX errors 0  dropped 0  overruns 0  frame 0TX packets 0  bytes 0 (0.0 B)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

指定IP运行docker

[root@localhost ~]# docker run -it --name test7 --net mynetwork --ip 172.18.0.15 centos:7 /bin/bash
[root@228a9b43ff7b /]# yum install net-tools[root@228a9b43ff7b /]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500inet 172.18.0.15  netmask 255.255.0.0  broadcast 172.18.255.255ether 02:42:ac:12:00:0f  txqueuelen 0  (Ethernet)RX packets 2895  bytes 23643460 (22.5 MiB)RX errors 0  dropped 0  overruns 0  frame 0TX packets 2007  bytes 111783 (109.1 KiB)TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

Docker--网络详解相关推荐

  1. Docker网络详解——原理篇

    前言 当你开始大规模使用Docker时,你会发现需要了解很多关于网络的知识.Docker作为目前最火的轻量级容器技术,有很多令人称道的功能,如Docker的镜像管理.然而,Docker同样有着很多不完 ...

  2. 云原生时代必须具备的核心技能之Docker高级篇(Docker网络详解)

      前面给大家项目的介绍了Docker的基础内容 Docker基础篇 接下来给大家系统的介绍下Docker高级篇的内容:网络核心.Docker实战.DockerCompose.Harbor以及Swar ...

  3. Docker 网络详解

    前置网络知识 OSI七层网络模型 从下到上依次为:物理层.数据链路层.网络层.传输层.会话层.表示层.应用层. 交换机:处在第二次,也就是数据链路层.作用:通过一个或者多个设备将不同子网连接在一起,相 ...

  4. 小白都能懂的 玩转docker系列之 Docker网络详解(超详细)

    首先移掉之前所有的容器: [root@xiaoxiao tomcat]# docker rm $(docker ps -aq) fcfddcab1789 [root@xiaoxiao tomcat]# ...

  5. Docker学习之路(三)Docker网络详解

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

  6. Dockerfile详解、镜像发布、网络详解学习

    一.DockerFile 1.Docker介绍 Dockerfile是用来构建Docker镜像的文件是命令参数脚本.docker build命令用于从Dockerfile构建镜像.可以在docker ...

  7. ResNet网络详解与keras实现

    ResNet网络详解与keras实现 ResNet网络详解与keras实现 Resnet网络的概览 Pascal_VOC数据集 第一层目录 第二层目录 第三层目录 梯度退化 Residual Lear ...

  8. GoogleNet网络详解与keras实现

    GoogleNet网络详解与keras实现 GoogleNet网络详解与keras实现 GoogleNet系列网络的概览 Pascal_VOC数据集 第一层目录 第二层目录 第三层目录 Incepti ...

  9. Linux系统下ifconfig和route配置网络详解

    Linux系统下ifconfig和route配置网络详解 ifconfig和route合用于配置网络(ip命令综合二者功能,此处不讲),通常在前者设置好ip地址等信息后,采用route命令配置路由.( ...

  10. EfficientNetV2网络详解

    原论文名称:EfficientNetV2: Smaller Models and Faster Training 论文下载地址:https://arxiv.org/abs/2104.00298 原论文 ...

最新文章

  1. 引用头文件#include queue出错
  2. Beautiful Soup-4.2.0
  3. vb链接mysql登录界面_求大神!有谁会用VB设计用户登陆界面连接到数据库
  4. 无风扇网站服务器,这款服务器采用无风扇设计
  5. 恭喜!已获8个院士的他,又新当选德国院士!
  6. Object.assign()怎么用?
  7. LG_3459_[POI2007]MEG-Megalopolis
  8. 蘑菇车联打造一体化解决方案,致力产业协同发展
  9. css重新认识(2)
  10. 【洛谷习题】售货员的难题
  11. kubernets nodeport 无法访问
  12. cygwin安装gcc/g++
  13. 小颗粒积木步骤图纸_loz小颗粒钻石积木拼图图纸谁有
  14. PowerDesigner16配置显示注释comment配置方法
  15. ie不能加载flash html,ie浏览器flash无法加载怎么修复_win7系统ie浏览器flash加载不了如何解决-系统城...
  16. 40套各种风格游戏行业网站html5模板wap手机游戏资讯网站模板游戏动漫设计公司html模板游戏公司网站模板html5网页静态模板Bootstrap扁平化网站源码css3手机seo自适响应
  17. 软件java安卓版_AIDE软件下载-AIDE【Java开发IDE软件】下载v3.2.18 安卓版-西西软件下载...
  18. 中文分词jieba python 学习
  19. 跨境电商独立站是如何布局的-扬帆凌远
  20. DDoS 的肉鸡都是哪来的?

热门文章

  1. 关于grep,sed,awk的几个用法
  2. 如何移除Chrome浏览器让人不爽的GoogleUpdate.exe后台更新进程
  3. 【计算机毕业设计】美容美发微信小程序的设计与实现
  4. 06解决Anaconda3安装完成后在开始菜单找不到的问题
  5. c语言字母分别代表的意思,C语言中%c,%s分别代表什么意思? 在C语言中c% 和 d% 是表示什么意思?...
  6. 什么是业务对象?业务逻辑是什么?
  7. Go 青年团聚召集令,2050,我们来了
  8. springboot中hibernate validator校验模式,分组校验,自定义校验
  9. [6.2] UI Automation with the Modern Experience-UiPath ARD Certification Training
  10. 一个完整的软件研发流程是怎样的?