微服务学习|初识Docker、使用Docker、自定义镜像、DockerCompose、Docker镜像仓库

news2025/1/11 21:02:54

初识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的内容为

执行

访问对应地址,可以访问

在私有镜像仓库推送或拉取镜像

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1240764.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

c语言:用迭代法解决递归问题

题目&#xff1a; 解释&#xff1a;题目的意思就是用迭代法的空间和时间复杂的太高了&#xff0c;需要我们减小空间与时间的复杂度&#xff0c;我就想到了迭代法&#xff0c;思路和代码如下&#xff1a; #include <stdio.h> //这里是递归法转迭代法 int main() {int x,i…

Spark---转换算子、行动算子、持久化算子

一、转换算子和行动算子 1、Transformations转换算子 1&#xff09;、概念 Transformations类算子是一类算子&#xff08;函数&#xff09;叫做转换算子&#xff0c;如map、flatMap、reduceByKey等。Transformations算子是延迟执行&#xff0c;也叫懒加载执行。 2)、Transf…

Leetcode——121 买卖股票的最佳时机

(超时。。。。。。&#xff09;除了暴力法我是真的。。。。。。 class Solution {public int maxProfit(int[] prices) {int len prices.length;int max0;for(int i0;i<len-1;i){for(int ji1;j<len;j){int income prices[j] - prices[i];if(income>max){maxincome;…

路由的控制与转发原理

场景1&#xff1a;路由器收到数据包后&#xff0c;会根据数据包的目标IP地址&#xff0c;计算出目标网段&#xff0c;再确定终端设备的具体位置。这个过程中&#xff0c;还需要计算出接口&#xff0c;或数据包下一跳的地址。最终会生成一条路由&#xff0c;即路径&#xff0c;存…

外部中断为什么会误触发?

今天在写外部中断的程序的时候&#xff0c;发现中断特别容易受到干扰&#xff0c;我把手放在对应的中断引脚上&#xff0c;中断就一直触发&#xff0c;没有停过。经过一天的学习&#xff0c;找到了几个解决方法&#xff0c;所以写了这篇笔记。如果你的中断也时不时会误触发&…

基于JavaWeb+SSM+Vue教学辅助微信小程序系统的设计和实现

基于JavaWebSSMVue教学辅助微信小程序系统的设计和实现 源码获取入口前言主要技术系统设计功能截图Lun文目录订阅经典源码专栏Java项目精品实战案例《500套》 源码获取 源码获取入口 前言 1.1 概述 随着信息时代的快速发展&#xff0c;互联网的优势和普及&#xff0c;人们生活…

二、防火墙-安全策略

学习防火墙之前&#xff0c;对路由交换应要有一定的认识 1、安全策略基本概念2、匹配顺序3、缺省包过滤4、安全策略发展史4.1.基于ACL包过滤4.2.融合UTM安全策略4.3.一体化安全策略 5、Local区域安全策略5.1.针对OSPF协议配置Local区域安全策略5.2.其他协议 6、ASPF6.1.帮助FTP…

PCIE链路训练-状态跳转1

A&#xff1a;12ms超时&#xff0c;或者再任何lane上检测到Electrical Idle Exit&#xff1b; B&#xff1a; 1.发送“receiver detection”之后没有一个lane的接收逻辑被rx检测到 2.不满足条件c&#xff0c;比如两次detection出现差别&#xff1b; C&#xff1a;发送端在没…

文本分析:NLP 魔法!

一、说明 这是一个关于 NLP 和分类项目的博客。NLP 是自然语言处理&#xff0c;目前需求量很大。让我们了解如何利用 NLP。我们将通过编码来理解流程和概念。我将在本博客中介绍 BagOfWords 和 n-gram 以及朴素贝叶斯分类模型。这个博客的独特之处&#xff08;这使得它很长&…

竞赛选题 车道线检测(自动驾驶 机器视觉)

0 前言 无人驾驶技术是机器学习为主的一门前沿领域&#xff0c;在无人驾驶领域中机器学习的各种算法随处可见&#xff0c;今天学长给大家介绍无人驾驶技术中的车道线检测。 1 车道线检测 在无人驾驶领域每一个任务都是相当复杂&#xff0c;看上去无从下手。那么面对这样极其…

Oracle 的 Java SE、OpenJDK、Database 链接

1 访问主站 Oracle | Cloud Applications and Cloud Platform 2 开发者 2.1 OpenJDK (这里的不用登录&#xff0c;就可以下载) JDK Builds from Oracle 2.2 JavaSE (需要登录&#xff0c;才可以下载) Java Downloads | Oracle 2.3 DataBase (MySQL为例) MySQL :: MySQL Dow…

排序算法--快速排序

实现逻辑 ① 从数列中挑出一个元素&#xff0c;称为 “基准”&#xff08;pivot&#xff09;&#xff0c; ② 重新排序数列&#xff0c;所有元素比基准值小的摆放在基准前面&#xff0c;所有元素比基准值大的摆在基准的后面&#xff08;相同的数可以到任一边&#xff09;。在这…

DataFunSummit:2023年OLAP引擎架构峰会-核心PPT资料下载

一、峰会简介 OLAP技术是当前大数据领域的热门方向&#xff0c;该领域在各个行业都有广泛的使用场景&#xff0c;对OLAP引擎的功能有丰富多样的需求。同时&#xff0c;在性能、稳定性和成本方面&#xff0c;也有诸多挑战。目前&#xff0c;OLAP技术没有形成统一的事实标准&…

系统移植-交叉编译工具链

不同架构的机器码 与 汇编语言 都不可移植&#xff0c; 且二者一一对应 c语言中三种成分&#xff1a; 1.分号结尾的叫做语句 语句可以让CPU执行&#xff0c;可以进行预处理&#xff0c;编译等生成机器码 2.#开头的为预处理指令 不带分号 CPU无法执行 3.注释&#xff0c;…

AR道具特效制作工具

AR&#xff08;增强现实&#xff09;技术已经逐渐渗透到各个行业&#xff0c;为企业带来了全新的营销方式和用户体验。在这个背景下&#xff0c;美摄科技凭借其强大的技术实力和创新精神&#xff0c;推出了一款专为企业打造的美摄AR特效制作工具&#xff0c;旨在帮助企业轻松实…

Eclipse常用设置-乱码

在用Eclipse进行Java代码开发时&#xff0c;经常会遇到一些问题&#xff0c;记录下来&#xff0c;方便查看。 一、properties文件乱码 常用的配置文件properties里中文的乱码&#xff0c;不利于识别。 处理流程&#xff1a;Window -> Preferences -> General -> Ja…

stm32定时器输入捕获模式

频率测量 频率测量有两种方法 测频法&#xff1a;在闸门时间T内&#xff0c;对上升沿或下降沿计次&#xff0c;得到N&#xff0c;则评率fxN/T测周法&#xff1a;两个上升沿内&#xff0c;以标准频率fc计次得到N&#xff0c;则频率fx fc/N中界频率&#xff1a;测频法和测周法误…

Altium Designer学习笔记8

创建原理图元件&#xff1a; 画出原理图&#xff1a; 根据规则书画出原理图&#xff1a; 根据规则书画出封装图&#xff1a; 参照&#xff1a; 确认下过孔的内径和外径的最小允许值。

设计模式-创建型模式-工厂方法模式

一、什么是工厂方法模式 工厂模式又称工厂方法模式&#xff0c;是一种创建型设计模式&#xff0c;其在父类中提供一个创建对象的方法&#xff0c; 允许子类决定实例化对象的类型。工厂方法模式是目标是定义一个创建产品对象的工厂接口&#xff0c;将实际创建工作推迟到子类中。…

前端js语音朗读文本

<!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>语音朗读</title></head><body>&l…