前言
那么这里博主先安利一些干货满满的专栏了!
首先是博主的高质量博客的汇总,这个专栏里面的博客,都是博主最最用心写的一部分,干货满满,希望对大家有帮助。
- 高质量博客汇总
然后就是博主最近最花时间的一个专栏《Docker从认识到实践再到底层原理》希望大家多多关注!
- Docker从认识到实践再到底层原理
第八章-网络
1. Docker为什么需要网络
参考:比特就业课
容器的网络默认与宿主机及其他容器都是相互隔离, 但同时我们也要考虑下面的一些问题, 比如
- 多个容器之间是如何通信的
- 容器和宿主机是如何通信的
- 容器和外界主机是如何通信的
- 容器中要运行一些网络应用(如 nginx、web 应用、数据库等),如果要让外部也可以访问这些容器内运行的网络应用应该如何实现
- 容器不想让它的网络与宿主机、与其他容器隔离应该如何实现
- 容器根本不需要网络的时候应该如何实现
- 容器需要更高的定制化网络(如定制特殊的集群网络、定制容器间的局域网)应该如何实现
上述的这些问题都需要我们对容器的网络进行合理的管理才能解决,这就体现出了容器网络管理的重要性。
2. Docker网络架构模型
CNM
Docker 网络架构采用的设计规范是 CNM(Container Network Model)。CNM 中规定了 Docker 网络的基础组成要素:Sandbox、Endpoint、Network。
3. 常见Docker网络类型
3.1 bridge 网络
bridge 驱动会在 Docker 管理的主机上创建一个 Linux 网桥。默认情况下,网桥上的容器可以相互通信。也可以通过 bridge 驱动程序配置,实现对外部容器的访问。Docker 容器的默认网络驱动.当我们需要多个容器在同一个 Docker 主机上通信时,桥接网络是最佳选择。
3.2 host 网络
对于独立容器,移除容器和 Docker 主机之间的网络隔离,并直接使用主机的网络。当网络堆栈不应该与 Docker 主机隔离,但是希望容器的其他资源被隔离时,主机网络是最佳选择。
3.3 container 网络
这个模式指定新创建的容器和引进存在的一个容器共享一个网络 ,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 ip,而是和一个指定的容器共享 ip,端口等,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
3.4 none 网络
Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。容器完全网络隔离。
3.5 overlay 网络
借助 Docker 集群模块 Docker Swarm 搭建的跨 Docker Daemon 网络。将多个Docker 守护进程连接在一起,使集群服务能够相互通信。当我们需要运行在不同Docker 主机上的容器进行通信时,或者当多个应用程序使用集群服务协同工作时,覆盖网络是最佳选择。
4. 命令详解
4.1 命令清单
命令 | 功能 |
---|---|
docker network create | 创建网络 |
docker network connect | 连接网络 |
docker network disconnect | 断开网络 |
docker network ls | 列出网络 |
docker network prune | 删除不使用的网络 |
docker network inspect | 查看网络详情 |
docker network rm | 删除1个或多个网络 |
4.2 docker network create
一创建出来就自带了三个网络。
docker network create [OPTIONS] NETWORK
关键参数。
-d, --driver : 网络驱动
--gateway : 网关地址
--subnet : 表示网段的 CIDR 格式的子网
--ipv6 : 启用 ipv6
默认给的就是bridge
驱动。
4.3 docker network inspect
docker network inspect [OPTIONS] NETWORK [NETWORK...]
参数
-f, --format : 指定格式
[
{
"Name": "bridge",
"Id": "c628e2b0d777ee8674106b75d24bc0ba856047abced6d2ad84e101611461092a",
"Created": "2023-09-01T20:57:06.849887313+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
4.4 docker network connect
于将容器连接到网络。可以按名称或 ID 连接容器。 一旦连接,容器可以与同一网络中的其他容器通信。
docker network connect [OPTIONS] NETWORK CONTAINER
关键参数。
--ip : 指定 IP 地址
--ip6 : 指定 IPv6 地址
实操。
启动一个容器,然后看他的ip。
连上网,ifconfig
就可以看到了。
4.5 docker network disconnect
docker network disconnect [OPTIONS] NETWORK CONTAINER
参数。
-f : 强制退出
4.6 docker network prune
删除不使用的网络。
docker network prune [OPTIONS]
参数。
-f , --force : 不提示
4.7 docker network rm
删除一个或多个网络。
docker network rm NETWORK [NETWORK...]
参数。
-f : 强制退出
4.8 docker network ls
遍历所有网络。
-f, --filter : 指定过滤条件
--format : 指定格式
--no-trunc : 不截断
-q, --quiet : 仅仅显示 id
5. Docker Bridge 网络
5.1 bridge网络详解
5.1.1 什么是bridge网络
Docker Bridge 网络采用内置的 bridge 驱动,bridge 驱动底层采用的是 Linux 内核中 Linux bridge 技术。就网络而言,bridge 网络是在网络段之间转发流量的链路层设备,而网桥可以是在主机内核中运行的硬件设备或软件设备;就 Docker 而言,桥接网络使用软件网桥 docker0,它允许连接到同一网桥网络的容器进行通信,同时提供与未连接到该网桥网络容器的隔离。
5.1.2 操作案例一
启动两个镜像。
在第一个容器ping
第二个,在第二个容器ping
第一个。
这两个就是两个容器的ip地址。
第一个ping第二个,ping成功了。
第二个ping第一个,也ping到了。
5.1.3 操作案例二
默认情况下,如操作案例一所示。我们默认创建的容器都会连接在docker0
这个bridge
上。但是我们也可以用我们自定义的bridge
来通信。
先创建一个网络。
看一下这个桥的信息。
启动两个容器。
可以ping通。
5.2 DNS解析
Docker 自定义桥接网络是支持通过 Docker DNS服务进行域名解析的, 也就是说我们可以直接使用容器名进行通信,因为 DNS 服务可以解析容器名到 IP 地址的映射, 但是默认的 bridge网络是不支持 DNS 的。
实验很简单,就是用容器名字来ping
就行了,其他步骤和#5.1的是一样的。
结论:
- 默认的桥不支持这个DNS
- 自定义的桥是支持DNS的
5.3 端口的暴露和转发
先启动一个nginx容器。
6. Docker Host 网络
6.1 什么是host网络
意思就是,根本就不需要虚拟的网卡,直接连宿主机的网卡,直接用宿主机的。
6.2 操作案例
创建两个容器,分别用不同的网络类型。
docker run -itd --name b1 busybox:1.36.0
这个默认用的是bridge网络。
docker run -itd --name b2 --network host busybox:1.36.0
这个指定用host网络。
分别查看这两个容器网络的差异。
我们分别查看这两个网络的信息。
第一个容器里面只查到两个。
第二个容器里面能查到很多个,毕竟第二个容器直接连了宿主机的网卡。
7. Docker Container 网络
这种网络也是用别人的网卡,只不过是,使用的是另外一个容器的网卡(虚拟的),而不是使用宿主机的网卡。
7.2 操作案例
docker run -itd --name b2 --network container:b1 busybox:1.36.0
b1和上面一样,b2就是这样创建。
发现两个的私网ip是一样的。
如果此时直接把b1停掉,b2会怎样呢?
发现此时外部的ip直接没了。
8. Docker None 网络
8.1 none 网络介绍
none 网络就是指没有网络。挂在这个网络下的容器除了 lo(本地回环),没有其他任何网卡。
反正就是没有网络。