Docker是一种轻量级容器化技术,允许通过隔离OS级的虚拟化方式在一个操作系统上运行多个应用。网络是Docker中的一个非常重要的组件,它允许容器之间进行通信和联网访问。本文介绍Docker网络的基础知识,包括网络类型、网络驱动程序和网络配置等方面。
一、Docker网络概述
Docker网络有三个基本要素:网络类型、网络驱动程序和网络配置。
Docker支持四种类型的网络:
bridge:这是默认的网络类型,建立在宿主机的网络接口之上。容器默认使用这个网络类型。
host:这种网络类型,直接使用宿主机的网络栈,容器和宿主机共享网络栈。
overlay:这种网络类型可以跨越多个Docker守护进程,通过内置的DNS服务,允许容器之间跨主机进行通信。
macvlan:这种方式可以让容器拥有自己的MAC地址,从而可以直接与物理网络中的设备进行通信。
二、Docker网络 驱动
Docker支持多种网络驱动程序,每种网络驱动的实现方式都不同。下面列出了Docker支持的网络驱动程序。
1、bridge驱动:此驱动为Docker的默认设置,docker安装时会创建一个名为 docker0 的Linux bridge,新建的容器会自动桥接到这个接口。但与外界通信使用NAT,增加了通信的复杂性,在复杂场景下使用会有诸多限制。
2、host驱动:使用这种驱动的时候,Docker容器和宿主机共用同一个network namespace,使用宿主机的网卡、IP和端口等信息。但是,容器其他方面,如文件系统、进程列表等还是和宿主机隔离的。host模式不存在虚拟化网络带来的额外性能负担。但是host驱动也降低了容器与容器之间、容器与宿主机之间网络层面的隔离性,引起网络资源的竞争与冲突。
3、overlay驱动:此驱动采用IETF标准的VXLAN方式,并且是VXLAN中被普遍认为最适合大规模的云计算虚拟化环境的SDN controller模式。在使用的过程中,需要一个额外的配置存储服务, 还需要在启动Docker daemon的的时候额外添加参数来指定所使用的配置存储服务地址。
4、remote驱动:这个驱动实际上并未做真正的网络服务实现,而是调用了用户自行实现的网络驱动插件,使libnetwork实现了驱动的可插件化。
5、null驱动:使用这种驱动的时候,Docker容器拥有自己的network namespace,但是并不为Docker容器进行任何网络配置。也就是说,这个Docker容器除了network namespace自带的loopback网卡外,没有其他任何网卡、IP、路由等信息,需要用户为Docker容器添加网卡、配置IP等。这种模式如果不进行特定的配置是无法正常使用的,但是优点也非常明显,它给了用户最大的自由度来自定义容器的网络环境。
三-、docker网络配置
docker安装后会自动创建3种网络:bridge、host、none
可以用命令docker network ls查看
Docker的网络配置包括以下几个方面:
网络使用:容器可以连接到多个网络。
IP地址:容器可以使用静态或动态IP地址。
网络别名:容器可以使用多个别名来访问网络。
网络作用域:容器可以选择使用全局或本地作用域的网络。
在Docker中,可以使用以下命令来进行网络配置:
以下是对这些命令的举例说明及用途: 1. `docker network create`:创建一个新的Docker网络。 例如:`docker network create my-network` 用途:创建一个名为"my-network"的Docker网络,供容器使用。 2. `docker network connect`:将容器连接到一个已存在的Docker网络。 例如:`docker network connect my-network my-container` 用途:将名为"my-container"的容器连接到名为"my-network"的Docker网络,使容器可以与该网络中的其他容器进行通信。 3. `docker network inspect`:检查一个Docker网络的详细信息。 例如:`docker network inspect my-network` 用途:获取名为"my-network"的Docker网络的详细信息,包括网络标识符、容器连接到该网络的信息等。 4. `docker network rm`:删除一个已存在的Docker网络。 例如:`docker network rm my-network` 用途:删除名为"my-network"的Docker网络,该网络及其相关联的容器将被移除,停止容器之间的通信和连接。 这些命令提供了管理Docker网络的功能,可以方便地创建、连接、检查和删除网络,使容器之间能够进行通信和连接。
docker network create docker network connect docker network inspect docker network rm
#参数
host模式:使用 --net=host 指定。
none模式:使用 --net=none 指定。
bridge模式:使用 --net=bridge 指定,默认设置,不需要加。
container模式:使用 --net=container:NAME_or_ID 指定。
1、bridge驱动
Docker默认网络模式是bridge模式, docker0网桥是在docker daemon启动时自动创建的,之后创建的docker容器都会在docker0自网范围内选取一个未占用的ip并连接到docker0网桥上,docker0以veth pair连接各容器的网络,容器中的数据通过docker0网桥转发到eth0网卡上。
veth pair:就是一对的虚拟设备接口,它都是成对出现的。一端连着协议栈,一端彼此相连着。
docker0网桥的概念等同于交换机,为连在其上的设备转发数据帧。网桥上的veth网卡设备相当 于交换机上的端口,可以将多个容器或虚拟机连接在其上,这些端口工作在二层(数据链路层),所以是不需要配置IP信息的。下图docker0网桥就为连在其上的容器转发数据帧,使得同一台宿主机上的Docker 容器之问可以相互通信。docker0是普通的Linux网桥,它是可以在上面配置IP的,可以认为其内部有一个可以用于配置IP信息的网卡接口。在Docker的桥接 网络模式中,docker0的IP地址作为连于之上的容器的默认网关地址存在。
外面的机器是如何访问Docker容器的服务?
创建一个web应用的容器,将容器的80端口映射到主机的80端口
docker run --name=nginx_bridge --net=bridge -p 80:80 -d nginx
查看Iptable规则的变化:
-A DOCKER ! -i docker0 -p tcp -m tcp --dport 80 -j DNAT --to-destination 172.17.0.2:80
此条规则就是对主机eth0收到的目的端口为80的tcp流量进行DNAT转换,将流量发往172.17.0.2:80,也就是我们上面创建的Docker容器。所以,外界只需访问10.10.101.105:80就可以访问到容器中的服务。
无需加--net=bridge参数。
创建容器方法
docker run -dit -p 3306:3306 --name imagename --restart always imagename:tag(版本号)
访问方式:宿主机IP:映射端口
2、host驱动
host模式可以让容器共享宿主机网络栈,外部主机与容器直接通信,但是容器的网络缺少隔离性。
host网络模式在创建时需指定: --network=host
##创建容器,指定参数 docker run -dit --network host --name imagesname
3、none
none模式是指禁用网络功能,只有lo接口,在容器创建时使用。
##创建容器,指定参数--network=none docker run -it --rm --network none busybox
4、自定义网络(Custom Network)
- 创建自定义网络:
docker network create my-custom-network
还可以自定义Docker使用的IP地址、DNS信息、网桥等
##指定网关以及IP范围 docker network create --subnet=192.168.1.0/24 --gateway=192.168.1.1 image-network ##指定子网以及IP范围 docker network create --subnet 172.20.0.0/16 --ip-range 172.20.240.0/20 image-network
- 在自定义网络上启动容器:
docker run -d --name imagename --network images-network imagename:tag
5、Overlay网络(Overlay Network)
- 创建覆盖网络:
docker network create --driver overlay my-overlay-network
- 在覆盖网络上启动容器:
docker run -d --name my-container --network my-overlay-network my-image
6、 MACVLAN网络(MACVLAN Network)
Macvlan是一个新的尝试,是真正的网络虚拟化技术的转折点。Linux实现非常轻量级,因为与传统的Linux Bridge隔离相比,它们只是简单地与一个Linux以太网接口或子接口相关联,以实现网络之间的分离和与物理网络的连接。
Macvlan提供了许多独特的功能,并有充足的空间进一步创新与各种模式。这些方法的两个高级优点是绕过Linux网桥的正面性能以及移动部件少的简单性。删除传统上驻留在Docker主机NIC和容器接口之间的网桥留下了一个非常简单的设置,包括容器接口,直接连接到Docker主机接口。由于在这些情况下没有端口映射,因此可以轻松访问外部服务。
- 创建MACVLAN网络:
docker network create -d macvlan --subnet=192.168.1.0/24 --gateway=192.168.1.1 -o parent=eth0 my-macvlan-network
- 在MACVLAN网络上启动容器:
docker run -d --name my-container --network my-macvlan-network my-image
标签:容器,network,--,网络,详解,Docker,docker From: https://www.cnblogs.com/elfin/p/17607838.html