本文主要是介绍dokcer || networking,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
docker 默认的私有网络:172.17.0.0/16
网关是宿主机的172.17.0.1
所有的容器上网都需要经过宿主机,底层使用的是iptables的SNAT和DNAT
宿主机能ping通容器,但是不能ssh到容器里,为什么?
1.容器里安装openssh服务器,没有sshd进程去监听22号端口
2.容器的单进程思路--》一个容器里只是跑一个程序 --》web,mysql,redis等
docker的网络类型(docker里能看到3种类型)
查看网络类型
[root@aliyun ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3058b63e1804 bridge bridge local
e996a5a90e55 host host local
93b5cda92460 none null local
查看帮助文档
[root@aliyun ~]# docker network --helpUsage: docker network COMMANDManage networksCommands:connect Connect a container to a networkcreate Create a networkdisconnect Disconnect a container from a networkinspect Display detailed information on one or more networksls List networksprune Remove all unused networksrm Remove one or more networks
docker的7种网络类型
网络模式 | 配置 | 描述 |
host模式 | –net=host | 容器和宿主机共享ip地址,端口号要区别开 |
none模式 | –net=none | 只有lo接口,没有其他的接口 |
container模式 | -net=container | 很多容器共享一个ip地址 |
bridge模式 | –net=bridge | 默认的模式 |
ipvlan模式 | –net=ipvlan | 直接和eth0组成了一个局域网--》相当于一个vlan |
macvlan模式 | –net=macvlan | 使用网络驱动程序来分配MAC 每个容器的虚拟网络接口的地址 |
overlay模式 | -net=overlay | 实现跨主机的docker容器之间的通信 |
host模式
使用host模式的容器可以直接使用宿主机的IP地址与外界通信,容器内部的服务端口也可以使用宿主机的端口,不需要进行NAT,host最大的优势就是网络性能比较好,但是docker host上已经使用的端口就不能再用了,网络的隔离性不好。
注意:鉴于容器在使用模式网络时没有自己的 IP 地址,则端口映射不会生效。
--network=host,可以指定容器网络类型为host
[root@aliyun ~]# docker run --name sc-nginx-1 -d --network=host -p 8080:80 nginx
WARNING: Published ports are discarded when using host network mode
85ae14f5b22af791ef9be2cdfd8902ce3b4c76403aff6b80a8193ee33e92a910[root@aliyun ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
85ae14f5b22a nginx "/docker-entrypoint.…" 4 minutes ago Up 4 minutes sc-nginx-1[root@aliyun ~]# docker inspect sc-nginx-1 |grep -i network"NetworkMode": "host","NetworkSettings": {"Networks": {"NetworkID": "e996a5a90e556bf6d05196f3ac91ee085fd70b9b44815b1929e5244dfe0db228",
none模式
使用none模式,Docker容器拥有自己的Network Namespace,但是,并不为Docker容器进行任何网络配置。也就是说,这个Docker容器没有网卡、IP、路由等信息。需要我们自己为Docker容器添加网卡、配置IP等。
这种网络模式下容器只有lo回环网络,没有其他网卡。none模式可以在容器创建时通过--network=none来指定。这种类型的网络没有办法联网,封闭的网络能很好的保证容器的安全性。
[root@aliyun ~]# docker run --name nginx-2 -d --network=none -p 8080:80 nginx
32a07826622b17da449395fc1e11650d89013085a48ddca90005611002305c4e
[root@aliyun ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
32a07826622b nginx "/docker-entrypoint.…" 8 seconds ago Up 8 seconds nginx-2
[root@aliyun ~]# docker inspect nginx-2|grep -i network"NetworkMode": "none","NetworkSettings": {"Networks": {"NetworkID": "93b5cda924601c8d3213b06ac200db84af8c176ef095ffca11eb1d983349ebfc",
container模式
这个模式指定新创建的容器和已经存在的一个容器共享一个 Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的 IP,而是和一个指定的容器共享 IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过 lo 网卡设备通信。
例如:k8s里的pod
指定容器的网络类型为container模式
docker run --name nginx-3 -d --network=container nginx
bridge模式
当Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的Docker容器会连接到这个虚拟网桥上。从docker0子网中分配一个IP给容器使用,并设置docker0的IP地址为容器的默认网关。bridge模式是docker的默认网络模式,不写--net参数,就是bridge模式。
[root@aliyun ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:16:3e:24:c7:4b brd ff:ff:ff:ff:ff:ffinet 172.31.79.168/20 brd 172.31.79.255 scope global dynamic eth0valid_lft 314222117sec preferred_lft 314222117secinet6 fe80::216:3eff:fe24:c74b/64 scope link valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:97:75:b5:76 brd ff:ff:ff:ff:ff:ffinet 172.17.0.1/16 brd 172.17.255.255 scope global docker0valid_lft forever preferred_lft foreverinet6 fe80::42:97ff:fe75:b576/64 scope link valid_lft forever preferred_lft forever
45: br-f0a93f040807: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default link/ether 02:42:de:b1:00:68 brd ff:ff:ff:ff:ff:ffinet 172.21.0.1/16 brd 172.21.255.255 scope global br-f0a93f040807valid_lft forever preferred_lft forever
[root@aliyun ~]# docker network create my-net
f0a93f040807716579d3e2e925e27cf8842851519d3062a667302fedb7ba93a2[root@aliyun ~]# docker network ls
NETWORK ID NAME DRIVER SCOPE
3058b63e1804 bridge bridge local
e996a5a90e55 host host local
f0a93f040807 my-net bridge local
93b5cda92460 none null local[root@aliyun ~]# docker run --name sc-nignx-1 -d --network my-net -p 8080:80 nginx[root@aliyun ~]# docker network inspect my-net
[{"Name": "my-net","Id": "c5ff558adf1c11f3a361a97d8004ca193c36b28acda6d15fe69e89b678614d4b","Created": "2023-07-10T10:04:41.26258244+08:00","Scope": "local","Driver": "bridge","EnableIPv6": false,"IPAM": {"Driver": "default","Options": {},"Config": [{"Subnet": "172.18.0.0/16","Gateway": "172.18.0.1"}]},"Internal": false,"Attachable": false,"Ingress": false,"ConfigFrom": {"Network": ""},"ConfigOnly": false,"Containers": {"4d182b051ba8c18d6974df8dd97b4b4700877f2fb6cad0024650fbe48a2cff01": {"Name": "sc-nignx-1","EndpointID": "9f56a7e683622128755f541fe350687e46aa5246322446e097834c440da1e3b4","MacAddress": "02:42:ac:12:00:02","IPv4Address": "172.18.0.2/16","IPv6Address": ""}},"Options": {},"Labels": {}}
]从用户定义的网桥断开容器
[root@aliyun ~]# docker network disconnect my-net sc-nignx-1从用户定义的网桥连接容器
[root@aliyun ~]# docker network connect my-net sc-nignx-1
以上4种模式,只是考虑在同一台机器里宿主机和容器之间的通信。
IpVlan模式
IPvlan 驱动程序让用户可以完全控制 IPv4 和 IPv6 寻址。VLAN 驱动程序建立在此之上,为对底层网络集成感兴趣的用户提供了对第 2 层 VLAN 标记甚至 IPvlan L3 路由的完全控制。
要求,内核版本大于4.2以上
[root@aliyun ~]# uname -r # 查看内核版本
3.10.0-1160.90.1.el7.x86_64
架构图
[root@aliyun ~]# ip add add 192.168.3.2/24 dev eth0 label eth0:10
[root@aliyun ~]# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00inet 127.0.0.1/8 scope host lovalid_lft forever preferred_lft foreverinet6 ::1/128 scope host valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000link/ether 00:16:3e:24:c7:4b brd ff:ff:ff:ff:ff:ffinet 172.31.79.168/20 brd 172.31.79.255 scope global dynamic eth0valid_lft 314220755sec preferred_lft 314220755secinet 192.168.3.2/24 scope global eth0:10valid_lft forever preferred_lft foreverinet6 fe80::216:3eff:fe24:c74b/64 scope link valid_lft forever preferred_lft forever[root@aliyun ~]# ip route
default via 172.31.79.253 dev eth0
169.254.0.0/16 dev eth0 scope link metric 1002
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1
172.21.0.0/16 dev br-f0a93f040807 proto kernel scope link src 172.21.0.1
172.31.64.0/20 dev eth0 proto kernel scope link src 172.31.79.168
192.168.3.0/24 dev eth0 proto kernel scope link src 192.168.3.2
MacVlan模式
Docker 主机上指定一个物理接口以用于 Macvlan,以及网络的子网和网关。你甚至可以 使用不同的物理网络接口隔离 Macvlan 网络。
docker network create -d macvlan \--subnet=172.16.86.0/24 \--gateway=172.16.86.1 \-o parent=eth0 pub_net
OverLay模式
overlay网络用于连接不同机器上的docker容器,允许不同机器上的容器相互通信,同时支持对消息进行加密。Overlay网络实际上是目前最主流的容器跨节点数据传输和路由方案。
overlay的底层原理VXLAN
VXLAN(Virtual eXtensible Local Area Network,虚拟可扩展局域网),是一种虚拟化隧道通信技术。它是一种 Overlay(覆盖网络)技术,通过三层的网络来搭建虚拟的二层网络。
这篇关于dokcer || networking的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!