目录
1 是什么
docker network,就是你使用ifconfig
可以看到有一个名称是docker0
1.1 查看网络
ifconfig
1.2 查看docker里面网络信息
这里先简单看一下,后面会有详细的解释
docker network ls
2 network能干什么
1 容器间的互联和通信以及端口映射
2 容器IP变动时候可以通过服务名直接网络通信而不受到影响
3 用一用
3.1 常用基本命令
(1)所有的命令
学会使用--help
命令
docker network --help
(2)查看命令的详细信息
docker network COMMAND --help
###(3)创建一个网络lemon_network
docker network create lemon_network
(4)删除网络
docker network rm lemon_network
(5)查看docker中的所有网络
docker network ls
(6)查看bridge网络的详细信息
docker network inspect bridge
3.2 网络模式
3.2.1 总体介绍
bridge 模式:使用–network bridge指定,默认使用docker0
host 模式:使用–network host
none 模式:使用–network none
container 模式:使用–network container:NAME或者容器ID指定
3.2.2 容器实例内默认网络IP生产规则
想法:
启动两个 ubuntu 容器,查看两个容器的 IP 地址,停止一个 ubuntu 容器,再新建一个 ubuntu 容器,查看新启动的容器的 IP 地址,如果新启动的容器占了删除的容器的 IP 地址,就证明docker容器内部的 ip 是有可能会发生改变的;如果没有占用,则 IP 地址是固定的。
(1)说明
docker run -it --name u1 ubuntu bash
docker run -it --name u2 ubuntu bash
启动两个Ubuntu实例 u1, u2 成功
docker ps
分别查看容器的 IP 地址
其实下面两条命令,将20改成21更好看一些些
docker inspect u1 | tail -n 20
docker inspect u2 | tail -n 20
启动新的 Ubuntu 容器 u3
docker run -it --name u3 ubuntu bash
docker rm u2
docker ps
查看 u3 的容器IP
docker inspect u3 | tail -n 21
(2)结论
从上述例子,我们很容易可以看出docker容器内部的 IP 是有可能会发生改变的。
3.2.3 案例说明
docker network inspect bridge | grep name
(1)bridge 模式
是什么
Docker服务器会默认创建一个 docker0 网桥,它在内核层
连通了其他的物理或虚拟网卡,这就将所有容器和本地主机都放到同一个物理网络
。Docker默认指定了 docker0 接口的 IP地址 和 子网掩码 ,让主机和容器之间可以通过网桥相互通信
。
我们看下面这个图片理解一下:
Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0),Docker启动一个容器时会根据Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关。因为在同一宿主机内的容器都接入同一个网桥
,这样容器之间就能够通过容器的Container-IP直接通信。
网桥docker0创建一对 对等虚拟设备接口
,一个是veth
,另一个是eth0
,成对匹配,这样一对接口称为veth pair
。
每个容器实例内部也有一个网卡,每个接口称为eth0;
docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。
案例
想法:
我们这里主要是要看到成对出现的veth pair
启动两个 tomcat 的容器
docker run -d -p 8081:8080 --name tom1 tomcat
docker run -d -p 8082:8080 --name tom2 tomcat
docker ps
可以看出容器启动成功
这是之前启动的 Ubuntu 容器, 从图片中可以看到 veth pair
docker exec -it u1 bash
ip addr
如果提示 ip common not find,执行如下命令:
apt update
apt-get install iproute2
ip addr
这是启动的 tomcat 容器, 从图片中可以看到 veth pair
docker exec -it tom1 bash
ip addr
如果提示 ip common not find,执行如下命令:
apt update
apt-get install iproute2
ip addr
再到宿主机查看 IP 地址
记得是在宿主机下面执行下面的命令
ip addr | tail -n 16
(2)host 模式
是什么
直接使用宿主机的IP地址与外界进行通信,不再需要额外进行NAT转换。
NAT(Network Address Translation)是一种在IP数据包通过路由器或防火墙时重写源IP地址或目的IP地址的技术。
案例
docker run -d -p 8083:8080 --network host --name tom3 tomcat
docker ps
不需要加端口号
docker run -d --network host --name tom4 tomcat
docker inspect tom4 | tail -n 21
那我们没有端口,如何访问我们启动的容器呢?之前讲过,host模式和宿主机公用IP,所以我们使用宿主机IP即可
(3)none 模式
是什么
在none模式下,并不为Docker容器进行任何网络配置。即Docker容器没有网卡、IP、路由等信息,只有一个lo(Local,就是127.0.0.1本地回环),需要我们自己为Docker容器添加网卡、配置IP。
案例
docker run -d -p 8081:8080 --network none --name tom1 billygoo/tomcat-jdk8
docker exec -it tom1 bash
ip addr
如果出现已经命名过tom1的错误,使用docker rm 容器ID
就可以了
docker inspect tom1 | tail -n 21
(4)container 模式
是什么
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新建的容器不会创建自己的网卡、配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离开的。
看这张图片,容器1和容器2共享一个网络 IP,与 docker0,也就是3进行网络通信。
案例
(1)一个失败案例
使用tomcat,原因是公共的端口
docker run -d -p 8082:8080 --name tom2 billygoo/tomcat8-jdk8
docker run -d -p 8083:8080 --network container:tom2 --name tom3 billygoo/tomcat8-jdk8
如果出现已经命名过tom1的错误,使用docker rm 容器ID
就可以了
(2)一个成功案例
Alpine操作系统是一个面向安全的轻型Linux发行版,镜像非常小巧,不到6M的大小,因此特别适合容器打包。
docker run -it --name alpine1 alpine /bin/sh
ip addr
docker run -it --network container:alpine1 --name alpine2 alpine /bin/sh
ip addr
4 后记
自定义网络就放到下节分享吧,太多了,脑袋都写大了!
今天中午点外卖那个山姆上校牛肉卷,还是山姆超市里面买的好吃,原味的芝士卷就是最好吃的,别的都报吃,下次吃个山姆的叭。
家人们,如果我的文档对您有帮助的话,记得给我点个赞赞~
谢谢啦!