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 driver将下载的镜像以Graph的形式存储。
5.当需要为docker创建网络环境时,通过网络管理驱动Network driver创建并配置Docker容器网络环境
6.当需要限制docker容器运行资源或执行用户指令等操作时,则通过ExecDriver来完成。
7.LibContainer是一项独立的容器管理包,Network driver以及Exec Driver都是通过LibContainer来实现具体对容器进行的操作。

docker网络完全可以参考VM虚拟机的网络配置:
Docker网络_第1张图片

二、细节点和基本命令

docker启动后,发现虚拟机产生了一个docker0的虚拟网卡!
Docker网络_第2张图片
基本命令:

# 查看当前docker的所有网络
docker network ls
#创建网络
docker network create 网络名
# 删除网络
docker network rm 网络名
# 查看网络源数据
docker network inspect 网络名
# 帮助
docker network --help

三、网络模式

Docker网络_第3张图片
Docker网络_第4张图片
可以通过下面的案例来证明容器restar之后,ip是可能发生变化的:

docker run -it --name u1 ubuntu bash
docker run -it --name u2 ubuntu bash

# 发现 u2 ip是172.17.0.3
docker inspect u2 

#模拟u2宕机
docker stop u2
docker run -it --name u3 ubuntu bash
# 发现新启动的 u3 ip是172.17.0.3 占用了之前u2的ip
docker inspect u2 

3 .1brige模式

Docker服务默认会创建一个docker0的网桥(其上有个docker0内部和接口),该乔接网络的名称为docker0,它在内核层链接了其他物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的IP地址和子网掩码,让主机和容器之间可以通过网桥相互通信。

1.整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口都叫veth,在本地主机和容器内分别创建一个虚拟接口,并让他们彼此联通(这样一对接口叫做veth pair)
2.每个容器实例内部也有一块网卡,每个接口都叫eth0
3.docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。

Docker网络_第5张图片
veth pair的案例:

3.2Host模式

容器不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace,容器将不会虚拟出自己的网卡,而是用虚拟机的IP和端口。
Docker网络_第6张图片
比如下面的警告的意思是:docker启动指定了使用host模式,通过-p设置的参数将不会起到任何作用,端口会以主机端口号为主,重复则递增。
在这里插入图片描述

3.3None

在none模式下,并不为容器进行任何网络配置,也就是说这个容器没有网卡、IP、路由信息,只有一个lo,需要我们自己为docker容器添加网卡、配置IP等。
使用docker inspect none模式启动的容器,可以发现该容器是没有网关和IP信息的
Docker网络_第7张图片
并且只有lo这个网卡,显示着127.0.0.1这个本地回环地址
在这里插入图片描述

3.4Container

新建的容器和已经存在的一个容器共享一个网络Ip配置而不是和宿主机共享。新建立的容器不会创建自己的网卡,配置自己的ip,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
Docker网络_第8张图片
下面的错误就是因为两个容器公用同一个ip同一个端口导致冲突了。
在这里插入图片描述
可以用下面的这个小巧但五脏俱全的linux镜像进行演示:

docker run -it --name alpine1 alpine /bin/sh
docker run -it --network container:alpine1 --name alpine1 alpine /bin/sh

Docker网络_第9张图片

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
# 在tom1容器中直接ping tom2
ping tom2

你可能感兴趣的:(docker,docker,网络,容器)