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

简介: 第 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

/

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。 &nbsp; &nbsp; 相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
相关文章
|
11月前
|
监控 Java API
Spring Boot 3.2 结合 Spring Cloud 微服务架构实操指南 现代分布式应用系统构建实战教程
Spring Boot 3.2 + Spring Cloud 2023.0 微服务架构实践摘要 本文基于Spring Boot 3.2.5和Spring Cloud 2023.0.1最新稳定版本,演示现代微服务架构的构建过程。主要内容包括: 技术栈选择:采用Spring Cloud Netflix Eureka 4.1.0作为服务注册中心,Resilience4j 2.1.0替代Hystrix实现熔断机制,配合OpenFeign和Gateway等组件。 核心实操步骤: 搭建Eureka注册中心服务 构建商品
1487 3
|
10月前
|
监控 Java 数据库
从零学 Dropwizard:手把手搭轻量 Java 微服务,告别 Spring 臃肿
Dropwizard 整合 Jetty、Jersey 等成熟组件,开箱即用,无需复杂配置。轻量高效,启动快,资源占用少,内置监控、健康检查与安全防护,搭配 Docker 部署便捷,是构建生产级 Java 微服务的极简利器。
1029 117
|
安全 Java Apache
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 身份和权限认证
本文介绍了 Apache Shiro 的身份认证与权限认证机制。在身份认证部分,分析了 Shiro 的认证流程,包括应用程序调用 `Subject.login(token)` 方法、SecurityManager 接管认证以及通过 Realm 进行具体的安全验证。权限认证部分阐述了权限(permission)、角色(role)和用户(user)三者的关系,其中用户可拥有多个角色,角色则对应不同的权限组合,例如普通用户仅能查看或添加信息,而管理员可执行所有操作。
690 0
|
安全 Java 数据安全/隐私保护
微服务——SpringBoot使用归纳——Spring Boot中集成 Shiro——Shiro 三大核心组件
本课程介绍如何在Spring Boot中集成Shiro框架,主要讲解Shiro的认证与授权功能。Shiro是一个简单易用的Java安全框架,用于认证、授权、加密和会话管理等。其核心组件包括Subject(认证主体)、SecurityManager(安全管理员)和Realm(域)。Subject负责身份认证,包含Principals(身份)和Credentials(凭证);SecurityManager是架构核心,协调内部组件运作;Realm则是连接Shiro与应用数据的桥梁,用于访问用户账户及权限信息。通过学习,您将掌握Shiro的基本原理及其在项目中的应用。
518 0
|
9月前
|
负载均衡 Java API
《深入理解Spring》Spring Cloud 构建分布式系统的微服务全家桶
Spring Cloud为微服务架构提供一站式解决方案,涵盖服务注册、配置管理、负载均衡、熔断限流等核心功能,助力开发者构建高可用、易扩展的分布式系统,并持续向云原生演进。
|
消息中间件 Java 微服务
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——发布/订阅消息的生产和消费
本文详细讲解了Spring Boot中ActiveMQ的发布/订阅消息机制,包括消息生产和消费的具体实现方式。生产端通过`sendMessage`方法发送订阅消息,消费端则需配置`application.yml`或自定义工厂以支持topic消息监听。为解决点对点与发布/订阅消息兼容问题,可通过设置`containerFactory`实现两者共存。最后,文章还提供了测试方法及总结,帮助读者掌握ActiveMQ在异步消息处理中的应用。
606 0
|
消息中间件 网络协议 Java
微服务——SpringBoot使用归纳——Spring Boot中集成ActiveMQ——ActiveMQ集成
本文介绍了在 Spring Boot 中集成 ActiveMQ 的详细步骤。首先通过引入 `spring-boot-starter-activemq` 依赖并配置 `application.yml` 文件实现基本设置。接着,创建 Queue 和 Topic 消息类型,分别使用 `ActiveMQQueue` 和 `ActiveMQTopic` 类完成配置。随后,利用 `JmsMessagingTemplate` 实现消息发送功能,并通过 Controller 和监听器实现点对点消息的生产和消费。最后,通过浏览器访问测试接口验证消息传递的成功性。
956 0

推荐镜像

更多