本节我们来看看Docker网络,我们这里主要讨论单机docker上的网络。当docker安装后,会自动在服务器中创建三种网络:none、host和bridge,接下来我们分别了解下这三种网络:

  1. $ sudo docker network ls
  2. NETWORK ID NAME DRIVER SCOPE
  3. 528c3d49c302 bridge bridge local
  4. 464b3d11003c host host local
  5. faa8eb8310b4 none null local

一、none网络

none网络就是什么都没有的网络,使用此网络的容器除了lo没有其他任何网卡,所以此容器不提供任何网络服务,也无法访问其它容器,那么这种封闭网络有什么用呢?这个一般会用于对网络安全要求较高并且不需要联网的应用。

  1. $ sudo docker run -it --network=none busybox
  2. / # ifconfig
  3. lo Link encap:Local Loopback
  4. inet addr:127.0.0.1 Mask:255.0.0.0
  5. UP LOOPBACK RUNNING MTU:65536 Metric:1
  6. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  7. TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
  8. collisions:0 txqueuelen:1000
  9. RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

二、host网络

使用host网络的容器将共享docker host的网络栈,容器的网络配置与host一样。大家可以发现,使用此网络的容器能看到服务器所有网卡,这种网络模式的使用场景是那些对网络传输效率要求较高的应用,当然此模式也存在不够灵活的问题,例如端口冲突问题。

  1. $ sudo docker run -it --network=host busybox
  2. / # ifconfig
  3. docker0 Link encap:Ethernet HWaddr 02:42:6B:5A:FC:54
  4. UP BROADCAST MULTICAST MTU:1500 Metric:1
  5. RX packets:0 errors:0 dropped:0 overruns:0 frame:0
  6. TX packets:17 errors:0 dropped:0 overruns:0 carrier:0
  7. collisions:0 txqueuelen:0
  8. RX bytes:0 (0.0 B) TX bytes:1526 (1.4 KiB)
  9.  
  10. ens33 Link encap:Ethernet HWaddr 00:0C:29:D5:73:1C
  11. inet addr:172.16.194.135 Bcast:172.16.194.255 Mask:255.255.255.0
  12. inet6 addr: fe80::20c:29ff:fed5:731c/64 Scope:Link
  13. UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
  14. RX packets:32097 errors:0 dropped:0 overruns:0 frame:0
  15. TX packets:20666 errors:0 dropped:0 overruns:0 carrier:0
  16. collisions:0 txqueuelen:1000
  17. RX bytes:24596169 (23.4 MiB) TX bytes:9708382 (9.2 MiB)
  18.  
  19. lo Link encap:Local Loopback
  20. inet addr:127.0.0.1 Mask:255.0.0.0
  21. inet6 addr: ::1/128 Scope:Host
  22. UP LOOPBACK RUNNING MTU:65536 Metric:1
  23. RX packets:270 errors:0 dropped:0 overruns:0 frame:0
  24. TX packets:270 errors:0 dropped:0 overruns:0 carrier:0
  25. collisions:0 txqueuelen:1000
  26. RX bytes:24089 (23.5 KiB) TX bytes:24089 (23.5 KiB)

三、bridge网络

Docker安装时会创建一个名为docker0的网桥(使用brctl工具可以查看Linux下所有网桥),容器启动时如果不指定--network则默认都是bridge网络。

  1. $ brctl show
  2. bridge name bridge id STP enabled interfaces
  3. docker0 8000.02426b5afc54 no

此时我们启动一个Nginx容器看看该网桥的变化:

  1. $ sudo docker run -d nginx
  2. 27644bd64114482f58adc47a52d3f768732c0396ca0eda8f13e68b10385ea359
  3. $ brctl show
  4. bridge name bridge id STP enabled interfaces
  5. docker0 8000.0242cef1fc32 no vethe21ab12

我们可以看到此时一个新的网络接口vethe21ab12挂到docker0上,vethe21ab12就是Nginx容器的虚拟网卡。我们接着去Nginx容器中看看网络配置情况:

  1. $ sudo docker exec -it 27644bd64114 bash
  2. root@27644bd64114:/# ip a
  3. 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
  4. link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
  5. inet 127.0.0.1/8 scope host lo
  6. valid_lft forever preferred_lft forever
  7. 45: eth0@if46: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default
  8. link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
  9. inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
  10. valid_lft forever preferred_lft forever

我们看到容器中有一个网卡eth0@if46,为什么不是vethe21ab12呢?实际上,eth0@if46和vethe21ab12是一对veth-pair,那什么是veth-pair呢?

veth-pair是一种虚拟设备接口,它是成对出现的,一端连着协议栈,一端彼此相连着,在本例中大家可以想象成它们是由一根虚拟网线连接起来的一对网卡,网卡的一头(eth0@if46)在容器里,另一头(vethe21ab12)挂在网桥docker0上,最终的效果就是把eth0@if46也挂在docker0上。

我们还能看到这个容器中eth0@if46配置的ip是172.17.0.2,为什么是这个网段呢?我们看下网桥的网络配置:

  1. $ sudo docker network inspect bridge
  2. [
  3. {
  4. "Name": "bridge",
  5. "Id": "6f0087fd32cd0e3b4a7ef1133e2f5596a2e74429cf5240e42012af85d1146b9f",
  6. "Created": "2021-10-17T06:43:11.849460184Z",
  7. "Scope": "local",
  8. "Driver": "bridge",
  9. "EnableIPv6": false,
  10. "IPAM": {
  11. "Driver": "default",
  12. "Options": null,
  13. "Config": [
  14. {
  15. "Subnet": "172.17.0.0/16",
  16. "Gateway": "172.17.0.1"
  17. }
  18. ]
  19. },
  20. "Internal": false,
  21. "Attachable": false,
  22. "Ingress": false,
  23. "ConfigFrom": {
  24. "Network": ""
  25. },
  26. "ConfigOnly": false,
  27. "Containers": {
  28. "27644bd64114482f58adc47a52d3f768732c0396ca0eda8f13e68b10385ea359": {
  29. "Name": "lucid_moore",
  30. "EndpointID": "b6c9de5a52e2f0b858a6dbf6c8e51b535aec3500fca7d1f1dcca98613e57dabd",
  31. "MacAddress": "02:42:ac:11:00:02",
  32. "IPv4Address": "172.17.0.2/16",
  33. "IPv6Address": ""
  34. }
  35. },
  36. "Options": {
  37. "com.docker.network.bridge.default_bridge": "true",
  38. "com.docker.network.bridge.enable_icc": "true",
  39. "com.docker.network.bridge.enable_ip_masquerade": "true",
  40. "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
  41. "com.docker.network.bridge.name": "docker0",
  42. "com.docker.network.driver.mtu": "1500"
  43. },
  44. "Labels": {}
  45. }
  46. ]
  47. $ ifconfig docker0
  48. docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
  49. inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
  50. inet6 fe80::42:ceff:fef1:fc32 prefixlen 64 scopeid 0x20<link>
  51. ether 02:42:ce:f1:fc:32 txqueuelen 0 (Ethernet)
  52. RX packets 2827 bytes 115724 (115.7 KB)
  53. RX errors 0 dropped 0 overruns 0 frame 0
  54. TX packets 3853 bytes 10144700 (10.1 MB)
  55. TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0

原来网桥的网络配置的subnet就是172.17.0.0,网关则是172.17.0.1。这个网关就在docker0上,所以当前容器网络拓扑图如下:

四、后记

大家在进行本篇的实验时,可能会遇到如下问题:

1、进入Nginx容器后,没有ip命令?

这个命令需要自行在容器中安装:apt-get install iproute2

2、安装iproute2时发现容器无法连接网络。

首先我们需要重建docker0网络:

  1. $ sudo pkill docker
  2. $ sudo iptables -t nat -F
  3. $ sudo ifconfig docker0 down
  4. $ sudo btctl delbr docker0
  5. $ sudo systemctl restart docker

接着启动容器并进入容器,更新软件源:

  1. root@27644bd64114:/# apt-get update
  2. Get:1 http://security.debian.org/debian-security buster/updates InRelease [65.4 kB]
  3. Get:2 http://deb.debian.org/debian buster InRelease [122 kB]
  4. Get:3 http://security.debian.org/debian-security buster/updates/main amd64 Packages [307 kB]
  5. Get:4 http://deb.debian.org/debian buster-updates InRelease [51.9 kB]
  6. Get:5 http://deb.debian.org/debian buster/main amd64 Packages [7906 kB]
  7. Get:6 http://deb.debian.org/debian buster-updates/main amd64 Packages [15.2 kB]
  8. Fetched 8467 kB in 14s (603 kB/s)
  9. Reading package lists... Done

最后安装iproute2即可。

Docker 与 K8S学习笔记(七)—— 容器的网络的更多相关文章

  1. Docker 与 K8S学习笔记(二)—— 容器核心知识梳理

    本篇主要对容器相关核心知识进行梳理,通过本篇的学习,我们可以对容器相关的概念有一个全面的了解,这样有利于后面的学习. 一.什么是容器? 容器是一种轻量级.可移植.自包含的软件打包技术,使应用程序可以在 ...

  2. docker学习笔记:容器的网络设置

    创建一个docker容器,docker系统会自动为该容器分配一个ip地址,通常是172.17开头. 我们可以在主机上用 docker inspect 命令 或者进入容器用ifconfig命令来查看容器 ...

  3. Docker 与 K8S学习笔记(三)—— 镜像的使用

    前面的文章介绍过镜像的三种获取方式: 下载并使用别人创建好的镜像: 在现有镜像上创建新的镜像: 从无到有创建镜像. 本文主要介绍前两种. 一.下载镜像 在Docker Hub上有大量优质镜像可以使用, ...

  4. Docker 与 K8S学习笔记(十八)—— Pod的使用

    Pod 是一组紧密关联的容器集合,它们共享IPC.Network和UTS namespace,是 Kubernetes 调度的基本单元.Pod 的设计理念是支持多个容器在一个 Pod 中共享网络和文件 ...

  5. Docker 与 K8S学习笔记(九)—— 容器间通信

    容器之间可通过IP.Docker DNS Server或joined三种方式进行通信,今天我们来详细学习一下. 一.IP通信 IP通信很简单,前一篇中已经有所涉及了,只要容器使用相同网络,那么就可以使 ...

  6. Docker 与 K8S学习笔记(五)—— 容器的操作(下篇)

    上一篇我们学习了容器的启动和常用的进入容器的方式,今天我们来看看如何控制容器起停以及容器删除操作. 一.stop.kill.start和restart stop.kill命令都可以停止运行的容器,二者 ...

  7. Docker 与 K8S学习笔记(十)—— 容器的端口映射

    我们一般将应用部署在容器里面,而一个服务器上会有许许多多的容器,那么外界该如何访问我们的应用呢?答案是:端口映射. Docker可以将容器对外提供服务的端口映射到host的某个端口上,外网通过此端口访 ...

  8. Docker 与 K8S学习笔记(八)—— 自定义容器网络

    我们在上一篇中介绍了Docker中三种网络,none.host和bridge,除了这三种网络,Docker还允许我们创建自定义网络,当我们要创建自定义网络时,Docker提供了三种网络驱动供我们选择: ...

  9. Docker 与 K8S学习笔记(六)—— 容器的资源限制

    我们在启动Docker容器时,默认情况下容器所使用的资源是没有限制的,这样就会存在部分特别耗资源的容器会占用大量系统资源,从而导致其他容器甚至整个服务器性能降低,为此,Docker提供了一系列参数方便 ...

随机推荐

  1. kubectl logs查看日志时出现failed to create fsnotify watcher: too many open files

    因为系统默认的 fs.inotify.max_user_instances=128 太小,在查看日志的pod所在节点重新设置此值: 临时设置 sudo sysctl fs.inotify.max_us ...

  2. C# CheckBoxList-DropDownList回显、筛选回显

    <asp:CheckBoxList ID="ddlType" runat="server" RepeatColumns="10" Re ...

  3. 1 — 第一个springboot

    1.什么是springboot? 老规矩:百度百科一下 2.对springboot快速上手 1).第一种方式:通过官网来创建springboot项目 ---- 了解即可 这里面的创建方式不做过多说明, ...

  4. 转 Android中Activity的启动模式(LaunchMode)和使用场景

    转载请注明出处:http://blog.csdn.net/sinat_14849739/article/details/78072401本文出自Shawpoo的专栏我的简书:简书 一.为什么需要启动模 ...

  5. xtrabackup原理

    常用命令 innobackupex --defaults-file=/data/mysql_3306/my.cnf --no-timestamp --slave-info --compress --c ...

  6. 2.8 rust 枚举与模式匹配

    Enums and Pattern Matching 摘要 枚举定义 enum IpAddrKind { V4, V6, } 枚举方法 fn main() { enum Message { Quit, ...

  7. 多线程异步操作导致异步线程获取不到主线程的request信息

    org.springframework.web.context.request.RequestContextHolderorg.springframework.web.context.request. ...

  8. Activiti工作流引擎使用详解(一)

    一.IDEA安装activiti插件 在插件库中查找actiBPM,安装该插件,如果找不到该插件,请到插件库中下载该包手动安装,插件地址 http://plugins.jetbrains.com/pl ...

  9. web端 - 返回上一步,点击返回,跳转上个页面 JS

    1.方法一: <script language="javascript" type="text/javascript"> window.locati ...

  10. 【C/C++】例题 4-2 刽子手游戏/算法竞赛入门经典/函数和递归

    [题目] 猜单词游戏. 计算机想一个单词让你猜,你每次猜一个字母. 如果单词里有那个[字母],[所有该字母会显示出来]. 如果没有那个字母,算猜错一次.[最多只能猜错六次] 猜一个已经猜过的字母也算错 ...