kubernetes Spring Cloud 微服务架构— (2)Kubernetes spring cloud 微服务-Docker 镜像

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
云原生网关 MSE Higress,422元/月
注册配置 MSE Nacos/ZooKeeper,118元/月
简介: 在上章节对 Docker 有了初步的了解之后,在本章将学习容器镜像的加载流程,镜像的基本 操作以及与系统存储技术 OverlayFS 的关系。 第 2 章 Docker 镜像

2.0 容器运行基础



镜像是 Docker 运行的基础, 就好比计算机硬件需要安装操作系统. 使用 Docker Images 命 令可以看到当前系统中存在的镜像。当运行容器时,使用的镜像如果在本地系统中不存 在,Docker 就会自动从 Docker 镜像仓库或者配置的私有仓库中下载;默认是从 Docker Hub 公共镜像源下载。

上节在 Docker C/S 架构逻辑图中提到了私有仓库。这节主要讲镜像的基本操作。



2.1 Docker 加载镜像流程

1)检查本地是否有与启动镜像相匹配的镜像。 
2)查询与镜像地址中是否有启动镜像 
3)如果在镜像地址中没有完整的地址,则从默认的 Docker Hub 下载。 
Docker 加载镜像的两种方式:
公共仓库与私有仓库

2.2 Docker 镜像基本操作


2.2.1 搜索 Docker Hub 有哪些镜像

docker search [镜像名字]
[root@master jdk]# docker search nginx


/

2.2.2 从 Docker Hub 下载镜像


/

下载镜像,(没有指定版本,默认会下载最新版 latest) 
docker pull nginx:latest = docker pull nginx
[root@master jdk]# docker pull nginx:latest
从第三方docker 镜像仓库或者私有仓库下载镜像方法
[root@docker ~]# docker pull repo.abc.com/httpd:latest #地址不存在

2.2.3 镜像加速器


在下载 Docker Hub 镜像非常慢的情况下, 可以使用镜像加速功能。配置加速可以用官网 提供的, 也可以使用私有仓库。

sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF' 
{
"registry-mirrors": ["https://plqjafsr.mirror.aliyuncs.com"]
}
EOF
[root@master ~]# systemctl daemon-reload 
[root@master ~]# systemctl restart docker

2.2.4 基于容器创建镜像系统

  • 类似虚拟机的克隆功能
  • 在运行当中的容器基础上创建一个新的镜像(相当于 vm 的完整快照)
[root@docker ~]# docker ps -a #显示所有的容器, ps 只是显示正在运行的容器 
[root@master ~]# docker run -d -P nginx #启动容器
[root@master /]# docker container commit 960d3f0e61eb centos-nginx:1.0 #容器运行 ID
sha256:7af7ffdea5e8ef703fb7cb30baaff3b3e75a1297bfbc75bb15454dd7eb622215
#检查
[root@master /]# docker images REPOSITORY TAG centos-nginx 1.0
#不能删除原来的镜像(父镜像)
[root@master /]# docker rmi 6678c7c2e56c
Error response from daemon: conflict: unable to delete 6678c7c2e56c (cannot be forced) - image has dependent child images
#使用快照镜像启动新容器
[root@master /]# docker run -d -p 8090:80 centos-nginx:1.0
1dabb29c5a87a4ec8d58040e6ea4a21dcb17dda006168ce56021fd232208c18d

2.2.5 删除镜像

[root@master ~]# docker image rm centos-nginx Error: No such image: centos-nginx
[root@docker ~]# docker image rm 07ddb4d9a8ab
Untagged: centos-nginx:latest
Deleted: sha256:07ddb4d9a8abfd51849f6b2747c115a28e2dd9587a56af881c43cc890e874861 
Deleted: sha256:41c4debe112f55832a841e976e96d61ad170c7646460560799313c82f9f36f44
[root@docker ~]# docker rmi fdf13fa91c6e
Error response from daemon: conflict: unable to delete fdf13fa91c6e (must be forced) - image is being used by stopped container f30520fafcbf 
#注:如果镜像系统正在运行,需要停止进程才可以删除镜像系统,否则无法删除!
或者选择强制删除 (注意镜像之间的依赖关系)
[root@docker ~]# docker rmi --force fdf13fa91c6e
[root@docker ~]# docker rmi -f fdf13fa91c6e #缩写 -f 参数 == --force

2.2.6 导出镜像

 #导出镜像为 tar 包
[root@master /]# docker image save nginx:latest > nginx.tar.gz

2.2.7 导入镜像

直接使用tar 包导入镜像,注意如果原来导出的源镜像还是在存在于系统中,那么新导入的 镜像在系统将不可见。

[root@master /]# docker image load -i nginx.tar.gz 
Loaded image: nginx:latest
#强制删除原来的镜像
[root@master /]# docker rmi nginx:latest --force
#再执行导入
[root@master /]# docker image load -i nginx.tar.gz 
Loaded image: nginx:latest
#最后查看
[root@master /]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
nginx latest 6678c7c2e56c 9 days ago 127MB

2.2.8 镜像tag标签


语法:docker image tag 源_IMAGE[:TAG] 目标_IMAGE[:TAG]

类似linux 硬链接,在推送镜像到私有仓库时,需要添加tag。

[root@docker01 ~]# docker image tag nginx:latest repo.abc.com/nginx:v1.0
[root@master /]# docker images
REPOSITORY TAG nginx latest repo.abc.com/nginx v1.0
IMAGE ID 6678c7c2e56c 6678c7c2e56c
CREATED 9 days ago
9 days ago
SIZE
127MB 127MB
#可以使用新的 tag 标签启动容器
[root@master /]# docker run -d -p 9091:80 repo.abc.com/nginx:v1.0
1f5f20b763ccb7661b41701b9319876a0bd074da12e4e77ba0ff7879c2b19627

2.2.9 构建Java基础镜像

之前使用为Docker自带镜像仓库中的镜像,现在我们自己来构建私有镜像 #在java 镜像中为什么要构建alpine-glibc ?

#在java 镜像中为什么要构建alpine-glibc ?
#Java Dockerfile
[root@master /]# mkdir -p /root/jdk/
[root@master /]# vim Dockerfile
FROM frolvlad/alpine-glibc
#模板镜像
MAINTAINER 地铁昌平线
#创建者
RUN echo "https://mirror.tuna.tsinghua.edu.cn/alpine/v3.4/main/" > /etc/apk/repositories #修改源
RUN apk add --no-cache bash
#安装 bash
ADD jre1.8.0_211.tar.gz /usr/java/jdk/
#添加文件
ENV JAVA_HOME /usr/java/jdk/jre1.8.0_211
#设置环境变量
ENV PATH ${PATH}:${JAVA_HOME}/bin
RUN chmod +x /usr/java/jdk/jre1.8.0_211/bin/java
WORKDIR /opt

2.3.0 构建镜像

#需要把 jre1.8.0_211.tar.gz 放到与 Dockerfile 同级目录 
[root@docker01 ~]# docker pull frolvlad/alpine-glibc  #拉取镜像 
[root@master jdk]# docker build -t jre8:1.0 .         #编译镜像 
#查看镜像 
[root@master jdk]# docker images 
REPOSITORY        TAG                 IMAGE ID            CREATED             SIZE jre8                1.0                 c65645093f97        16 seconds ago      136MB #添加 tag 
[root@master jdk]# docker tag jre8:1.0 repo.abc.com/jre8:v1.0 

2.3.0.1 运行镜像

[root@docker01 ~]# docker run -it jre8:1.0  #启动并且进入容器
bash    bash-4.3# java -version 
java version "1.8.0_211" 
Java(TM) SE Runtime Environment (build 1.8.0_211-b12) 
Java HotSpot(TM) 64-Bit Server VM (build 25.211-b12, mixed mode) 

2.3.1 镜像构建过程

构建容器:通过父镜像上创建一个容器,重新封装成一个镜像,变成下一个新启动容器的只读层(LOWER)。 但是如果当前容器需要对镜像进行修改,就需要加载所有镜像的只读层到容器中进行修改。

#特别注意之前提到的容器启动,修改镜像内容是不会修改源镜像;只是修改启动容器的内容。在下一节将详细讲述镜像存储的原理。

 

#查看容器的构建历史

# missing 为当前镜像的源镜像构建历史 FROM frolvlad/alpine-glibc

# f83c32dc03f3 为当前镜像构建的历史

[root@master jdk]# docker history jre8:1.3 
IMAGE               CREATED              CREATED BY                                      SIZE                COMMENT ea65e9cde677        About a minute ago   /bin/sh -c #(nop) WORKDIR /opt                  0B                   d0afad7e579e        About a minute ago   /bin/sh -c chmod +x /usr/java/jdk/jre1.8.0_2…   8.46kB               
12d49a4a8a61        6 minutes ago        /bin/sh -c #(nop)  ENV PATH=/usr/local/sbin:…   0B                   256df34ef73f        6 minutes ago        /bin/sh -c #(nop)  ENV JAVA_HOME=/usr/java/j…   0B                   dba16cec6c49        7 minutes ago        /bin/sh -c #(nop) ADD file:d614f1012c68493ba…   116MB                22b0f5f4b551        17 minutes ago       /bin/sh -c apk add --no-cache bash              3.56MB               c97cdc4cfa33        17 minutes ago       /bin/sh -c echo "https://mirror.tuna.tsinghu…   54B                  f26f217e4a3f        17 minutes ago       /bin/sh -c #(nop)  MAINTAINER Tony              0B                   f83c32dc03f3        2 days ago           /bin/sh -c apk add --update curl &&   curl -…   11.7MB               
<missing>           2 days ago           /bin/sh -c #(nop)  ENV GLIBC_VERSION=2.31-r0    0B                   
<missing>           2 days ago           /bin/sh -c #(nop)  MAINTAINER Jean Blanchard…   0B                   
<missing>           7 weeks ago          /bin/sh -c #(nop)  CMD ["/bin/sh"]              0B                   
<missing>           7 weeks ago          /bin/sh -c #(nop) ADD file:e69d441d729412d24…   5.59MB 

2.3.2 查询镜像详情

#存储信息

[root@master jdk]# docker image inspect jre8:1.3 

2.4  Docker 镜像和 Overlay2 关系

Docker 需要OverlayFS文件系统存储

1)Docker中的镜像采用分层构建设计,每个层可以称之为"layer", 镜像文件默认存在目录:/var/lib/docker/overlay2

2) Docker支持的文件存储如下: AUFSOverlayFSVFSBrtfs等。

3)通过Docker Info命令查看当前的存储驱动  

[root@node-2 overlay2]# docker info | grep -E  " Storage Driver|Server Version" 
Server Version: 19.03.4 
Storage Driver: overlay2

4)通常ubuntu类的系统默认采用的是AUFScentos7.1+系列采用的是OverlayFS

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
相关文章
|
1月前
|
弹性计算 API 持续交付
后端服务架构的微服务化转型
本文旨在探讨后端服务从单体架构向微服务架构转型的过程,分析微服务架构的优势和面临的挑战。文章首先介绍单体架构的局限性,然后详细阐述微服务架构的核心概念及其在现代软件开发中的应用。通过对比两种架构,指出微服务化转型的必要性和实施策略。最后,讨论了微服务架构实施过程中可能遇到的问题及解决方案。
|
1月前
|
Java 开发者 微服务
从单体到微服务:如何借助 Spring Cloud 实现架构转型
**Spring Cloud** 是一套基于 Spring 框架的**微服务架构解决方案**,它提供了一系列的工具和组件,帮助开发者快速构建分布式系统,尤其是微服务架构。
199 69
从单体到微服务:如何借助 Spring Cloud 实现架构转型
|
1月前
|
运维 监控 持续交付
微服务架构解析:跨越传统架构的技术革命
微服务架构(Microservices Architecture)是一种软件架构风格,它将一个大型的单体应用拆分为多个小而独立的服务,每个服务都可以独立开发、部署和扩展。
264 36
微服务架构解析:跨越传统架构的技术革命
|
1月前
|
Cloud Native API 持续交付
云原生架构下的微服务治理策略与实践####
本文旨在探讨云原生环境下微服务架构的治理策略,通过分析当前面临的挑战,提出一系列实用的解决方案。我们将深入讨论如何利用容器化、服务网格(Service Mesh)等先进技术手段,提升微服务系统的可管理性、可扩展性和容错能力。此外,还将分享一些来自一线项目的经验教训,帮助读者更好地理解和应用这些理论到实际工作中去。 ####
49 0
|
3月前
|
人工智能 自然语言处理 前端开发
SpringBoot + 通义千问 + 自定义React组件:支持EventStream数据解析的技术实践
【10月更文挑战第7天】在现代Web开发中,集成多种技术栈以实现复杂的功能需求已成为常态。本文将详细介绍如何使用SpringBoot作为后端框架,结合阿里巴巴的通义千问(一个强大的自然语言处理服务),并通过自定义React组件来支持服务器发送事件(SSE, Server-Sent Events)的EventStream数据解析。这一组合不仅能够实现高效的实时通信,还能利用AI技术提升用户体验。
283 2
|
3天前
|
缓存 安全 Java
Spring Boot 3 集成 Spring Security + JWT
本文详细介绍了如何使用Spring Boot 3和Spring Security集成JWT,实现前后端分离的安全认证概述了从入门到引入数据库,再到使用JWT的完整流程。列举了项目中用到的关键依赖,如MyBatis-Plus、Hutool等。简要提及了系统配置表、部门表、字典表等表结构。使用Hutool-jwt工具类进行JWT校验。配置忽略路径、禁用CSRF、添加JWT校验过滤器等。实现登录接口,返回token等信息。
82 12
|
22天前
|
Java 数据库连接 Maven
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
自动装配是现在面试中常考的一道面试题。本文基于最新的 SpringBoot 3.3.3 版本的源码来分析自动装配的原理,并在文未说明了SpringBoot2和SpringBoot3的自动装配源码中区别,以及面试回答的拿分核心话术。
最新版 | 深入剖析SpringBoot3源码——分析自动装配原理(面试常考)
|
8天前
|
Java 测试技术 应用服务中间件
Spring Boot 如何测试打包部署
本文介绍了 Spring Boot 项目的开发、调试、打包及投产上线的全流程。主要内容包括: 1. **单元测试**:通过添加 `spring-boot-starter-test` 包,使用 `@RunWith(SpringRunner.class)` 和 `@SpringBootTest` 注解进行测试类开发。 2. **集成测试**:支持热部署,通过添加 `spring-boot-devtools` 实现代码修改后自动重启。 3. **投产上线**:提供两种部署方案,一是打包成 jar 包直接运行,二是打包成 war 包部署到 Tomcat 服务器。
34 10
|
9天前
|
存储 安全 Java
Spring Boot 3 集成Spring AOP实现系统日志记录
本文介绍了如何在Spring Boot 3中集成Spring AOP实现系统日志记录功能。通过定义`SysLog`注解和配置相应的AOP切面,可以在方法执行前后自动记录日志信息,包括操作的开始时间、结束时间、请求参数、返回结果、异常信息等,并将这些信息保存到数据库中。此外,还使用了`ThreadLocal`变量来存储每个线程独立的日志数据,确保线程安全。文中还展示了项目实战中的部分代码片段,以及基于Spring Boot 3 + Vue 3构建的快速开发框架的简介与内置功能列表。此框架结合了当前主流技术栈,提供了用户管理、权限控制、接口文档自动生成等多项实用特性。
47 8
|
29天前
|
NoSQL Java Redis
Spring Boot 自动配置机制:从原理到自定义
Spring Boot 的自动配置机制通过 `spring.factories` 文件和 `@EnableAutoConfiguration` 注解,根据类路径中的依赖和条件注解自动配置所需的 Bean,大大简化了开发过程。本文深入探讨了自动配置的原理、条件化配置、自定义自动配置以及实际应用案例,帮助开发者更好地理解和利用这一强大特性。
93 14