这篇我们将学习Docker
里面的网络了!!!
Docker
里面的网络一般分为单机网络多机网络。单机网络主要包括(Bridge Network
, Host Network
, None Network
),多机网络主要是Overlay Network
。
环境准备
根据老师准备的文件创建好两个虚拟机
1 | ➜ chapter4 vagrant status |
Linux网络命名空间
使用linux的network network namespace
实现Docker
容器网络的隔离。
我们在node1
主机上创建一个容器:
1 | [vagrant@docker-node1 ~]$ docker run -d --name test1 busybox /bin/sh -c "while true; do sleep 3600; done" |
容器内部的网络与主机的网络是相互隔离的。
我们再新建一个容器,查看新的容器的网络命名空间。
1 | [vagrant@docker-node1 ~]$ docker run -d --name test2 busybox /bin/sh -c "while true; do sleep 3600; done" |
两个容器的网络命名空间是不一样的,并且两个容器之间可以相互通信。
1 | [vagrant@docker-node1 ~]$ docker exec -it 24a9bfa70e6a /bin/sh |
我们在linux 主机上创建了两个容器,每个容器都有自己独立的 netns
我们可以在Linux
主机上直接通过命令行创建出netns
。
1 | [vagrant@docker-node1 ~]$ sudo ip netns add test1 |
方法一:直接使用命名空间执行 ip a
1 | [vagrant@docker-node1 ~]$ sudo ip netns exec test1 ip a |
从上面看出 通过命令行创建的命名空间是没有IP
地址的,并且状态为DOWN
。
方法二:直接本机运行ip link
1 | [vagrant@docker-node1 ~]$ ip link |
我们看到状态是DOWN
现在我们使用命令将其UP
起来。
1 | [vagrant@docker-node1 ~]$ sudo ip netns exec test1 ip link |
状态并没有UP
起来是UNKNOWN
的状态。只是因为端口要UP
起来需要两端都要UP
起来的。像本机的eth0
会和MAC
的虚拟化端口连起来才为UP
的状态。单个端口是没法UP
起来的,必须是一对。
一个小实验
我们通过创建容器的时候创建的命名空间之间是可以相互通信的,但是通过命令行创建的是无法通信的。现在我们创建一对Veth
将两个命名空间连起来。分别将一对的两端放到两个命名空间上(配上ip地址),这样两个命名空间就连接起来了。和我们创建两个容器之后可以相互通信的原理是一样的。
流程:
1 | # 查看本机的 link 有哪些 |
虽然我们已经将创建的一对VETH
分别绑定到了两个命名空间上,但是没有分配IP
命名空间之间还是不能相互通信的。
赋予IP
:
1 |
|