微服务学习|初识Docker、使用Docker、自定义镜像、DockerCompose、Docker镜像仓库
初识Docker
项目部署的问题
大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题
依赖关系复杂,容易出现兼容性问题
开发、测试、生产环境有差异
Docker如何解决依赖的兼容问题的?
将应用的Libs (函数库)、Deps (依赖)配置与应用一起打包
将每个应用放到一个隔离容器去运行,避免互相干扰
内核与硬件交互,提供操作硬件的指令,系统应用封装内核指令为函数,便于程序员调用用户程序基于系统函数库实现功能
Ubuntu和Centos都是基于Linux内核,只是系统应用不同,提供的函数库有差异
Docker如何解决不同系统环境的问题?
Docker将用户程序与所需要调用的系统(比如Ubuntu)函数库一起打包
Docker运行到不同操作系统时,直接基于打包的库函数,借助于操作系统的Linux内核来运行
Docker如何解决大型项目依赖关系复杂,不同组件依赖的兼容性问题?
Docker允许开发中将应用、依赖、函数库、配置一起打包,形成可移植镜像
Docker应用运行在容器中,使用沙箱机制,相互隔离
Docker如何解决开发、测试、生产环境有差异的问题?
Docker镜像中包含完整运行环境,包括系统函数库,仅依赖系统的Linux内
核,因此可以在任意Linux操作系统上运行
总结
Docker是一个快速交付应用、运行应用的技术:
1.可以将程序及其依赖、运行环境一起打包为一个镜像可以迁移到任意Linux操作系统
2.运行时利用沙箱机制形成隔离容器,各个应用互不干扰
3.启动、移除都可以通过一行命令完成,方便快捷
Docker与虚拟机
虚拟机(virtual machine)是在操作系统中模拟硬件设备,然后运行另一个操作系统,比如在 Windows 系统里面运行Ubuntu 系统,这样就可以运行任意的Ubuntu应用了
Docker和虚拟机的差异:
docker是一个系统进程;虚拟机是在操作系统中的操作系统
docker体积小、启动速度快、性能好;虚拟机体积大、启动速度慢、性能一般
镜像和容器
镜像(lmage):Docker将应用程序及其所需的依赖、函数库、环境、配置等文件打包在一起,称为镜像.
容器(Container):镜像中的应用程序运行后形成的进程就是容器,只是Docker会给容器做隔离,对外不可见。
Docker和DockerHub
DockerHub: DockerHub是一个Docker镜像的托管平台。这样的平台称为Docker Registry。国内也有类似于DockerHub 的公开服务,比如 网易云镜像服务、阿里云镜像库等
docker架构
Docker是一个CS架构的程序,由两部分组成:
服务端(server): Docker守护进程,负责处理Docker指令,管理镜像、容器等
客户端(client): 通过命令或RetAPI向Docker服务端发送指令。可以在本地或远程向服务端发送指令
安装Docker
企业部署一般都是采用Linux操作系统,而其中又数CentOs发行版占比最多,因此我们在entOS下安装Docker。
Docker 分为 CE和EE 两大版本。CE 即社区版(免费,支持周期7个月),EE 即企业版强调安全,付费使用,支持周期 24 个月。
Docker CE分为 stable test 和nightly 三个更新频道
官方网站上有各种环境下的安装指南,这里主要介绍 Docker CE在Centos上的安装
Docker CE 支持64 位版本 Centos7,并且要求内核版本不低于 3.10,Centos 7 满足最低内核的要求,所以我们在Centos 7安装Docker。
如果之前安装过旧版本的Docker,可以使用下面命令卸载:
首先需要大家虚拟机联网,安装yum工具
然后更新本地镜像源
然后输入命令
启动docker
Docker应用需要用到各种端口,逐一去修改防火墙设置。非常麻烦,因此建议大家直接关闭防火墙!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
启动docker前,一定要关闭防火墙后!!
通过命令启动docker
然后输入命令,可以查看docker版本:
先敲入关闭防火墙的命令,再查看防火墙状态,确认为dead,然后敲入启动docker命令,启动docker
启动docker后,可敲入查看docker状态指令查看其状态是否为运行状态
配置镜像
docker官方镜像仓库网速较差,我们需要设置国内镜像
配置镜像加速器
针对Docker客户端版本大于 1.10.0 的用户
您可以通过修改daemon配置文件 /etc/docker/daemon.json 来使用加速器
使用Docker
镜像相关命令
镜像名称一般分两部分组成:[repository]:[tag]
在没有指定tag时,默认是latest,代表最新版本的镜像
镜像操作命令
案例:从DockerHub中拉取一个nginx镜像并查看
1.首先去镜像仓库搜索nginx镜像,比如DackerHub:
2.根据查看到的镜像名称,拉取自己需要的镜像
docker pull nginx命令,从DackerHub拉取nginx镜像,并且默认tag版本为latest
3.通过命令: docker images 查看拉取到的镜像
案例:利用docker save将nginx镜像导出磁盘,然后再通过load加载回来
docker save --help 查看该命令的语法,然后将nginx镜像保存为一个名为nginx.tar的压缩包,ll命令可查看当前目录的文件信息,发现nginx.tar已经被创建好。
先将docker中已经存在的nginx镜像删除,然后再查看docker中镜像,发现目前已经没有nginx镜像了
将原本的nginx镜像删除后,再用docker load -i nginx.tar命令,把nginx.tar压缩包加载为nginx镜像,再docker images命令查看docker中的镜像,发现nginx镜像又被创建了出来。
容器相关命令
案例:创建运行一个Nginx容器
去docker hub查看Nginx的容器运行命令
docker run --name containerName -p 80:80 -d nginx 查找到该命令后,对该命令进行解读
运行该命令创建nginx容器并命名为mn,docker ps 查看当前所有运行中的容器及其状态
该mn容器在启动中,我们访问该宿主机ip以及对应的端口
nginx可以访问到,说明容器成功运行
docker logs mn命令,我们可以查看mn容器的运行日志
docker logs -f mn,可持续的查看日志
案例:进入Nginx容器,修改HTML文件内容,添加“传智教育欢迎您”
1.进入容器。进入我们刚刚创建的nginx容器的命令为
在DackerHub查到nginx镜像中,html的位置
2.进入nginx的HTML所在目录 /usr/share/nginx/html
3.修改indexhtml的内容
修改后,再次访问宿主机ip以及对应端口,发现页面已经更改
数据卷
容器与数据耦合的问题
数据卷(volume)是一个虚拟目录,指向宿主机文件系统中的某个目录。
数据卷操作的基本语法如下:
上一个案例,我们先docker volume create html命令在docker中创建一个html的数据卷,并docker volume ls命令查看是否创建好
docker volume inspect html命令可查看该数据卷绑定的具体位置
数据卷的作用:
将容器与数据分离,解耦合,方便操作容器内数据,保证数据安全
挂载数据卷
我们在创建容器时,可以通过-v参数来挂载一个数据卷到某个容器目录
案例:创建一个nginx容器,修改容器内的html目录内的index.html内容
需求说明:上个案例中,我们进入nginx容器内部,已经知道nginx的html目录所在位置usr/share/nginx/html,我们需要把这个目录挂载到html这个数据卷上,方便操作其中的内容
1.创建容器并挂载数据卷到容器内的HTML目录
2.进入html数据卷所在位置,并修改HTML内容
查询html数据卷的信息,查找到该数据卷实际的位置,在宿主机直接进入到该文件目录,使用vscode等高级的编辑器直接打开要修改的页面文件进行修改
修改保存后,再次访问该宿主机ip以及该容器的端口,发现以及修改成功
案例:创建并运行一个MySOL容器,将宿主机目录直接挂载到容器
将mysql.tar压缩文件加载为镜像
docker images 查看所有镜像,发现mysql镜像已经被创建
创建data和conf目录,并将提前准备的hmy.cnf放到conf目录下
在DackerHub上查看配置文件conf在mysql镜像中的位置,方便我们一会将我们本地自己创建的那个conf目录挂载到这个位置
将我们本地自己创建的data目录挂载和自己创建的conf目录下的hmy.cnf文件都挂载到mysql镜像中对应的位置,执行下面的创建mysql容器命令
执行该命令创建mysql容器
docker ps命令查看当前所有启动的容器,发现mysql容器已经被创建
此时,我们打开我们本地自己创建的data目录,因为其已经挂载到了mysql容器中对应位置的data目录,所以此时容器内的data目录内容已经出现在了我们自己本地创建的data目录中。对这些内容操作即是对容器的的目录内容进行操作。
数据卷挂载的方式对比
挂载数据卷我们不知道具体的本地文件位置,但是不麻烦,挂载自己创建的文件目录与文件虽然麻烦些,但是可以自定义具体的位置。数据卷挂载耦合度低,由docker来管理目录,但是
目录较深,不好找。目录挂载耦合度高,需要我们自己管理目录,不过目录容易寻找查看。
自定义镜像
镜像结构
镜像是分层结构,每一层称为一个Layer
什么是Dockerfile
Dockerfile就是一个文本文件,其中包含一个个的指令(Instruction),用指令来说明要执行什么操作来构建镜像。每一个指令都会形成一层Layer。
案例:基于Ubuntu镜像构建一个新镜像,运行一个java项目
Dockerfile文件内容
创间一个docker-demo文件夹并进入
将提前准备好的项目jar包和jdk.tar.gz以及Dockerfile三个文件放入这个目录中
然后再这个目录中执行docker build -t javaweb:1.0 . 命令,自定义创建一个镜像名为javaweb:1.0
docker images命令查看镜像是否被创建,然后执行docker run --name web -p 8090:8090 -d javaweb:1.0命令,将该镜像启动为一个名字为web的容器
访问宿主机ip以及该容器对应的端口,发现可以访问,容器启动成功。
如果每创建一个镜像,都需要执行这么多命令,是很复杂的,而且可以发现基础镜像ubuntu和jdk这些是每个镜像都需要配的,我们可以把这个提取出成一个单独的镜像,让命令更简单化。
案例:基于java:8-alpine镜像,将一个Java项目构建为镜像
将上述Dockerfile文件简化为如下所示。
总结
1.Dockerfile的本质是一个文件,通过指令描述镜像的构建过程
2.Dockerfile的第一行必须是FROM,从一个基础镜像来构建
3.基础镜像可以是基本操作系统,如ubuntu。也可以是其他人制作好的镜像,例如:java:8-alpine
什么是DockerCompose
Docker Compose可以基于Compose文件帮我们快速的部署分布式应用,而无需手动一个个创建和运行容器!Compose文件是一个文本文件,通过指令定义集群中的每个容器如何运行。
上述Compose文件内容等价于执行下面的这些指令
CentOS7安装DockerCompose
如果下载速度较慢,或者下载失败,可以使用课前资料提供的docker-compose文件
上传到/usr/local/bin/目录也可以。
修改文件权限:
将下载好的docker-compose放到/usr/local/bin/目录,进入该目录执行上述修改权限的命令
Base自动补全命令
DockerCompose有什么作用?
帮助我们快速部署分布式应用,无需一个个微服务去构建镜像和部署。
案例:将之前学习的cloud-demo微服务集群利用DockerCompose部署
实现思路如下:
1.查看课前资料提供的cloud-demo文件夹,里面已经编写好了docker-compose文件
每个目录中都有已经编写好的Dockerfile文件
内容都是为了构建该模块为一个镜像
docker-compose.yml文件内容大概如下,都是为了将各个镜像启动为容器
2.修改自己的cloud-demo项月,将数据库、nacos地址都命名为docker-compose中的服务名
user-service模块中,nacos的地址修改
user-service模块中,连接数据库地址修改
order-service模块中,连接数据库地址修改
gateway模块中,nacos的地址修改
3.使用maven打包工具,将项目中的每个微服务都打包为app.jar
每个模块中的maven依赖配置下,打包为app.jar
打包
4.将打包好的app.jar拷贝到cloud-demo中的每一个对应的子目录中
5.将cloud-demo上传至虚拟机,利用 docker-compose up -d 来部署
如果启动有些问题,可以用下面的命令重启这几个容器
访问对应的ip地址用网关对外暴露的端口10010,发现可以执行,说明项目部署完成
Docker镜像仓库
常见镜像仓库服务
镜像仓库( Docker Registry ) 有公共的和私有的两种形式:
公共仓库:例如Docker官方的 Docker Hub,国内也有一些云服务商提供类似于 Docker Hub 的公开服务,比如网易云镜像服务、DaoCloud 镜像服务、阿里云镜像服务等。
除了使用公开仓库外,用户还可以在本地搭建私有 Docker Registry。企业自己的镜像最好是采用私有DockerRegistry来实现
简化版镜像仓库
Docker官方的Docker Registry是一个基础版本的Docker镜像仓库,具备仓库管理的完整功能,但是没有图形化界面。
搭建方式比较简单,命令如下:
带有图形化界面版本
使用DockerCompose部署带有图象界面的DockerRegistry,命令如下
配置Docker信任地址
我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置
docker-compose.yml的内容为
执行
访问对应地址,可以访问
在私有镜像仓库推送或拉取镜像
相关文章:

微服务学习|初识Docker、使用Docker、自定义镜像、DockerCompose、Docker镜像仓库
初识Docker 项目部署的问题 大型项目组件较多,运行环境也较为复杂,部署时会碰到一些问题 依赖关系复杂,容易出现兼容性问题 开发、测试、生产环境有差异 Docker如何解决依赖的兼容问题的? 将应用的Libs (函数库)、Deps (依赖)配置与应用…...

蓝桥杯每日一题2023.11.24
题目描述 #include <stdio.h> #define N 100int connected(int* m, int p, int q) {return m[p]m[q]? 1 : 0; }void link(int* m, int p, int q) {int i;if(connected(m,p,q)) return;int pID m[p];int qID m[q];for(i0; i<N; i) ________________________________…...

内网穿透的应用-如何在本地安装Flask,以及将其web界面发布到公网上并进行远程访问
轻量级web开发框架:Flask本地部署及实现公网访问界面 文章目录 轻量级web开发框架:Flask本地部署及实现公网访问界面前言1. 安装部署Flask2. 安装Cpolar内网穿透3. 配置Flask的web界面公网访问地址4. 公网远程访问Flask的web界面 前言 本篇文章讲解如何…...
【重要】Splunk 的 Lookup Table能否被覆盖呢?
1: 背景: 用户自己的lookup table 可能需要被覆盖,因为用户自己会自动更新,但是如果不是用户自己更新,Deployer 上面发布的时候,用于没有用户的table ,那么默认是不能把客户的table overwite 的。如果用户要覆盖的话,如果客户有权限的话,客户可以自己更换lookup table…...
SELinux零知识学习三十、SELinux策略语言之角色和用户(1)
接前一篇文章:SELinux零知识学习二十九、SELinux策略语言之类型强制(14) 三、SELinux策略语言之类型强制 SELinux提供了一种依赖于类型强制(类型增强,TE)的基于角色的访问控制(Role-Based Access Control),角色用于组域类型和限制域类型与用户之间的关系,SELinux中的…...

MyBatis Generator使用总结
MyBatis Generator使用总结 介绍具体使用数据准备插件引入配置条件构建讲解demo地址 介绍 MyBatis Generator (MBG) 是 MyBatis 的代码生成器。它能够根据数据库表,自动生成 java 实体类、dao 层接口(mapper 接口)及m…...
编程语言发展史:Ruby语言的发展和应用
介绍 Ruby是一种高级编程语言,最初由日本的松本行弘开发。它在20世纪90年代初首次发布,并在2000年代初开始变得流行。 Ruby是一种动态、面向对象的语言,具有简单、易于学习和使用的语法,因此被广泛应用于Web开发、数据分析、游戏…...

数据结构-树-二叉树-堆的实现
1.树概念及结构 树是一种 非线性 的数据结构,它是由 n ( n>0 )个有限结点组成一个具有层次关系的集合。 把它叫做树是因 为它看起来像一棵倒挂的树,也就是说它是根朝上,而叶朝下的 。 有一个特殊的结点ÿ…...

两巨头Facebook 和 GitHub 联手推出 Atom-IDE
9月13日,GitHub 宣布与 Facebook 合作推出了 Atom-IDE —— 它包括一系列将类 IDE 功能带到 Atom 的可选工具包。初次发布的版本包括更智能、感知上下文的自动完成;导航功能,如大纲视图和定义跳转(outline view and goto-definition)…...
python生成邀请码,手机验证码
python生成邀请码,手机验证码 使用python生成邀请码,手机验证码,大小写字母,数字等,示例代码如下。 1、获取随机码 import randomdef get_random_code(is_digit=False, num=6):获取随机码:param is_digit: 是否为全数字:param num: 长度:return:if is_digit:sequence =…...

分布式链路追踪入门篇-基础原理与快速应用
为什么需要链路追踪? 我们程序员在日常工作中,最常做事情之一就是修bug了。如果程序只是运行在单机上,我们最常用的方式就是在程序上打日志,然后程序运行的过程中将日志输出到文件上,然后我们根据日志去推断程序是哪一…...

新的centos7.9安装jenkins—(一)
更多ruoyi-nbcio功能请看演示系统 gitee源代码地址 前后端代码: https://gitee.com/nbacheng/ruoyi-nbcio 演示地址:RuoYi-Nbcio后台管理系统 因为是用java8,所以还是要最后java8版本的jenkins,版本号是2.346.3,后…...
Go语言初始化已有环境,跟踪已有依赖环境
在Go语言中,go.mod文件是Go模块的管理文件,用于跟踪和管理项目的依赖关系。go.sum 文件是 Go 语言模块的另一个关键文件,它记录了项目依赖的确切版本以及相应的哈希值。如果你得到了一个包含go.mod和go.sum文件的Go代码,ÿ…...

短视频获客系统成功分享,与其开发流程与涉及到的技术
先来看实操成果,↑↑需要的同学可看我名字↖↖↖↖↖,或评论888无偿分享 一、短视频获客系统的开发流程 1. 需求分析:首先需要对目标用户进行深入了解,明确系统的功能和目标,制定详细的需求文档。 2. 系统设计&#…...

antv/g6的学习总结
新建一个简单实例 1、使用命令行在项目目录下执行以下命令 cnpm install --save antv/g6 2、创建容器 <div id"mountNode"></div> 3、在需要用的 G6 的 JS 文件中导入 import G6 from antv/g6; 4、 数据准备 引入 G6 的数据源为 JSON 格式的对象。…...

带你用uniapp从零开发一个仿小米商场_6. 配置uniapp项目底部导航栏tabbar
uniapp底部tabbar介绍 在uni-app中,底部tabbar是一种常见的导航方式,它可以让用户在应用的不同页面之间进行切换。通过tabBar配置项,开发者可以指定一级导航栏和tab切换时显示的对应页。 在底部tabbar中,每个tab都有一个页面路径…...

curl添加https服务
CURL支持的通信协议有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。 首选删除系统自带的openssl,因为他只有可执行程序和库,没有头文件。 sudo apt-get remove openssl openssl官网&am…...

【Flink】Standalone运行模式
独立模式是独立运行的,不依赖任何外部的资源管理平台;当然独立也是有代价的:如果资源不足,或者出现故障,没有自动扩展或重分配资源的保证,必须手动处理。所以独立模式一般只用在开发测试或作业非常少的场景…...

Kotlin学习——流程控制,when,循环,range工具 kt里的equals if实现类似三元表达式的效果
Kotlin 是一门现代但已成熟的编程语言,旨在让开发人员更幸福快乐。 它简洁、安全、可与 Java 及其他语言互操作,并提供了多种方式在多个平台间复用代码,以实现高效编程。 https://play.kotlinlang.org/byExample/01_introduction/02_Functio…...

利用STM32CubeMX解读时钟树
1,低速时钟 LSE是外部晶振作时钟源,主要提供给实时时钟模块,所以一般采用32.768KHz。LSI是由内部RC振荡器产生,也主要提供给实时时钟模块,频率大约为40KHz。(LSE和LSI)只是提供给芯片中的RTC(实时时钟)及IWDG(独立看门…...

从WWDC看苹果产品发展的规律
WWDC 是苹果公司一年一度面向全球开发者的盛会,其主题演讲展现了苹果在产品设计、技术路线、用户体验和生态系统构建上的核心理念与演进脉络。我们借助 ChatGPT Deep Research 工具,对过去十年 WWDC 主题演讲内容进行了系统化分析,形成了这份…...

学习STC51单片机32(芯片为STC89C52RCRC)OLED显示屏2
每日一言 今天的每一份坚持,都是在为未来积攒底气。 案例:OLED显示一个A 这边观察到一个点,怎么雪花了就是都是乱七八糟的占满了屏幕。。 解释 : 如果代码里信号切换太快(比如 SDA 刚变,SCL 立刻变&#…...

深度学习习题2
1.如果增加神经网络的宽度,精确度会增加到一个特定阈值后,便开始降低。造成这一现象的可能原因是什么? A、即使增加卷积核的数量,只有少部分的核会被用作预测 B、当卷积核数量增加时,神经网络的预测能力会降低 C、当卷…...

Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
Java求职者面试指南:计算机基础与源码原理深度解析
Java求职者面试指南:计算机基础与源码原理深度解析 第一轮提问:基础概念问题 1. 请解释什么是进程和线程的区别? 面试官:进程是程序的一次执行过程,是系统进行资源分配和调度的基本单位;而线程是进程中的…...
JS手写代码篇----使用Promise封装AJAX请求
15、使用Promise封装AJAX请求 promise就有reject和resolve了,就不必写成功和失败的回调函数了 const BASEURL ./手写ajax/test.jsonfunction promiseAjax() {return new Promise((resolve, reject) > {const xhr new XMLHttpRequest();xhr.open("get&quo…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

从 GreenPlum 到镜舟数据库:杭银消费金融湖仓一体转型实践
作者:吴岐诗,杭银消费金融大数据应用开发工程师 本文整理自杭银消费金融大数据应用开发工程师在StarRocks Summit Asia 2024的分享 引言:融合数据湖与数仓的创新之路 在数字金融时代,数据已成为金融机构的核心竞争力。杭银消费金…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...