71、docker网络

一、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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值