docker网络
一、Docker 网络实现原理
Docker使用Limux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个地址,称为 Container-IP。同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
Docker网桥是宿主机虚拟出来的,并不是真实存在的网络设备,外部网络是无法寻址到的,这也意味着外部网络无法直接通过Container-IP访问到容器。如果容器希望外部访问能够访问到,可以通过映射容器端口到宿主主机(端口映射),即 docker run创建容器时候通过 –p 或 -P参 数来启用,访问容器的时候就通过 [宿主机IP]:[容器端口] 访问容器。
docker run -d --name test1 -P nginx #随机映射端口(从32768开始)
docker run -d --name test2 -p 43000:80 nginx #指定映射端口
docker ps -a

浏览器访问: http://192.168.145.15:43000、http://192.168.145.15:32768

#查看容器的输出和目志信息
docker logs 容器的ID/名称
docker logs test1

二、Docker 的网络模式
| 网络模式 | 功能 |
|---|---|
| Host | 容器不会虚拟出自己的网卡,配置主机的IP等,而是使用宿主机的IP和端口 |
| Container | 创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口的范围。 |
| None | 该模式关闭了容器的网络功能。 |
| Bridge | 默认为该模式,此模式会为每一个容器分配,设置IP等,并将容器连接到一个docker0的虚拟网桥,通过docker0 网桥以及iptables nat表配置与宿主机通信。 |
| 自定义网络 | 可以基于Bridge创建网络进行通信 |
安装Docker时,它会自动创建三个网络:bridge(创建容器默认连接到此网络)、none、host。
#查看docker网络列表
docker network ls
或
docker network list

使用docker run创建容器时,可以用 --net 或 --network 选项指定容器的网络模式。
- host模式:使用–net=host 指定。
- none模式:使用–net=none指定。
- container模式:使用–net=container:NAME_or_ID指定。
- bridge模式:使用–net=bridge指定,默认设置,可省略。
1. Host 模式
相当于VMware中的桥接模式,与宿主机在同一个网络中,但是没有独立IP地址。
Docker 使用了Linux 的Namespace 技术来进行资源隔离,如PID Namespace隔离进程,Mount Namespace隔离文件系统,Network Namespace 隔离网络等。一个Network Namespace 提供了一份独立的网络环境,包括网卡、路由、iptable 规则等都与其他Network Namespace 隔离。
一个Docker 容器一般会分配一个独立的Network Namespace。但是如果启动容器的时候使用host 模式,那么这个容器将不会获得一个独立的Network Namespace ,而是和宿主机共用一个Network Namespace 。容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP和端口。

2. Container 模式
这个模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP,端口范围等。可以在一定程度上节省网络资源,容器内部依然不会拥有所有端口。同样,两个容器除了网络方面,其他的如文件系统,进程列表等还是隔离的。两个容器的进程可以通过lo网卡设备通信。
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-usE1XgR6-1689840587494)(C:\Users\86138\AppData\Roaming\Typora\typora-user-images\image-20230720143808387.png)]](https://i-blog.csdnimg.cn/blog_migrate/8065c1677fada2285e0c1f46616f5ed1.png#pic_center)
docker run -itd --name test1 centos:7 /bin/bash #--name 选项可以给容器创建一个自定义名称
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1688881f7c69 centos:7 "/bin/bash" 4 seconds ago Up 3 seconds test1
docker inspect -f '{
{.State.Pid}}' 1688881f7c69 #查看容器进程号
12950

ls -l /proc/12950/ns #查看容器的进程、网络、文件系统等命名空间编号
lrwxrwxrwx 1 root root 0 7月 20 14:26 ipc -> ipc:[4026532452]
lrwxrwxrwx 1 root root 0 7月 20 14:26 mnt -> mnt:[4026532450]
lrwxrwxrwx 1 root root 0 7月 20 14:24 net -> net:[4026532455]
lrwxrwxrwx 1 root root 0 7月

本文深入探讨了Docker的网络实现原理,包括Host、Container、none、bridge和自定义网络模式。此外,还详细介绍了如何通过Cgroup对Docker容器的CPU、内存和磁盘I/O进行资源控制。
最低0.47元/天 解锁文章
60万+

被折叠的 条评论
为什么被折叠?



