docker 网络简介

docker 在安装时会默认创建三个网络,bridge(创建容器默认连接到此网络)、 nonehost

  • host 直接和宿主机共用网络。
  • bridge 网络隔离,通过虚拟网桥(一般是 docker0)与宿主机通信。
  • none 禁用网络功能。

docker network ls 可查看网络设置,输出如下:

NETWORK ID     NAME             DRIVER    SCOPE
1363ad4ba2a5   bridge           bridge    local
715796504a13   host             host      local
723f2680cdad   none             null      local

创建容器时的网络初始化

Docker 创建一个容器的时候,会执行如下操作:

  1. 创建一对虚拟接口,分别放到本地主机和新容器中;
  2. 本地主机一端桥接到默认的 docker0 或指定网桥上,并具有一个唯一的名字,如 veth65f9
  3. 容器一端放到新容器中,并修改名字作为 eth0,这个接口只在容器的命名空间可见;
  4. 从网桥可用地址段中获取一个空闲地址分配给容器的 eth0,并配置默认路由到桥接网卡 veth65f9

完成这些之后,容器就可以使用 eth0 虚拟网卡来连接其他容器和其他网络。

使用宿主机 IP

host 模式

该模式下容器可以直接使用 127.0.0.1, localhost 来访问宿主机。

docker 中使用 --network host 来为容器配置 host 网络:

docker run --network host host-main

docker-compose 使用 network_mode: "host" 进行配置:

version: "3"
    
services:
  main:
    build:
      context: .
      dockerfile: ./dockerfile
    network_mode: "host"

bridge 模式

Linux

可以使用宿主机在 docker0 上的 IP 来代替 localhost

  1. 查询宿主机 IP
ip addr show docker0
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default 
    link/ether 02:42:5a:02:53:f5 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:5aff:fe02:53f5/64 scope link 
       valid_lft forever preferred_lft forever

可以发现宿主机的 IP172.17.0.1,那么将地址 http://localhost:4780 改为 http://172.17.0.1:4780 即可访问。

Windows

同理,Windows 中我们也可以找到虚拟网卡,查看 IP 进行更换
在这里插入图片描述

http://localhost:4780 => http://192.168.236.129:4780

Windows 还可以通过 host.docker.internal 这个特殊的 DNS 名称来解析宿主机 IPhosts 映射在 C:\Windows\System32\drivers\etc\hosts,文件内容如下:
在这里插入图片描述

http://localhost:4780 => http://host.docker.internal:4780

参考

官网
Docker网络
Docker网络详解——原理篇
Docker容器访问宿主机网络

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐