10-Docker 网络
基础网络概念
数据传输通过数据包
两台笔记本之间通信是通过数据包通信的。想知道数据包是怎么打包的呢,就先要知道网络分层的概念。
网络分层
目前有两种网络分层的模型。
- ISO/OSI 分层,也就是 7 层模型。
- TCP/IP 分层,也就是 5 层模型。
TCP/IP 是目前最流行的分层模型。
TCP/IP模型
- 最底层物理层 也就是 传输介质,像 网线,光纤…
- 网络接口层,主要是一些网络协议
- IP 层,这一层比较重要,比如想连接目标,需要目标的ip地址和自身ip地址
- 传输层,tcp/udp
- 应用层,主要是应用的协议,如http,ssh…
路由的概念
我们在地图中搜索一个地点,我们可能获得很多路径,我们从中选择一条路径,这就是现实中的路由概念。
那么在网络中会有路由器帮我们选择哪一条路径进行传输,路由本身涉及很多知识点,不做介绍。
IP地址和路由
IP地址是唯一标识设备的,如果我们想连接目标地址,那么传输的数据内要包含我们的源地址和目的地址。这样才知道一发一回才知道发给谁。
我们在访问的过程中,会经过很多路由,比如 电信运行商。
公有IP和私有IP
- Public IP : 互联网上的唯一标识,可以访问internet
- Private IP : 不可在互联网上使用,仅供机构内部使用
那么如果我想通过私有IP访问互联网怎么办?这里就需要用到网络地址转换 NAT 技术。
比如说 校园网,那么这个校园网有一个出口,而且有一个公有的 ip 地址, 学生及老师都是使用私有ip地址,那么当学生或老师访问互联网的时候,会将数据发送到 学校的路由器上,然后路由器会对这条信息做 NAT 地址转换。
转换过程为,NAT 会记录源地址(source)和目标地址(dest),然后转换成公网的ip地址,然后发送出去,当发送回来的时候,NAT 会查询本地存储的表然后转换回内部的私有ip地址。
这里我们要先介绍两个工具 Ping(ICMP) 和 Telnet
- ping 可以判断IP的可达性
- telnet 检查服务的可用性,比如一个 web服务器 80/443 端口
案例:
ping www.imooc.com # 慕课网,这里是不能ping 通的,可能是防火墙的原因
使用telnet
telnet www.imooc.com 80
这里可以成功访问,说明慕课网的这个ip地址是不可达的,但是 80端口的服务是可达的。
实例分析
-
创建一个容器
docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done"
busybox 是一个最小化的 linux 镜像。
-
进入容器内部
docker exec -it test1 /bin/sh
-
查看网络
$: ip a 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
然后退出
exit
查看宿主机器的网络
ip a
此时这里面的网络和刚刚容器内的网络是完全隔离的,原理是通过 linux net namespace 技术进行隔离的
-
再次创建一个容器
docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done"
-
查看网络
docker exec test2 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 23: eth0@if24: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ffinet 172.17.0.3/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
我们再次查看一下 test1 容器的ip
docker exec test1 ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue qlen 1000 link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft forever 21: eth0@if22: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ffinet 172.17.0.2/16 brd 172.17.255.255 scope global eth0valid_lft forever preferred_lft forever
我们可以发现 test1 的 ip 为
172.17.0.2
,而 test2 为172.17.0.3
。 -
进入 test1 容器
docker exec -it test1 /bin/sh
ping test2 容器ip
ping 172.17.0.3
我们发现可以ping通,说明两个容器之间是网络互通的。