一、docker网络:
1.1、默认模式:
桥接模式 部署好docker服务,启动之后,就会创建一个虚拟网桥,docker0,这是一个虚拟网络设备,类似于交换机。
[root@docker1 ~]# ifconfig
docker0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.1 netmask 255.255.0.0 broadcast 172.17.255.255
inet6 fe80::42:acff:fe8d:61a4 prefixlen 64 scopeid 0x20<link>
ether 02:42:ac:8d:61:a4 txqueuelen 0 (Ethernet)
RX packets 146 bytes 16410 (16.0 KiB)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 186 bytes 20291 (19.8 KiB)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
每一次运行容器之后,docker0就会从网段中分配一个ip地址给这个容器。
容器和主机之间的通信:通过桥接模式通信。
容器与容器之间通信:多个容器都在统一网段,都在统一网桥,可以通过自己的ip地址进行通信。
1.2、桥接模式
桥接模式:连接两个不同网络段的设备,共享通信的一种方式。
172.17. ------路由器------192.168.
基于mac地址转发数据帧。
当172.17-------------192.168 桥接设备查看目标的mac地址。
ARP广播。如果再mac地址表,桥接设备直接把数据帧转发目标的相应接口。
如果不在,ARP广播,所有接口都会收到数据报文,有则响应,无责丢弃。
桥接模式在物理和数据链路层上工作,学习和转发mac地址,用于局域网和内部网络的连接和扩展。
vethpair方式生成一个对应容器的虚拟网卡。
docker网桥是宿主机虚拟出来的,并不是真正的网络设备。外部是没有办法通过寻址找到的。
也是客户端是无法直接访问容器的ip地址。
如果希望外部网络能够访问,要通过端口映射容器的端口到宿主机。
桥接模式的宿主机和容器之间的端口映射,实际上是做了nat地址的转换,容器的私有ip映射到主机的ip上。
从而实现容器与外部网络的通信。隐藏了容器内部的真实ip地址。
内部之间通信数据帧转发
外部通信地址转换
#容器要保持一直运行,必须要指定有一个运行的程序。nginx镜像当中声明好了运行程序。
nginx -g ‘daemon off’ 保持nginx一直在后台运行。 itd 不加d,前台运行展示运行结果。加d,后台运行不展示运行结果。
1.3、docker基于桥接模式的网络类型:
1、host模式,容器不会虚拟出自己的网卡,也不会配置自己的ip。容器全部使用宿主机的ip和端口。
端口不重复的类型的应用,nginx http docker本身是单节点模式,使用与部署单个服务的应用程序。
1、创建host模式
[root@docker1 ~]# docker run -itd --name nginx1 --network host nginx:1.22
[root@docker1 ~]# docker run -itd --name nginx2 --net=host nginx:1.22
[root@docker1 ~]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1 ##查看容器ip地址
开启nginx2------发现端口占用
[root@docker1 ~]# docker run -itd --name nginx2 --net=host nginx:1.22
57f347225c6b1fda07ee541c88d4f529525d236ee7530fc10dcd2f2840453a2a
[root@docker1 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
cc523653112e nginx:1.22 "/docker-entrypoint.…" 4 minutes ago Up 4 minutes nginx1
[root@docker1 ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
57f347225c6b nginx:1.22 "/docker-entrypoint.…" 20 seconds ago Exited (1) 17 seconds ago nginx2
cc523653112e nginx:1.22 "/docker-entrypoint.…" 4 minutes ago Up 4 minutes nginx1
[root@docker1 ~]# docker logs -f nginx2 ##查看日志
2、container模式
container模式:容器和容器之间共用一个network namespace,不是和宿主机共享。
新创建的容器也不会有自己的网卡,配置自己的ip。
而是和一个容器共享ip端口,除了网络之外,其他的比如文件系统等等都是隔离的。
创建container容器网络
[root@docker1 ~]# docker rm -f nginx1 ##删除容器nginx1
[root@docker1 ~]# docker run -itd --name test1 centos:7 /bin/bash
[root@docker1 ~]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' test1
172.17.0.2
[root@docker1 ~]# docker run -itd --name test2 --net=container:test1 centos:7 /bin/bash
[root@docker1 ~]# docker inspect -f '{{.State.Pid}}' test1
26062
[root@docker1 ~]# docker inspect -f '{{.State.Pid}}' test2
26179
[root@docker1 ~]# ls -l /proc/26062/ns
总用量 0
lrwxrwxrwx. 1 root root 0 8月 13 11:53 ipc -> ipc:[4026532581]
lrwxrwxrwx. 1 root root 0 8月 13 11:53 mnt -> mnt:[4026532579]
lrwxrwxrwx. 1 root root 0 8月 13 11:16 net -> net:[4026532584]
lrwxrwxrwx. 1 root root 0 8月 13 11:53 pid -> pid:[4026532582]
lrwxrwxrwx. 1 root root 0 8月 13 11:53 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 8月 13 11:53 uts -> uts:[4026532580]
[root@docker1 ~]# ls -l /proc/26179/ns
总用量 0
lrwxrwxrwx. 1 root root 0 8月 13 11:53 ipc -> ipc:[4026532654]
lrwxrwxrwx. 1 root root 0 8月 13 11:53 mnt -> mnt:[4026532652]
lrwxrwxrwx. 1 root root 0 8月 13 11:53 net -> net:[4026532584]
lrwxrwxrwx. 1 root root 0 8月 13 11:53 pid -> pid:[4026532655]
lrwxrwxrwx. 1 root root 0 8月 13 11:53 user -> user:[4026531837]
lrwxrwxrwx. 1 root root 0 8月 13 11:53 uts -> uts:[4026532653]
3、none模式:
创建容器之后,容器有自己的网络命名空间,但是不会进行任何网络的配置。
没有网卡,没有ip,没有端口,只有本地lo回环网络,没有办法进行连网。网络是封闭的,一般是
[root@docker1 ~]# docker run -itd --name nginx1 --network none nginx:1.22
32058010ecfc44723d46dfccc862e7d94b5086418033cdd23e32205d936cc5fa
[root@docker1 ~]# docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' nginx1
查看nginx1容器的信息
docker run -d --name a1 --network=none nginx:latest
docker ps -a
docker inspect a1 ##查看该容器的详细信息
"Gateway": ""
"IPAddress": "",
4、自定义网络
自定义网络:和桥接模式一样,只不过我们可以自定义容器的网段和给新创建
[root@docker1 ~]# docker run -itd --name nginx1 --network brige --ip 172.17.0.5 nginx:1.22
c35e76bec84e3ae6dcc63acb37dc6eab1c3bc661d6063124a3bc0fa503e839c3
docker: Error response from daemon: network brige not found.
只有自定义网络可以在创建容器的时候指定ip地址
[root@docker1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3ed862dda9dc bridge bridge local
2f233d494983 host host local
20b905123c24 none null local
创建自定义网络
[root@docker1 ~]# docker network create --subnet=172.111.0.0/16 mynetwork1
978fd8c202ba023708ec0cd9be465aabe8814c123bc1a9ae2386b0cb986ba790
[root@docker1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3ed862dda9dc bridge bridge local
2f233d494983 host host local
978fd8c202ba mynetwork1 bridge local
20b905123c24 none null local
指定网卡名字
[root@docker1 ~]# docker network create --subnet=172.112.0.0/16 --opt "com.docker.network.bridge.name"="docker2" mynetwork2
[root@docker1 ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3ed862dda9dc bridge bridge local
2f233d494983 host host local
978fd8c202ba mynetwork1 bridge local
c87eba1e8cc7 mynetwork2 bridge local
20b905123c24 none null local
根据自定义网络创建容器
[root@docker1 ~]# docker run -itd --name nginx5 --net mynetwork2 --ip 172.112.0.5 -p 88:80 nginx:1.22
总结:
1、docker的网络模式就是桥接模式
host 宿主机共享网络 常用
container 模式 容器之间共享
none模式 无网络模式,单机模式
自定义网络 只有自定义网络可以在创建容器的时候指定ip地址
①host模式---------------容器使用宿主机的网络直接公开服务
这意味着你在容器中运行一个web服务,那么它就直接绑定到主机的网络接口上,而不是通过docker进行任何网络转发
与宿主机共享网络名称空间
②container
这种模式允许容器去共享另一个容器网络命名空间,这说明两个容器可以相同的网络接口和iP地址,他们共享的是同一网络命名空间
多个容器之间共享一个net work namespace(命名空间)
③none---------- 是最简单的网络模式
此网络模式表示容器拥有自己的网络命名空间,但不会进行任何网络配置,这实际给了用户完全的自主权来给自己配置容器的网络
自闭空间 局域网
④ bridge------------- 默认的网络模式
每个新创建的容器都将该网络分配一个IP地址,此网络模式允许所有docker容器之间以及docker宿主机之间进行互相通信
默认模式 通过VETH对连接容器docker0网桥 、网桥分配给容器IP 、同时docker0作为局域网内容器的网关,最后与宿主机网卡进行通讯
⑤ user-defined network自定义
docker允许用户创建自己的定义的网络,用户可以定义的网络范围、子网、路由 等参数
这种类型网络使用用户可以更好地对容器网络进行控制和隔离
(业务需求:注:根据甲方指定或领导指定)
根据业务需求指定静态IP
容器都将该网络分配一个IP地址,此网络模式允许所有docker容器之间以及docker宿主机之间进行互相通信
默认模式 通过VETH对连接容器docker0网桥 、网桥分配给容器IP 、同时docker0作为局域网内容器的网关,最后与宿主机网卡进行通讯
⑤ user-defined network自定义
docker允许用户创建自己的定义的网络,用户可以定义的网络范围、子网、路由 等参数
这种类型网络使用用户可以更好地对容器网络进行控制和隔离
(业务需求:注:根据甲方指定或领导指定)
根据业务需求指定静态IP