目录
1、Docker 运行的基本流程为:
2、Docker0
3、Docker默认的三种网络模式
4、Docker的网络命令
5、网络模式
6、实例:
7、bridge模式
8、host模式
9、none模式
10、container模式
11、自定义网络
1、Docker 运行的基本流程为:
- 1.用户是使用 Docker Client与 Docker Daemon建立通信,并发送请求给后者
- 2.Docker Daemon作为 Docker 架构中的主体部分,首先提供 Docker Server 的功能使其可以接受 Docker Client的请求。
- 3.Docker Engine 执行 Docker内部的一系列工作,每一项工作都是以一个Job的形式的存在。
- 4.Job的运行过程中,当需要容器镜像时,则从 Docker Reisty 中下载境像,并通过镜像管理驱动 Graph driver将下载像以Graph的形式存储。
- 5.当需要为 Docker创建网络环境时,通过网络管理驱动 Network driver创建并配置 Docker容器网络环境。
- 6.当需要限制 Docker容器运行资源或执行用户指令等操作时,则通过 Execdriver来完成。
- 7.Libcontainer是一项独立的容器管理包,Network driver以及Exec driver都是通过Libcontainer来实现具体对容器进行的操作。
2、Docker0
Docker启动的时候会在主机上自动创建一个docker0网桥,所有容器的启动如果没有指定网络模式的情况下都会挂载到docker0网桥上。这样容器就可以和主机甚至是其他容器之间通讯了。
Docker 服务默认会创建一个 docker0 网桥(其上有一个 docker0 内部接口),该桥接网络的名称为docker0,它在内核层连通了其他的物理或虚扣网卡,这就将所有容器和本地主机都放到同一个物理网络。Docker默认指定了docker0接口的地址和子网掩码,让主机和容器之间可以通过网桥相互通信
3、Docker默认的三种网络模式
[root@localhost ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
919709756d0d bridge bridge local
cf00b70b0a68 host host local
b5230e2ac5d0 none null local
4、Docker的网络命令
[root@localhost ~]# docker network --help
Usage: docker network COMMAND
Manage networks
Commands:
connect Connect a container to a network #连接网络
create Create a network #创建网络
disconnect Disconnect a container from a network #中断网络
inspect Display detailed information on one or more networks #查看网络的详细信息
ls List networks #列出网络
prune Remove all unused networks #删除没用的网络
rm Remove one or more networks #删除网络
Run 'docker network COMMAND --help' for more information on a command.
5、网络模式
bridge
- 为每一个容器分配、设置IP 等,并将容器连接到一个 docker0
- 虚拟网桥,默认为该模式
host
- 容器将不会虚拟出自己的网卡,配置自己的IP等,而是使用宿主机的IP 和端口。
none
- 容器有独立的 Network namespace,但并没有对其进行任何网络设置,如分配 veth pair 和网桥连接,IP 等。
container
- 新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围等
- 命令:--network bridge/host/none/container
6、实例:
[root@localhost ~]# docker run -it --name u1 ubuntu /bin/bash
root@af09658d26d3:/#
[root@localhost ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af09658d26d3 ubuntu "/bin/bash" 11 seconds ago Up 9 seconds u1
[root@localhost ~]# docker inspect u1 |tail -n 20
"Networks": {
"bridge": {
"IPAMConfig": null,
"Links": null,
"Aliases": null,
"NetworkID": "919709756d0d3b1fb9f24c9b10409340ff5e7bedf5e7e3bdc28e9d7d597e126c",
"EndpointID": "0bf213d3d0d05cb81a06b1fd98520944205a3860ec02fe965bba1df21fcf523b",
"Gateway": "172.17.0.1",
"IPAddress": "172.17.0.2",
"IPPrefixLen": 16,
"IPv6Gateway": "",
"GlobalIPv6Address": "",
"GlobalIPv6PrefixLen": 0,
"MacAddress": "02:42:ac:11:00:02",
"DriverOpts": null
}
}
}
}
]
7、bridge模式
1 、Docker使用Linux桥接,在宿主机虚拟一个Docker容器网桥(docker0), Docker启动一个容器时会根Docker网桥的网段分配给容器一个IP地址,称为Container-IP,同时Docker网桥是每个容器的默认网关,因为在同一宿主机内的容器都接入同一个网桥,这样容器之间就能够通过容器的Container-IP直接通信。
2 、docker run 的时候,没有指定network的话默认使用的网桥模式就是bridge,使用的就是docker0。在宿主机ifconfig,就可以看到docker0和自己create的nework的eth0,eth1,eth2. 代表网卡一,网卡二,网卡三...lo代表127.0.0.1即locahost, inet addr用来表示网卡的IP地:
3 、网桥docker0创建一对对等虚拟设备接口一个叫veth,另一个叫eth0,成对匹配。
3.1 整个宿主机的网桥模式都是docker0,类似一个交换机有一堆接口,每个接口叫veth,在本地主机和 容器内分别创建一个虚拟接口,并让他们彼比联通(这样一对接口叫veth pair) ;
3.2 每个容器实例内部也有一块网卡,每个接口叫eth0;
3.3 docker0上面的每个veth匹配某个容器实例内部的eth0,两两配对,一一匹配。通过上述,将宿主机 上的所有容器都连接到这个内部网络上,两个容器在同一个网络下,会从这个网关下各自拿到分配的ip,此时两个容器的网络是互通的。
8、host模式
容器将不会获得一个独立的Network Namespace而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡而是使用宿主机的IP和端口。
[root@localhost ~]# docker run -d --network host --name tomcat01 tomcat
08850fe8df1aa99e21d9ec25c9bd3139e9f6fb2333bf35a489f733fefc711c32
9、none模式
禁用网络功能,只有lo标识(就是127.0.0.1表示本地回环)
10、container模式
新创建的容器不会创建自己的网卡和配置自己的IP,而是和一个指定的容器共享IP、端口范围
新建的容器和已经存在的一个容器共享一个网络ip配置而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。
[root@localhost ~]# docker run -d -p 8085:8080 --name my_tomcat tomcat
18a598a32b335fb9822c74c6cceeffbbe39a512a615cd41e3c7914e4918eaaa2
[root@localhost ~]# docker run -d --network container:my_tomcat --name my_tomcat01 tomcat
6720ae57b43a72f7faeb3cda5bf6609f7facb5984434e9633d2a76bce3bde366
[root@localhost ~]#
以上不适合,因为两个tomcat共用8080
下面做举例
[root@localhost ~]# docker run -it --name alpine01 alpine /bin/sh
Unable to find image 'alpine:latest' locally
latest: Pulling from library/alpine
59bf1c3509f3: Pull complete
Digest: sha256:21a3deaa0d32a8057914f36584b5288d2e5ecc984380bc0118285c70fa8c9300
Status: Downloaded newer image for alpine:latest
/ #
/ #
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 lo
valid_lft forever preferred_lft forever
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ #
再另开一个窗口
[root@localhost ~]# docker run -it --network container:alpine01 --name alpine02 alpine /bin/sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 lo
valid_lft forever preferred_lft forever
40: eth0@if41: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:11:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.17.0.3/16 brd 172.17.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ^C
#再第一个容器停掉后,第二个容器的网络也丢了
11、自定义网络
【1】新建网络
[root@localhost ~]# docker network create my_network
d51fe35c177df6be0a3bf3468e740ecacd650e7ec4113165941a8581a05e2ee9
【2】先建立一个容器(用自定义的额网络)
[root@localhost ~]# docker run -it --network my_network --name alpine03 alpine sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 lo
valid_lft forever preferred_lft forever
7: eth0@if8: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:12:00:02 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.2/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
【3】再用自定义的网络建立一个容器,并用名字ping,发现可以ping通
[root@localhost ~]# docker run -it --network my_network --name alpine04 alpine sh
/ # ip add
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN 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 lo
valid_lft forever preferred_lft forever
9: eth0@if10: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state UP
link/ether 02:42:ac:12:00:03 brd ff:ff:ff:ff:ff:ff
inet 172.18.0.3/16 brd 172.18.255.255 scope global eth0
valid_lft forever preferred_lft forever
/ # ping alpine03
PING alpine03 (172.18.0.2): 56 data bytes
64 bytes from 172.18.0.2: seq=0 ttl=64 time=0.113 ms
64 bytes from 172.18.0.2: seq=1 ttl=64 time=0.274 ms
^C
--- alpine03 ping statistics ---
2 packets transmitted, 2 packets received, 0% packet loss
round-trip min/avg/max = 0.113/0.193/0.274 ms
/ #