容器化技术Docker与任务编排

news2024/11/15 3:56:23

Docker容器化

Docker简介

        传统的Java项目部署需要自己进行打包,redis,nignx等中间件需要安装以及进行很多配置,稍微繁琐,而Docker使用了容器化的技术把这一过程封装为一条指令解决,而这取决于它的架构设计,该图来自官网,如下

下面解释下每个模块的意思,如下

Docker_HOST: docker的服务端,简单可以理解为一个linux服务器

Client: docker的客户端,用于操作docker服务端提供的功能的

以上是客户端和服务端的组件,相对好理解,主要是下面的三个概念

Images:  官方称之为镜像,可以简单理解为windows的exe文件,类似于打开就可以进行使用了,对于一些稍微复杂的安装配置可以由制作镜像的人提前写好即可

Containers: 容器,用于承载运行Images的组件,一个Images可以运行在多个容器中,而一个Linux服务器可以运行成千上万个容器,容器可以理解为在一个大的linux服务器下面的小linux服务器

Registry: Docker 仓库,保存其他用户制作的Images镜像的,其他用户通过制作镜像上传到仓库后就可以给所有人进行使用了

Docker安装

Docker 要求 CentOS 系统的内核版本高于 3.10,可以通过 uname -r 指令查看,一般情况下你的CentOs版本是7.0就一定满足了

1. 安装基本准备步骤

yum -y update   保证yum源是最新的

yum install -y yum-utils  下载相关需要的依赖

sudo yum remove -y docker*    如果有旧版本的docker则卸载,否则跳过就行,执行也可以

设置yum源,并更新 yum 的包索引

yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

yum makecache fast

2. 真正开始安装docker

yum list docker-ce --showduplicates | sort -r   查找所有可以安装的docker版本

一般来说不选择最新的版本,因为可能要Bug,可以稍微选择次新的即可

yum install -y docker-ce-3:19.03.9-3.el7.x86_64 # 这是指定版本安装

systemctl start docker   启动docker

systemctl enable docker 开机自动启动docker,如果需要的话 

docker version   验证是否安装成功,如果出现以下内容就是成功了

安装其实并不复杂,安装完以后就可以进行使用docker了,也不复杂了

Docker加速器配置(不弄也行,只是加速镜像的下载)

阿里云提供了加速地址: 阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台,可以到上面看看,上面有具体的介绍

 这里也说下怎么弄吧,并不复杂,如下

在  /etc/docker 目录下创建daemon.json文件,内容如下

{  

"registry-mirrors": ["https://m9r2r2uj.mirror.aliyuncs.com"]

}

然后执行以下命令即可

systemctl daemon-reload

systemctl restart docker

Docker使用

        docker的使用也并不复杂,步骤主要有以下几步

1. 搜索Images镜像

2. 通过docker客户端指令拉取Image镜像实例

3. 通过docker客户端指令把Image运行到容器中

是不是很简单,只是刚开始接触这些概念可能不太懂,操作几次就会觉得很简单了,下面就来说下具体的操作

使用Docker安装Redis

1.   搜索Image镜像,搜索有两种方案

方案一,使用命令行 docker search redis

上面有很多的redis镜像,一般我们选择 OFFICIAL表示官方,STARS表示使用人数,所以我们一般使用最好的,但是这种搜索看不到版本号,所以一般建议使用方式二进行搜索

方式二搜索

        从官网进行搜索: https://hub.docker.com/  

在搜索框直接输入 redis,结果如下

选择Tags可以看到版本号,对后面下载有比较大的帮助

 2.  找到镜像后就是进行下载了,下载命令如下

docker pull redis:5

下载名字为redis,版本号为5的镜像,也可以直接复制方式二旁边的指令

如果想下载最新版本可以省略后面的版本号,如下,也就是说:latest也可以不写

docker pull redis:latest

3. 下载完以后查看本地的镜像

docker images  

 4. 只要镜像有了就是通过容器进行运行了,执行创建同时启动的指令

docker run -d -p 6379:6379 redis:5

该指令会创建一个容器并且启动

-d 表示在后台运行

-p 6379:6379   表示指定端口,左边的是docker服务器所在端口,右边的是容器内的端口

redis:5  为镜像的名称和版本号

5. 执行后再使用下面的指令查看有哪些正在运行的容器

docker ps  

 到此为止,redis就安装成功了,通过命令行执行也是正常的,是不是很简单

Docker的常用命令

Image镜像相关命令

docker images     //列出本地镜像

docker rmi redis:5    //删除本地镜像

docker rmi $(docker images -q)   //删除所有的镜像

容器相关命令

docker run -d -p 6379:6379 redis:5      //创建容器并启动

docker ps    //列出所有运行的容器

docker stop f0b1c8ab3633    //停止容器,f0b1c8ab3633  为容器id

docker kill f0b1c8ab3633    //强制停止容器

docker start f0b1c8ab3633   //启动已经创建的容器

docker inspect f0b1c8ab3633   //查看容器的信息

docker container logs f0b1c8ab3633   //查看容器日志信息

docker top f0b1c8ab3633   //查看容器内的top进程

docker exec -it f0b1c8ab3633 /bin/bash (有的容器需要把 /bin/bash 换成 sh)  //进入容器内

docker rm f0b1c8ab3633  //删除容器

docker rm -f $(docker ps -a -q)  //删除所有容器

以上为常用的命令行,更多的可以参考官网的介绍

https://docs.docker.com/engine/reference/run/

注:容器只需要创建一次即可,可以通过命令  docker ps -a 查看如果对应的镜像已经有容器了,再通过docker start 容器id  启动容器即可,不需要每次都创建容器

        至此,通过docker安装redis的步骤就已经结束了,应该很简单吧,多弄几次就明白了,关键还是我们如何部署Java项目,下面弄一个简单的项目来试试看,如下

Docker部署Java项目

直接的java项目没办法直接部署到docker容器中,需要我们先把Java项目包装为一个docker镜像,下面就来说下如何进行包装

1.  准备一个jar项目,只是用来测试,非常简单,如下,只是一个接口,端口为8080,在本地访问http://localhost:8080/docker/test可以看到内容

 2. 创建一个Dockerfile文件,内容如下

# 基于哪个镜像,如果java:8执行失败就改为 openjdk:8

From java:8     

# 复制文件到容器

ADD dockerTest-0.0.1-SNAPSHOT.jar/app.jar

# 声明需要暴露的端口

EXPOSE 8080   

# 配置容器启动后执行的命令

ENTRYPOINT java ${JAVA_OPTS} -jar /app.jar

3. 创建一个文件夹名字随意,把jar包和这个Dockerfile放在一起,然后执行命令生成一个镜像:

结构如下

然后在该目录下使用命令生成镜像,命令如下

docker build -t dockertest:0.0.1 .

dockertest:0.0.1   左边为镜像名,右边为版本号

.   表示Dockerfile所在的路径

执行成功后可以再看镜像,docker images 可以看到已经生成镜像了,如下

可以看到镜像已经生成了,接下来的步骤就是启动容器了,启动命令跟上面的一致,只是换镜像名称和暴漏的端口,如下

docker run -d -p 80:8080 dockertest:0.0.1

我映射的是80端口,方便点,然后就是访问看正不正常了,我访问是正常的,如下

 

到此,就结束了,Docker的使用到这里就结束了,不过这里有个问题,如果一个项目还好,部署一下就行了,如果有十几个微服务呢,那就比较麻烦了,需要手工一个个部署,会耗费大量的时间并且容易出错,因为Docker出了一个任务编排的技术,也就是Docker Compose技术,下面我们就来聊聊这个技术,也不是很难,如下

Docker Compose(任务编排) 

           上面也说了,就是为了在多任务的时候可以方便的启动

Docker Compose安装

# 下载安装

 sudo curl -L "https://github.com/docker/compose/releases/download/1.28.6/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose sudo chmod +x

/usr/local/bin/docker-compose

#配置权限

sudo chmod +x /usr/local/bin/docker-compose

#校验是否安装成功

docker-compose --version

Docker Compose示例

        其实主要是编写docker-compose.yml文件,文件内容和介绍如下

version: '3'

services:

  redis-project:

     image: myredis  #镜像名称

     container_name: redisproject  #容器名,建议指定

     build: ./redis #指 定 Dockfile所 在 路 径  #跟Docker所在的配置一样

     ports:

        - "80:80"     #端口的映射关系,跟上面的一样

     expose:

        - 80   #所暴漏出来的端口

   redis:

      image: redis:5

      container_name: redis

      command: redis-server --appendonly yes --requirepass 123456

      volumes:

          - /opt/dockerTest/zxcCompose/redis/data:/data #数 据 文 件 挂 载

       ports:

           - 6379:6379  

version: 为docker-compose支持的版本,看你安装的支持多少

services :下面有哪些服务,跟version在同一个标签

redis-project: 为我自己的项目,类似于上面的dockerTest-0.0.1-SNAPSHOT.jar

准备后配置文件后基本就行了,只需要执行以下命令即可,如下

docker-compose up (后面加-d可以后台启动)

docker-compose up 命令还有一些参数,如下

-f docker-compose.yml : 指定编排任务文件,默认为docker-compose.yml可以省略

--build:默认情况下compose会确定有没有容器,有就不会重新创建,这个参数是强制每次都会进行重建

docker-compose down 是下线

执行完就可以了,剩下的就不仔细介绍了,其他的命令可以参考下官网资料

Compose file build reference | Docker Documentation

因为主要还是上面的配置,具体的细节我也还没咋研究

最后就说一下挂载是啥东西

挂载

        就如同上面说的,容器就像是一个小的服务器,像我们redis的数据文件默认是放在容器里面的,如果创建的容器删除了,再重新创建的话那么数据就会丢失,但是这样就会造成数据的丢失,所以docker提供了一个挂载的功能,就是让容器内的文件跟真实的linux服务器的某个目录进行同步,容器内生成的数据会同步到外面的数据,具体的命令如下

docker run -d -p 8761:8761 -v /log:/container-log dockertest:0.0.1

也就是说把容器内的/container-log目录挂载到 /log 真实的Linux服务器的目录下,这样就算你的容器误删除了,只要重新创建容器的时候还是挂载到这个目录数据就不会丢失了

总结

        这篇文章只是简单的记录下docker的基本使用,使用上其实并不难,而且docker方便的主要是我们部署项目

        docker技术比vm虚拟机其实方便多了,因为一台docker服务器可以部署成千个容器,vm虚拟机可能跑个几十个就没了,因为docker实现了服务隔离,可以支持更多的服务同时启动,只要没有过高的并发,可以部署很多个服务

         好了,到此为止,谢谢各位

 

 

 

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

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

相关文章

数值优化之函数高阶信息

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 函数高阶信息的介绍 2 函数高阶信息的计算 1 函数高阶信息的介绍 hessian矩阵是对称矩阵,最后一个公式是函数关于0的泰勒展开 负梯度是函数下降的最快方向 注意区分Hessian矩阵与Jacobian矩阵,Hess…

9_4、Java基本语法之System、Math、BigInteger与BigDecimal类的使用

一、System类的使用 1、System类代表系统,系统级的很多属性和控制方法都放置在该类的内部。 该类位于java.lang包。 由于该类的构造器是private的,所以无法创建该类的对象,也就是无法实 例化该类。其内部的成员变量和成员方法都是static的&am…

【算法题解】7. 反转链表

文章目录题目解法一:迭代解题思路代码实现复杂度分析解法二:递归解题思路代码实现复杂度分析题目 给你单链表的头节点 head ,请你反转链表,并返回反转后的链表。来自:leetcode 解法一:迭代 解题思路 使用…

广州车展智能卷王:集度ROBO-01的取与舍

作者 | 德新 编辑 | 王博2022年的最后两天,今年最后一个A级车展在广州开幕。由于种种原因,不少车企匆忙备战或者干脆缺席,这届展会不如往届热闹。但也有憋了大招的选手,比如集度。 12月30日上午,集度在一场非常短的发布…

11-内部类and 12-集合初步

文章目录11-内部类链接外部类使用.this 和.new匿名内部类12-集合初步思考1&#xff0c;List<Apple> apples new ArrayList<>();思考2&#xff0c;如何初始化一个collection思考3&#xff0c;Pet关键字思考4&#xff0c;关于ListIterator这个双向迭代器思考5&#…

保护性暂停设计模式

目录 保护性暂停设计模式 获取结果 产生结果 总代码实现 测试 增加超时效果的Guarded suspension get(long timeout) 测试 保护性暂停设计模式 Guarded Suspension 即 保护性暂停; 是一种等待唤醒机制的一种规范 ,也可以理解为使用中设计模式,Java的API很多都按照保护性…

【免费开放源码】审批类小程序项目实战(活动审批端)

第一节&#xff1a;什么构成了微信小程序、创建一个自己的小程序 第二节&#xff1a;微信开发者工具使用教程 第三节&#xff1a;深入了解并掌握小程序核心组件 第四节&#xff1a;初始化云函数和数据库 第五节&#xff1a;云数据库的增删改查 第六节&#xff1a;项目大纲以及制…

系分 - 面向对象的方法【概念】

个人总结&#xff0c;仅供参考&#xff0c;欢迎加好友一起讨论 系分 - &#xff08;概念&#xff09;面向对象的方法 面向对象的方法&#xff08;OO&#xff0c;Object-Oriented&#xff09;是一种基于对象模型的程序设计方法&#xff0c;包括面向对象的分析&#xff08;OOA&a…

【iOS】内存管理

文章目录前言理解引用计数引用计数原理属性存取方法中的内存管理自动释放池保留环以ARC简化引用计数使用ARC时必须遵守的命名规则变量的内存管理语义ARC如何清理实例变量覆写内存管理的方法在dealloc方法中只释放应用并解除监听前言 内存管理&#xff1a; 在Objective-C这样的…

Windows平台下的内存泄漏检测

Windows平台下的内存泄漏检测一、使用_CrtDumpMemoryLeaks定位内存泄露添加对应的头文件转储内存泄漏信息程序任意点退出指定调试信息输出二、定位具体内存泄露位置内存快照转储内存快照比较内存快照完整例子三、使用WinDbg定位获取堆信息查看指定堆的使用情况获取地址信息获取…

【Docker】初级篇

【Docker】初级篇&#xff08;一&#xff09;Docker简介【1】docker是什么【2】容器与虚拟机比较【3】能干嘛【4】去哪下&#xff08;二&#xff09;Docker安装【1】前提说明【2】Docker的基本组成【3】安装步骤&#xff08;1&#xff09;确定是CentOS7及以上版本&#xff08;2…

抽烟打电话行为识别系统 yolo

抽烟打电话行为识别系统通过yolo深度学习框架模型&#xff0c;对现场画面区域进行7*24小时实时监测&#xff0c;发现抽烟打电话等违规行为立即抓拍存档预警。YOLOv5是一种单阶段目标检测算法&#xff0c;该算法在YOLOv4的基础上添加了一些新的改进思路&#xff0c;使其速度与精…

【 shell 编程 】第4篇 数组和函数

数组和函数 文章目录数组和函数一、数组1.普通数组2.关联数组3.数组和循环二、函数1.定义函数2.调用函数一、数组 变量&#xff1a;用一个固定的字符串&#xff0c;代替一个不固定字符串。 数组&#xff1a;用一个固定的字符串&#xff0c;代替多个不固定字符串。 1.普通数组…

Python代码实现学生管理系统

Python代码实现学生管理系统 需求说明 实现一个命令行版本的学生管理系统 功能: 新增学生 显示学生 查找学生 删除学生 存档到文件 创建入口函数 使用一个全局列表 students 表示所有学生信息. 使用 menu 函数和用户交互. 这是一个自定义函数. 使用 insert , show ,…

MacOS Ventura安装失败的原因及解决方法分享

2022年10月&#xff0c;苹果公司向Mac电脑用户推送了MacOS Ventura正式版更新&#xff0c;此次更新为MacOS带来了台前调度、连续互通相机、iMessage 撤回、编辑等功能。吸引众多Mac电脑用户不由纷纷下载安装&#xff0c;但各用户在安装的过程中经常遇到更新MacOS Ventura时突然…

物联网与射频识别技术,课程实验(五)

实验5—— 基于随机二进制树的防冲突算法的实现与性能分析 实验说明&#xff1a; 利用Python或Matlab模拟基于随机二进制树的防冲突算法&#xff1b; 分析标签数量k对遍历所有标签所需时间的影响&#xff1b; 分析标签ID的长度、分布对算法性能的影响&#xff1b; 利用Python或…

MQTT+STM32+ESP8266-01s硬件传递的JSON数据到前端和后端出现中文乱码问题

最近在做一个关于MQTT相关毕设项目,数据传输过程中出现了中文乱码问题,大致就是硬件发送的JSON主题数据中包含中文(如下图1所示),软件后端和软件前端接受该主题数据后出现了中文乱码,出现乱码一般都是硬件传递到后端和前端的编码不一致导致的,所以前端和后端接受该JSON数据的时…

2023.1.1 学习周报

文章目录摘要文献阅读1.题目2.摘要3.问题和方案4.介绍5.方法5.1 Symbolic Description5.2 The Short-Term Memory Priority Model5.3 The STAMP Model5.4 The Short-Term Memory Only Model6.实验6.1 评价指标6.2 实验结果7.结论深度学习加性模型点积模型缩放点积模型双线性模型…

数值优化之凸函数

本文ppt来自深蓝学院《机器人中的数值优化》 目录 1 凸函数的性质 ​2 凸函数的性质 1 凸函数的性质 凸函数最重要的性质就是Jensens inequality,也就是琴生不等式。 若能取到等号则是凸函数&#xff0c;若不能取到等号则是强凸函数&#xff0c;若不等号相反&#xff0c;则…

spring session

文章目录Spring Session 架构及应用场景为什么要spring-sessionSR340规范与spring-session的透明继承Spring Session探索特点核心 APIservlet session 与 spring-session 关系webflux 与 spring session 的关系基于 Servlet 的 Spring Session 实现思考题背景1、注册到 Filter …