kubernetes Spring Cloud 微服务架构— (5)Kubernetes spring cloud 微服务-Docker基本网络管理

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 第 5 章 Docker 基本网络管理 本章节讲解 Docker 的四种网络模式: Bridge、Host、 None、Container;并且会详细解释这几种网络模式的工作模式方式。

5.0 网络模式基本介绍

Docker 单机网络模式分为以下几种:

1)   bridge NetWork,启动容器时使用--net=bridge参数指定,默认设置。

2)   Host NetWork ,启动容器时使用--net=host参数指定。

3)   None NetWork, 启动容器时使用--net=none参数指定。

4)   Container NetWork,启动容器时使用--net=container:NAME_or_ID参数指定。

5.1 Docker 网络模式详解

5.1.1 host 模式

 

如果启动容器的时候使用host 模式,那么这个容器将不会获得一个独立的Network Namespace,而是和宿主机共用一个Network Namespace。容器将不会虚拟出自己的网卡,配置自己的IP 等,而是使用宿主机的IP 和端口。但是容器的其他方面,如文件系统、进程列表等还是和宿主机隔离的。用主机网络的时候,一个宿主机,相同的容器,只能启动一个?

 

5.1.1.1 案例:容器网络host模式

#注意如果是host模式,命令行参数不能带-p/-P 主机端口:容器端口

# WARNING: Published ports are discarded when using host network mode 
[root@master ~]# docker run --name host_demo -it --network host gliderlabs/alpine  /bin/sh       
/ # ip a 
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     inet6 ::1/128 scope host         valid_lft forever preferred_lft forever 
2: ens32: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP qlen 1000     link/ether 00:0c:29:d0:f0:73 brd ff:ff:ff:ff:ff:ff 
    inet 192.168.91.8/24 brd 192.168.91.255 scope global ens32        valid_lft forever preferred_lft forever     inet6 fe80::c634:c8f0:327e:10a8/64 scope link  
       valid_lft forever preferred_lft forever 
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN      link/ether 02:42:da:53:55:ff brd ff:ff:ff:ff:ff:ff     inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0        valid_lft forever preferred_lft forever 
/ # ping www.baidu.com 
PING www.baidu.com (14.215.177.38): 56 data bytes 
64 bytes from 14.215.177.38: seq=0 ttl=128 time=10.177 ms 
[root@demo ~]# docker run --name nginx_host1111 -d --network host nginx 


/

 

5.1.2 bridge 模式

bridge 模式是Docker 默认的网络设置,此模式会为每一个容器分配Network Namespace、设置IP等,并将一个主机上的Docker 容器连接到一个虚拟网桥上。

 

Docker进程启动时,会在主机上创建一个名为docker0的虚拟网桥,此主机上启动的 Docker容器会连接到这个虚拟网桥上。虚拟网桥(根据MAC地址进行数据交换)的工作方式和物理交换机类似,这样主机上的所有容器就通过交换机连在了一个二层网络中。

docker0子网中分配一个IP给容器使用,并设置docker0IP地址为容器的默认网关。在主机上创建一对虚拟网卡veth pair设备,Dockerveth pair设备的一端放在新创建的容器中,并命名为eth0(容器的网卡),另一端放在主机中,以vethxxx这样类似的名字命名,并将这个网络设备加入到docker0网桥中。可以通过brctl show命令查看。如果不写--net参数,就是bridge模式。使用docker run -p时,docker实际是在iptables做了DNAT规则,实现端口转发功能。可以使用iptables -t nat -vnL查看。

 

5.1.2.1 案例:容器网络模式桥接

#此模式可以添加端口映射参数:-p 2000:22

[root@master ~]# docker run --name   host_demo_bridge -it --network bridge gliderlabs/alpine  /bin/sh 
/ # ip a 
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 
6: eth0@if7:   <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN> mtu 1500 qdisc noqueue state   UP      link/ether 02:42:ac:11:00:02   brd ff:ff:ff:ff:ff:ff     inet   172.17.0.2/16 brd 172.17.255.255 scope global eth0        valid_lft forever preferred_lft   forever

5.1.3 container 模式

Container 模式指定新创建的容器和已经存在的一个容器共享一个Network Namespace,而不是和宿主机共享。新创建的容器不会创建自己的网卡,配置自己的IP,而是和一个指定的容器共享IP、端口范围等。同样,两个容器除了网络方面,其他的如文件系统、进程列表等还是隔离的。两个容器的进程可以通过localhost 网卡设备通信。

 

 

5.1.3.1 案例:容器网络使用container

#使用其他容器的桥接网卡出外网, 此模式不支持-p主机端口:容器端口

[root@master ~]# docker run --name   host_demo_container -it \ 
--network container:host_demo_bridge   gliderlabs/alpine  /bin/sh 
/ # ip a 
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 
8: eth0@if9: <BROADCAST,MULTICAST,UP,LOWER_UP,M-DOWN>   mtu 1500 qdisc noqueue state UP        link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff     inet 172.17.0.2/16 brd 172.17.255.255   scope global eth0        valid_lft   forever preferred_lft forever

5.1.4 none 模式

使用none 模式,Docker 容器拥有自己的Network Namespace,但是,并不为Docker 容器进行任何网络配置。也就是说,这个Docker 容器没有网卡、IP、路由等信息。需要我们自己为Docker 容器添加网卡、配置IP 等。

 

 

 

5.1.4.1 案例容器网络模式为none模式

[root@master ~]# docker run --name   host_demo_none -it --network none gliderlabs/alpine  /bin/sh 
/ # ip a 
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

5.2 容器网络操作
5.2.1 容器网络配置查看
语法:docker container inspect 容器ID
#系统默认分配的IP 地址段为172.17.0.0/16

[root@docker chapter]# docker container inspect 658273be34ee 
........省略......... 
"NetworkSettings": { 
"Bridge": "", 
"SandboxID": "d2e6b8e57c55a552abb825b11ed3faff4541fe28fa20244caa29ee2b2ed8ce74", 
"HairpinMode": false, 
"LinkLocalIPv6Address": "", 
"LinkLocalIPv6PrefixLen": 0, 
"Ports": { 
"80/tcp": [ 
{ 
"HostIp": "0.0.0.0", 
"HostPort": "80" 
} 
] 
}, 
"SandboxKey": "/var/run/docker/netns/d2e6b8e57c55",
"SecondaryIPAddresses": null, 
"SecondaryIPv6Addresses": null, 
"EndpointID": "73023ec84983ee451e065700c61c8b43bc67fafb3997946002a7a48ca24923cf", 
"Gateway": "172.17.0.1", 
"GlobalIPv6Address": "", 
"GlobalIPv6PrefixLen": 0, 
"IPAddress": "172.17.0.2", 
"IPPrefixLen": 16,

/

 

5.2.2 容器端口映射

容器中可以运行一些网络应用,要让外部也可以访问这些应用,可以通过 -P -p 参数来指定端口映射。当使用 -P(大写) 标记时,Docker 会随机映射一个端口到内部容器开放的网络端口。当使用 -p(小写)标记时,Docker 指定一个宿主机端口映射到到内如容器开放的网络端口。使用 docker ps 可以看到,本地主机的端口被映射到了容器端口。

 

在一个指定端口上只可以绑定一个容器。

指定映射(docker 会自动添加一条iptables规则来实现端口映射)

-p hostPort:containerPort

#映射主机指定端口8080到容器的端口80

[root@docker master ]# docker run --name nginx-demo -p 8080:80 -d nginx 
#查看 iptables 
[root@master ~]# iptables -L -n -t nat | grep 8080 
DNAT       tcp --  0.0.0.0/0            0.0.0.0/0            tcp dpt:8080 to:172.17.0.4:80 
-p ip:hostPort:containerPort 
#映射主机的指定IP 与指定 8180端口到容器80端口 
[root@master ~]# docker run --name nginx-demo-8180 -p 192.168.91.8:8180:80 -d nginx 
#查看 iptables 
[root@master ~]# iptables -L -n -t nat | grep 8180 
DNAT       tcp --  0.0.0.0/0            192.168.91.8         tcp dpt:8180 to:172.17.0.5:80 
-p ip::containerPort(随机端口) 
[root@master ~]# docker run --name nginx-1 -p 192.168.91.8::80 -d nginx 
[root@master ~]# docker ps 
CONTAINER ID        IMAGE               COMMAND                  CREATED              STATUS              PORTS                        NAMES f5fb8604f330        nginx               "nginx -g 'daemon of…"   7 seconds ago        Up 6 seconds        192.168.91.8:32768->80/tcp   nginx-1 
-p hostPort:containerPort/udp 
 [root@master ~]# docker run --name dns-udp -p 53:53/udp -d andyshinn/dnsmasq #命令成功
-p 81:80 –p 443:443 可以指定多个-p 
[root@master ~]# docker run --name nginx-demo-81 -p 81:80 -p 32:22 -d nginx 
-P 宿主机随机端口映射 
[root@master ~]# docker run --name nginx-port -P -d nginx 
[root@master ~]# docker ps | grep nginx-port 
e08c51faced1        nginx               "nginx -g 'daemon of…"   7 seconds ago       Up 5 seconds        0.0.0.0:32769->80/tcp 
#查看容器的端口映射 
[root@master ~]# docker port 4a52c7b5035b 80/tcp -> 192.168.91.8:8110

/

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
3天前
|
缓存 网络协议 网络架构
Docker 网络 IP 地址冲突,就该这么处理!
Docker 网络 IP 地址冲突,就该这么处理!
|
1天前
|
网络协议 Linux 网络安全
遇到Docker容器网络隔断?揭秘六种超级实用解决方案,轻松让Docker容器畅游互联网!
【8月更文挑战第18天】Docker容器内网络不通是开发者常遇问题,可能因网络配置错、Docker服务异常或防火墙阻碍等原因引起。本文提供六种解决策略:确认Docker服务运行状态、重启Docker服务、检查与自定义Docker网络设置、验证宿主机网络连接、临时禁用宿主机IPv6及检查防火墙规则。通过这些步骤,多数网络问题可得以解决,确保容器正常联网。
9 1
|
3天前
|
运维 安全 SDN
网络拓扑设计与优化:构建高效稳定的网络架构
【8月更文挑战第17天】网络拓扑设计与优化是一个复杂而重要的过程,需要综合考虑多方面因素。通过合理的拓扑设计,可以构建出高效稳定的网络架构,为业务的顺利开展提供坚实的支撑。同时,随着技术的不断进步和业务需求的不断变化,网络拓扑也需要不断优化和调整,以适应新的挑战和机遇。
|
8天前
|
监控 安全 虚拟化
Docker技术概论(5):Docker网络
Docker技术概论(5):Docker网络
41 6
|
12天前
|
前端开发 Java UED
"揭秘!如何以戏剧性姿态,利用SpringCloud铸就无懈可击的异常处理铁壁,让你的微服务架构稳如泰山,震撼业界!"
【8月更文挑战第8天】随着Spring Cloud在微服务架构中的广泛应用,统一异常处理成为确保系统稳定性和提升用户体验的关键。传统方式在各服务中单独处理异常导致代码冗余且不一致。因此,采用Spring Cloud封装统一异常处理机制变得尤为重要:它减少了冗余代码,提升了异常处理的一致性和系统的可维护性,并通过统一错误响应格式优化了用户体验。实现这一机制可通过定义全局异常处理器、自定义业务异常并在服务中适当抛出这些异常来完成。这种方式遵循了微服务设计中的“服务治理”和“契约先行”原则,为构建健壮的微服务系统打下了基础。
25 1
|
21小时前
|
Docker 容器
在Docker中,网络模式有哪些?
在Docker中,网络模式有哪些?
|
3天前
|
Java 数据库连接 Nacos
SpringCloud微服务配置管理、配置热更新
SpringCloud微服务配置管理、配置热更新
14 0
|
4天前
|
Docker 容器
Docker - 网络模式与容器网络互连
Docker的网络模式包括桥接模式、主机模式和覆盖网络模式,以及如何通过Docker的网络操作命令实现容器网络互连。
12 0
|
3天前
|
监控 负载均衡 API
从单体到微服务:架构转型之道
【8月更文挑战第17天】从单体架构到微服务架构的转型是一项复杂而系统的工程,需要综合考虑技术、团队、文化等多个方面的因素。通过合理的规划和实施策略,可以克服转型过程中的挑战,实现系统架构的升级和优化。微服务架构以其高度的模块化、可扩展性和灵活性,为业务的持续发展和创新提供了坚实的技术保障。