一、简介
从其架构和运行流程来看,Docker是一个C/S模式的架构,后端是一个松耦合架构,众多模块各司其职。
docker运行的基本流程为:
1.用户是使用Docker Client和Docker Daemon建立通信,并发送请求给后者。
2.Docker Daemon作为docker架构中的主体部分,首先提供docker server的功能使其可以接受docker client的请求。
3.docker engine执行docker内部的一系列工作,每一项工作都是以一个Job的形式存在。
4.Job的运行过程中,当需要容器镜像时,则从docker registry中下载镜像,并通过镜像管理驱动Graph driver将下载的镜像以Graph的形式存储。
5.当需要为docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境
6.当需要限制docker容器运行资源或执行用户指令等操作时,则通过ExecDriver来完成。
7.LibContainer是一项独立的容器管理包,Network driver以及Exec Driver都是通过LibContainer来实现具体对容器进行的操作。
docker网络完全可以参考VM虚拟机的网络配置:
![在这里插入图片描述](https://img-blog.csdnimg.cn/18e36cf435eb4bb08417bbfcc47985a4.png)
二、细节点和基本命令
docker启动后,发现虚拟机产生了一个docker0的虚拟网卡!
![在这里插入图片描述](https://img-blog.csdnimg.cn/cea83898077946a399308bb79cc5a7f2.png)
基本命令:
docker network ls
docker network create 网络名
docker network rm 网络名
docker network inspect 网络名
docker network --help
三、网络模式
![在这里插入图片描述](https://img-blog.csdnimg.cn/7595a93083d442a0bcbac741fb0e80f7.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/aa29a80e888b45a3834ee2370344b487.png)
可以通过下面的案例来证明容器restar之后,ip是可能发生变化的:
docker run -it --name u1 ubuntu bash
docker run -it --name u2 ubuntu bash
docker inspect u2
docker stop u2
docker run -it --name u3 ubuntu bash
docker inspect u2
3 .1brige模式
Docker服务默认会创建一个docker0的网桥(其上有个docker0内部和接口),该乔接网络的名称为docker0,它在内核层链接了其他物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
1.整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口都叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫做veth pair)
2.每个容器实例内部也有一块网卡,每个接口都叫eth0
3.docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
![在这里插入图片描述](https://img-blog.csdnimg.cn/237dea84a6fd43f39e763baf23b3129a.png)
veth pair的案例:
![在这里插入图片描述](https://img-blog.csdnimg.cn/ec18979eb74d4ae7bdac9521693a7618.png)
3.2Host模式
容器不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace,容器将不会虚拟出自己的网卡,而是用虚拟机的IP和端口。
![在这里插入图片描述](https://img-blog.csdnimg.cn/5a24ca1cfe6f45fda92e0fa4dad233b4.png)
比如下面的警告的意思是:docker启动指定了使用host模式,通过-p设置的参数将不会起到任何作用,端口会以主机端口号为主,重复则递增。
![在这里插入图片描述](https://img-blog.csdnimg.cn/4cae6af9dc2b402ea17ccc742bbb9bab.png)
3.3None
在none模式下,并不为容器进行任何网络配置,也就是说这个容器没有网卡、IP、路由信息,只有一个lo,需要我们自己为docker容器添加网卡、配置IP等。
使用docker inspect none模式启动的容器
,可以发现该容器是没有网关和IP信息的
![在这里插入图片描述](https://img-blog.csdnimg.cn/c0e6616046f042969a3b2acff59a30c8.png)
并且只有lo这个网卡,显示着127.0.0.1这个本地回环地址
![在这里插入图片描述](https://img-blog.csdnimg.cn/2183812dccfe46a7a1de7df6bfc9b028.png)
3.4Container
新建的容器和已经存在的一个容器共享一个网络Ip配置而不是和宿主机共享。新建立的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
![在这里插入图片描述](https://img-blog.csdnimg.cn/d2bd14790bf34471b5b7242aa867d6a3.png)
下面的错误就是因为两个容器公用同一个ip同一个端口导致冲突了。
![在这里插入图片描述](https://img-blog.csdnimg.cn/6da62c7968b544028b2227b1dfcf59f8.png)
可以用下面的这个小巧但五脏俱全的linux镜像进行演示:
docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine1 alpine /bin/sh
![在这里插入图片描述](https://img-blog.csdnimg.cn/56aa2ea130b04723b879373ab3c23868.png)
3.5自定义网络
自定义网络的优势是解决默认brige模式由于容器宕机导致的ip变化的问题。因为在同一个自定义网络中的容器可以将容器名当作IP来访问彼此,下面是说明案例:
docker network create test
docker run -d -p 8081:8080 --network test --name tom1 billtgoo/tomcat8-jdk8
docker run -d -p 8082:8080 --network test --name tom1 billtgoo/tomcat8-jdk8
docker exec -it tom1 /bin/bash
ping tom2
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)