从docker的架构和运行流程来看,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将下载的驱动以Graph的形式存储。 5.当需要为Docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境。 6.当需要限制Docker容器运行资源或执行用户指令等操作时,则通过Execdriver来完成。 7.Libcontainer是一项独立的容器管理包,Network driver以及Execdriver 都是通过Libcontainer来实现具体对容器的操作。
我们安装和运行docker后,运行ifconfig
命令查看一下网络,会产生一个名为docker0的虚拟网桥:
我们查看一下docker网络模式:
代码语言:javascript复制docker network ls
docker会默认创建3大网络模式。
下面来学习一下docker network的常用命令:
命令不多,就那么几个。
查看网络的命令:
代码语言:javascript复制docker network ls
查看网络数据源的命令:
代码语言:javascript复制docker network inspect xxx网络名称
删除网络的命令:
代码语言:javascript复制docker network rm xxx网络名称
案例:
好的,上面了解过docker的一些常用命令后,接下来就来看看docker network 能干什么?
所有网络的访问,要在同一网段。如果要做docker网络管理和容器调用之间的规划、容器间的互联和通信以及端口映射,就涉及到docker network的知识了。
网络模式
none和container几乎不会用,主要使用前两种。
容器实例内默认网络IP的生产规则:
- 先启动两个ubuntu容器实例
- docker inspect 容器ID or 容器名字
上面可以知道,目前的网络属于桥接网络,网关是127.0.0.1 ,u1的IP是127.0.0.2,u2的IP是127.0.0.3。
- 关闭u2实例,新建u3,查看ip变化
会发现u3的IP是127.0.0.3,这个地址不是之前u2的吗,居然变成了u3的IP地址。这说明了docker容器内部的IP是有可能发生改变的。
bridge模式 Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker 默认指定了 docker0 接口 的 IP 地址和子网掩码,让主机和容器之间可以通过网桥相互通信。
网桥docker0创建一对对等虚拟设备接口,一个叫veth,另一个叫eth0,成对匹配。
查看 bridge 网络的详细信息,并通过 grep 获取名称项
代码语言:javascript复制docker network inspect bridge | grep name
代码语言:javascript复制ifconfig | grep docker
host模式 直接使用宿主机的 IP 地址与外界进行通信,不再需要额外进行NAT 转换。他的网络就和主机的eth0(ens33)在同一个网络了。
问题:
代码语言:javascript复制 docke启动时总是遇见标题中的警告
原因:
代码语言:javascript复制docker启动时指定--network=host或-net=host,如果还指定了-p映射端口,那这个时候就会有此警告,
并且通过-p设置的参数将不会起到任何作用,端口号会以主机端口号为主,重复时则递增。
解决:
代码语言:javascript复制解决的办法就是使用docker的其他网络模式,例如--network=bridge,这样就可以解决问题,或者不指定端口映射,又或者直接无视。。O(∩_∩)O哈哈~