文章目录
- Docker容器网络
- 1.Docker为什么需要网络管理
- 2. Docker网络简介
- 3. 常见的网络类型
- 4. docker 网络管理命令
- 5.两种网络加入差异
- 6.网络讲解
- docker Bridge 网络
- docker Host 网络
- docker Container 网络
- docker none 网络
Docker容器网络
1.Docker为什么需要网络管理
容器的网络默认与宿主机及其他容器都是相互隔离, 但同时我们也要考虑下面的一些
问题, 比如
• 多个容器之间是如何通信的
• 容器和宿主机是如何通信的
• 容器和外界主机是如何通信的
• 容器中要运行一些网络应用(如 nginx、 web 应用、数据库等),如果要让外部也可
以访问这些容器内运行的网络应用应该如何实现
• 容器不想让它的网络与宿主机、与其他容器隔离应该如何实现
• 容器根本不需要网络的时候应该如何实现
• 容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)应
该如何实现
2. Docker网络简介
Docker 容器网络是为应用程序所创造的虚拟环境的一部分,它能让应用从宿主机操作
系统的网络环境中独立出来,形成容器自有的网络设备、 IP 协议栈、端口套接字、 IP
路由表、防火墙等等与网络相关的模块。Docker 为实现容器网络,主要采用的架构由三部分组成: CNM、 Libnetwork 和驱动 。
CNM
Docker 网络架构采用的设计规范是 CNM(Container Network Model)。 CNM 中规定
了 Docker 网络的基础组成要素: Sandbox、 Endpoint、 Network。
Sandbox:提供了容器的虚拟网络栈,也即端口、套接字、 IP 路由表、防火墙、
DNS 配置等内容。主要用于隔离容器网络与宿主机网络,形成了完全独立的容器网络
环境。
• Network: Docker 内部的虚拟子网,使得网络内的参与者能够进行通讯。
• Endpoint:就是虚拟网络的接口,就像普通网络接口一样, Endpoint 的主要职责
是负责创建连接。 Endpoint 类似于常见的网络适配器,那也就意味着一个 Endpoint 只
能接入某一个网络, 当容器需要接入到多个网络,就需要多个 Endpoint。
如上图所示,容器 B 有两个 Endpoint 并且分别接入 Networkd A 和 Network B。那么
容器 A 和容器 B 之间是可以实现通信的,因为都接入了 NetworkA。但是容器 A 和容
器 C 不可以通过容器 B 的两个 Endpoint 通信。
Libnetwork
Libnetwork 是 CNM 的一个标准实现。 Libnetwork 是开源库,采用 Go 语言编写(跨
平台的),也是 Docker 所使用的库, Docker 网络架构的核心代码都在这个库中。
Libnetwork 实现了 CNM 中定义的全部三个组件,此外它还实现了本地服务发现、基
于 Ingress 的容器负载均衡,以及网络控制层和管理层等功能 。
3. 常见的网络类型
-
bridge网络
bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问。Docker 容器的默认网络驱动.当我们需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择。
-
host网络
对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用主机的网络。当网络堆栈不应该与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择。
-
container网络
这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信
-
none网络
Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、 IP、路由等信息。容器完全网络隔离
-
overlay网络
借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。将多个Docker 守护进程连接在一起,使集群服务能够相互通信。当我们需要运行在不同Docker 主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择。
另外,在 Docker 安装时,会自动安装一块 Docker 网卡称为 docker0,它是一个网
桥设备,主要用于 Docker 各容器及宿主机的网络通信
[root@aliyun ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:6e:f7:9f:92 txqueuelen 0 (Ethernet)
RX packets 728 bytes 83656 (81.6 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 915 bytes 77233 (75.4 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
4. docker 网络管理命令
命令 | 别名 | 功能 |
---|---|---|
docker network create | 创建网络 | |
docker network connect | 连接网络 | |
docker network disconnect | 断开网络 | |
docker network ls | docker network list | 列出网络 |
docker network prune | 删除不使用的网络 | |
docker network inspect | 查看网络详情 | |
docker network rm | docker network remove | 删除 1 个或者多个网络 |
docker network create
功能:创建网络
docker network create [OPTIONS] NETWORK
关键参数
○ -d, --driver: 网络驱动
○ --gateway: 网关地址
○ --subnet: 表示网段的 CIDR 格式的子网
○ --ipv6: 启用 ipv6
[root@aliyun ~]# docker network create --driver=bridge --subnet=192.168.1.0/24 net1
docker network inspect
功能:查看网络详情
docker network inspect [OPTIONS] NETWORK [NETWORK...]
关键参数
○ -f,–format:指定格式
[root@aliyun ~]# docker network inspect net1
docker network connect
功能:将容器连接到网络。可以按名称或 ID 连接容器。 一旦连接,容器可以与同
一网络中的其他容器通信
docker network connect [OPTIONS] NETWORK CONTAINER
关键参数
○ --ip: 指定 IP 地址
○ --ip6: 指定 IPv6 地址
将正在运行的容器连接到网络
[root@aliyun ~]# docker network connect net1 tmpfs_test
容器启动时将容器连接到网络
[root@aliyun ~]# docker run --network=net1 nginx
指定容器ip,ip必须是网段下的IP
[root@aliyun ~]# docker network connect --ip 192.168.1.10 net1 test
docker network disconnect
功能:断开网络
docker network disconnect [OPTIONS] NETWORK CONTAINER
关键参数
- -f:强制退出
docker network prune
功能:删除不使用网络
docker network prune [OPTIONS]
关键参数
○ -f, --force : 不提示
docker network rm
功能:删除 1 个或者多个网络
docker network rm NETWORK [NETWORK...]
关键参数
○ -f:强制退出
docker network ls
功能:列出网络列表
docker network ls [OPTIONS] 别名 docker network list
关键参数
○ -f, --filter:指定过滤条件
○ --format:指定格式
○ --no-trunc:不截断
○ -q, --quiet :仅仅显示 id
5.两种网络加入差异
创建容器再指定网络
[root@aliyun ~]# docker run -d --name test nginx:latest
[root@aliyun ~]# docker network connect net1 test
[root@aliyun ~]# docker inspect test
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "6bc4a0a0d86299aea2951a3be2f0c0bc2a2fce2d4f8ca2480f41b0e8673df2df",
"net1": {
"IPAMConfig": {},
"Links": null,
"Aliases": [
"cdc5c617ea77"
],
"NetworkID": "b444785e73a714682b22eeaf1ea49d217573685c7ed78da035e293e4d57d9729",
创建容器时指定网络
[root@aliyun ~]# docker run -itd --name demo --network net1 nginx:latest
92dd23a7de980a4dcb314c1f26bfc201e42d63acbfdec37f5cfdefef8e2babb7
[root@aliyun ~]# docker inspect demo
"net1": {
"IPAMConfig": null,
"Links": null,
"Aliases": [
"92dd23a7de98"
],
"NetworkID": "b444785e73a714682b22eeaf1ea49d217573685c7ed78da035e293e4d57d9729",
"EndpointID":
]
先创建容器再指定网络容易会有一个默认的bridge网络,而创建时指定网络则不会有。
6.网络讲解
docker Bridge 网络
Docker Bridge 网络采用内置的 bridge 驱动, bridge 驱动底层采用的是 Linux 内核中Linux bridge 技术。就网络而言, bridge 网络是在网络段之间转发流量的链路层设备,而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使用软件网桥 docker0,它允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器的隔离。默认情况下,创建的容器在没有使用–network 参数指定要加入的 docker 网络时,默认都是加入 Docker 默认的单机桥接网络
默认的 bridge 网络会被映射到内核中为 docker0 的网桥上。Docker 默认的 bridge 网络和 Linux 内核中的 docker0 网桥是一一对应的关系。bridge 是 Docker 对网络的命名,而 docker0 是内核中网桥的名字
这里的bridge和虚拟机里的桥接网络类型不太一样。可以把这个看作与虚拟机里的NAT类型相似。宿主机能上公网,那么连接此网络的容器也可以上公网。此为默认网络类型(也就是说运行容器时不指定网络,默认都属于这种
类型)。宿主机上的docker0网卡就是属于此网络.
但容器停止或者删除时会自动和docker0
断开连接。
创建自定义 bridge
[root@aliyun ~]# docker network create -d bridge new-bridge
DNS 解析
Docker 自定义桥接网络是支持通过 Docker DNS 服务进行域名解析的, 也就是说我们可以直接使用容器名进行通信,因为 DNS 服务可以解析容器名到 IP 地址的映射, 但是默认的 bridge 网络是不支持 DNS 的。也就是说指定自定义的bridge才能使用ping命令,ping容器名。
docker Host 网络
Docker 容器运行默认都会分配独立的 Network Namespace 隔离子系统, 但是如果基
于 host 网络模式,容器将不会获得一个独立的 Network Namespace,而是和宿主机
共用同一个 Network Namespace,容器将不会虚拟出自己的网卡, IP 等,而是直接使
用宿主机的 IP 和端口。
连接到 host 网络的容器共享宿主机的网络栈,容器的网络配置与宿主机完全一样。我
们可以通过 --network=host 指定使用 host 网络
docker Container 网络
Docker Container 的 other container 网络模式是 Docker 中一种较为特别的网络的模
式。之所以称为“other container 模式”,是因为这个模式下的 Docker Container,会使
用其他容器的网络环境。之所以称为“特别”,是因为这个模式下容器的网络隔离性会处
于 bridge 桥接模式与 host 模式之间。 Docker Container 共享其他容器的网络环境,则
至少这两个容器之间不存在网络隔离,而这两个容器又与宿主机以及除此之外其他的
容器存在网络隔离
使用场景
在这种模式下的 Docker Container 可以通过 localhost 来访问 namespace 下的其他容
器,传输效率较高。但是两个容器之间存在依赖,如果依赖容器重启了,会导致另外
一个服务的网络不可用
docker none 网络
none 网络就是指没有网络。挂在这个网络下的容器除了 lo(本地回环),没有其他任何网卡 。连接此网络的容器没有IP地址等信息,只有lo本地回环网卡。无法连接公网网络。