docker网络模式

网络基础:

  docker使用到的与LInux网络有关的技术分别有:网络名称空间,Veth,lptables,网桥,路由

 

veth:了解。

通过创建Veth设备对,绑定命名空间,将Veth分配给IP,为对端Veth设备设置IP,就可以实现两个  容器之间的网络通信

 

网桥:

网桥是二层的虚拟网络设备,
它是把若干个网络接口“连接”起来,从而报文能够互相转发。网桥能够解析收发的报文,读取目标 MAC 地
址的信息,和自己记录的 MAC 表结合,来决定报文的转发目标网口。
 
Docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的这也意味着外
部网络无法通过直接 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到
宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主
机 IP]:[容器端口]访问容器

 

Iptables
我们知道, Linux 络协议樵非常高效,同时比较复杂 如果我们希望在数据的处理过程中对关心的数据进行
一些操作该怎么做呢? Linux 提供了一套机制来为用户实现自定义的数据包处理过程。
在 Linux 网络协议棋中有一组回调函数挂接点,通过这些挂接点挂接的钩子函数可以在 Linux 网络棋处理数
据包的过程中对数据包进行 些操作,例如过滤、修改、丢弃等 整个挂接点技术叫作 Netfilter lptables
Netfilter 负责在内核中执行各种挂接的规则,运行在内核模式中:而 lptables 是在用户模式下运行的进程,
负责协助维护内核中 Netfilter 的各种规则表 通过 者的配合来实现整个 Linux 网络协议战中灵活的数据包处理
机制。
 
 
总结:
 
network namespace
要提供了关于网络资源的隔离,包括网络设备、IPv4 和 IPv6 协议栈、IP 路
由表、防火墙、/proc/net 目录、/sys/class/net 目录、端口(socket)等
 
 
linux Bridge
功能相当于物理交换机,为连在其上的设备(容器)转发数据帧。如 docker0
网桥。
 
 
iptables
主要为容器提供 NAT 以及容器网络安全。
 
 
veth pair
两个虚拟网卡组成的数据通道。在 Docker 中,用于连接 Docker 容器和 Linux
Bridge。一端在容器中作为 eth0 网卡,另一端在 Linux Bridge 中作为网桥的
一个端口。
 
 
 
docker的四种网络模式
Docker 网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外
部网络无法通过直接 Container-IP 访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到
宿主主机(端口映射),即 docker run 创建容器时候通过 -p 或 -P 参数来启用,访问容器的时候就通过[宿主
机 IP]:[容器端口]访问容器。
 
  HOST 模式
 
 
如果启动容器的时候使用 host 模式,那么这个容器将不会获得一个独立的 Network Namespace,而是和宿
主机共用一个 Network Namespace容器将不会虚拟出自己的网卡,配置自己的 IP 等,而是使用宿主机的 IP
和端口。但是,容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。
 
使用 host 模式的容器可以直接使用宿主机的 IP 地址与外界通信,容器内部的服务端口也可以使用宿主机的
端口,不需要进行 NAT,host 最大的优势就是网络性能比较好,但是 docker host 上已经使用的端口就不能再
用了,网络的隔离性不好。
 
Containe 模式
  这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。
新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个
容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
 
创建命令:docker run -itd --name test01 busybox   
创建一个容器,默认使用的是bridge 模式
第二步:
docker run -itd --name test02 --network "container:test01" busybox
创建第二个容器,并且制定使用container模式,并将其加入第一个创建的容器的network中
第三步:进入容器,查看他们的网络配置,如果一样,则是已经接通。
 
 
none 模式
使用 none 模式,Docker 容器拥有自己的 Network Namespace,但是,并不为 Docker 容器进行任何网络
配置。也就是说,这个 Docker 容器没有网卡、IP、路由等信息。需要我们自己为 Docker 容器添加网卡、配置
IP 等。
这种网络模式下容器只有 lo 回环网络,没有其他网卡。none 模式可以在容器创建时通过--network=none
来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
 
 
bridge 模式(默认模式)
当 Docker 进程启动时,会在主机上创建一个名为 docker0 的虚拟网桥,此主机上启动的 Docker 容器会连
接到这个虚拟网桥上。虚拟网桥的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个
二层网络中。
docker0 子网中分配一个 IP 给容器使用,并设置 docker0 的 IP 地址为容器的默认网关。在主机上创建
一对虚拟网卡 veth pair 设备,Docker 将 veth pair 设备的一端放在新创建的容器中,并命名为 eth0(容器的网
卡),另一端放在主机中,以 vethxxx 这样类似的名字命名,并将这个网络设备加入到 docker0 网桥中。可以
通过 brctl show 命令查看。
bridge 模式是 docker 的默认网络模式,不写--net 参数,就是 bridge 模式。使用 docker run -p 时,docker
实际是在 iptables 做了 DNAT 规则,实现端口转发功能。可以使用 iptables -t nat -vnL 查看。
 

 

 

 

查看系统网桥
docker network ls


NETWORK ID NAME DRIVER SCOPE
a065ed712fea bridge bridge local
7b862ba6761e host host local
f7e824ff4e3e none null local

创建网桥
docker network create [网桥的名称]
[root@localhost ~]# docker network create oldboy


617ba09862ae61d1385c1c9af517d3d803f19e965cd4bce5a5655234c8d1bf6e
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a065ed712fea bridge bridge local
7b862ba6761e host host local
f7e824ff4e3e none null local
617ba09862ae oldboy bridge local

查看网桥的详细信息
docker network inspect [网桥名称]
[root@localhost ~]# docker network inspect oldboy


[
{
"Name": "oldboy",
"Id": "617ba09862ae61d1385c1c9af517d3d803f19e965cd4bce5a5655234c8d1bf6e",
"Created": "2020-12-03T08:58:43.354251604+08:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": {},
"Config": [
{
"Subnet": "172.18.0.0/16",
"Gateway": "172.18.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {},
"Options": {},
"Labels": {}
}
]

 

删除网桥
docker network rm [网桥名称|ID]
[root@localhost ~]# docker network rm oldboy
oldboy
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a065ed712fea bridge bridge local
7b862ba6761e host host local
f7e824ff4e3e none null local

清理网桥
docker network prune
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a065ed712fea bridge bridge local
7b862ba6761e host host local
f7e824ff4e3e none null local
[root@localhost ~]# docker network create test
efde281ecb8b00efbc55014cd077858f91944e81d21fd413d64010c7c9911565


[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a065ed712fea bridge bridge local
7b862ba6761e host host local
f7e824ff4e3e none null local
efde281ecb8b test bridge local
[root@localhost ~]# docker network prune
WARNING! This will remove all custom networks not used by at least one container.
Are you sure you want to continue? [y/N] y
Deleted Networks:
test

[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
a065ed712fea bridge bridge local
7b862ba6761e host host local
f7e824ff4e3e none null local

 

 使用网桥
需求:nignx django redis mysql
 创建网桥
docker network create oldboy

连接网桥
docker run --network [网桥名称] [镜像ID|镜像名称] [cmd]
# 第一个容器
docker run -d --name nginx --network oldboy nginx:1.19.2

# 第二个容器
docker run -d --name redis --network oldboy redis:latest

# 第三个容器
docker run -d --name mysql --network oldboy -e MYSQL_ROOT_PASSWORD=123456 mysql:5.7

# 测试
docker run -d -it --name test --network oldboy busybox:latest sh

# 要求用busybox实现类似于nignx启动时自动执行某些命令
hello world

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
posted on 2020-12-03 22:01  輪滑少年  阅读(78)  评论(0编辑  收藏  举报