微服务中的Docker详细学习

Docker的个人理解

        首先我对于Docker的理解分为两部分,第一是对名字上的理解,我们都知道docker的英文翻译是“码头工人”的意思,所以我们也可以理解为docker是码头上的一个个集装箱的使用。这也与他的图标很相似。其次我是对于其功能上的理解,他跟我们电脑上的虚拟机很相似,但又不同,相似的是他也同虚拟机一样,把每个项目都部署在了一个包里面,但不同的地方是Docker他是直接把这个项目的系统函数库、依赖、配置和环境都给打包了起来。这与JVM虚拟机不同,JVM虚拟机还需要通过Hypervisor来再一次部署。

从这里不难看出,Docker给我们的项目部署提供了比较好的方案,也可以简单的来说docker相当于在操作系统上的软件,而虚拟机搞出来的相当于是在操作系统里面又搞了一个操作系统

Docker的架构

        Docker的架构,在这里面我们需要明白Docker两个最重要的东西,一个是镜像(Image)另一个是容器(container)。

镜像(image)相当于是一个可读性光盘,我们可以从里面复制出很多个容器但不能对光盘本身进行一个修改

容器(container)相当于是我们拿出来的项目,我们需要在这个项目里面进行我们自己需要的逻辑操作。

我们在实现Docker的架构的时候,我们把它分成两个部分:客户端——Docker Server(docker daemon)——Docker镜像仓库(registry)

Docker的基本使用

        在Docker中,我们需要使用它,往往在Linux系统中去使用

docker的安装

首先:安装Docker之前为了避免安装错误,我们先把之前可能安装过的docker进行一个卸载操作

yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-selinux \docker-engine-selinux \docker-engine \docker-ce

然后我们需要联网下载yum-utils工具

yum install -y yum-utils \device-mapper-persistent-data \lvm2 --skip-broken

然后更新本地的镜像源(这里我使用了阿里的镜像源) 

# 设置docker镜像源
yum-config-manager \--add-repo \https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.reposed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repoyum makecache fast

最后我们开始安装我们的docker:

yum install -y docker-ce 

 等待安装好了之后我们还需要做的事情就是把防火墙给关闭

# 关闭
systemctl stop firewalld
# 禁止开机启动防火墙
systemctl disable firewalld

然后使用docker -v查看Docker的版本信息,查到了证明我们安装成功了

其实到了这一步我们还没有完全结束Docker的安装,在安装完这些之后我们还需要安装相应的镜像加速器-参考阿里云的镜像加速文档:阿里云登录 - 欢迎登录阿里云,安全稳定的云计算服务平台

docker的使用

镜像的基本操作指令如上诉图片

操作指令遇到不会的我们可以使用类似于docker save --help的操作来查找自己想要的操作

除了镜像的基本操作之外我们更需要学习的还有容器的基本操作,容器的基本操作就会涉及到数据卷(volume)的概念

其实我们在有了docker容器之后我们虽然可以在容器中进行一个操作,但是有很多其他的基本操作我们还是实现不了,所以这个时候我们就很自然的引出了卷的概念 

通过volume的映射来达到操作容器内文件的效果,其基本语法为:

        数据卷的重点(挂载的使用)

docker run \
  --name mn \
  -v html:/root/html \
  -p 8080:80
  nginx \

通过上面哪个代码我们可以实现在创建nginx容器的时候把html文件数据挂载在/root/html文件里面

之后我们通过Linux的操作就可以实现对容器内文件的操作了

# 查看html数据卷的位置
docker volume inspect html
# 进入该目录
cd /var/lib/docker/volumes/html/_data
# 修改文件
vi index.html

这样我们就成功的挂载数据卷了,我们在Linux系统中操作html文件,容器中的html目录下的html文件也会相应的改变

除了挂载数据卷,我们还可以进行数据目录的挂载

以MySQL数据挂载为例子:

我们在tmp文件目录下进行操作,把mysql.tar文件加载进来之后我们执行:

docker load -i mysql.tar 进行镜像导入

然后我们再在tmp目录下创建两个目录/mysql/conf和/mysql/data两个目录

在进入mysql目录后上传conf文件到conf目录下

去DockerHub查阅资料,创建并运行MySQL容器

两种方式的比较:

一个是自动处理,一个是手动处理,但是自己知道在什么位置

docker镜像的结构

docker的镜像结构可以分为三个类别:Entrypoint(入口)、Layer(层:可以有很多)、BaseImage(基础镜像)

更新详细语法说明,请参考官网文档: https://docs.docker.com/engine/reference/builder

我们需要建立一个自定义java运行镜像的流程大致是这样的:

第一:首先把jdk跟项目jar包给拉到一个自己创建的目录下,然后编写一个dockerfile文件也拉进来然后运行(最后那个点很重要,他表示在当前目录下创建镜像)

dockerfile文件:

# 指定基础镜像
FROM ubuntu:16.04
# 配置环境变量,JDK的安装目录
ENV JAVA_DIR=/usr/local# 拷贝jdk和java项目的包
COPY ./jdk8.tar.gz $JAVA_DIR/# 安装JDK
RUN cd $JAVA_DIR \&& tar -xf ./jdk8.tar.gz \&& mv ./jdk1.8.0_144 ./java8# 配置环境变量
ENV JAVA_HOME=$JAVA_DIR/java8
ENV PATH=$PATH:$JAVA_HOME/binCOPY ./docker-demo.jar /tmp/app.jar 
#这行代码才是真正的Java运行其他的都可以使用FROM java:8-alpine(版本号)来实现# 暴露端口
EXPOSE 8090
# 入口,java项目的启动命令
ENTRYPOINT java -jar /tmp/app.jar
docker build -t 名字:版本 .

然后我们跑起来:

docker run --name 随便取 -p 端口映射:实际端口 -d 名字:版本   

Docker部署微服务集群

        部署集群:Docker-Compose

                对于dockerCompose的理解:用来部署分布式的一个帮手(要基于compose文件实现)

compose文件就是n个docker run命令的集合,但是它用语法替代掉了run,具体是一个yml文件: 

version: "3.8" #版本号services:mysql: #服务名就是mysqlimage: mysql:5.7.25environment: MYSQL_ROOT_PASSWORD: 123 volumes:- "/tmp/mysql/data:/var/lib/mysql"- "/tmp/mysql/conf/hmy.cnf:/etc/mysql/conf.d/hmy.cnf"web:build: .ports:- "8090:8090"

DockerCompose的详细语法参考官网:https://docs.docker.com/compose/compose-file/  

DockerCompose的安装

不过我们在使用DockerCompose的时候我们需要先对dockerCompose进行一个安装

安装:

# 安装
curl -L https://github.com/docker/compose/releases/download/1.23.1/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose

# 修改权限
chmod +x /usr/local/bin/docker-compose

# 补全命令
curl -L https://raw.githubusercontent.com/docker/compose/1.29.1/contrib/completion/bash/docker-compose > /etc/bash_completion.d/docker-compose

如果这里有错误需要修改host文件

echo "199.232.68.133 raw.githubusercontent.com" >> /etc/hosts

如何使用dockerCompose去部署一个服务集群:

首先我们需要一个跟你的Java项目相对应的一个服务包,然后再父工程下面要有一个yml配置文件,然后再每个服务里面还需要又相应的dockerfile文件

#父工程下的yml文件version: "3.2"services:nacos:image: nacos/nacos-serverenvironment:MODE: standaloneports:- "8848:8848"mysql: #并没有端口,因为不对外访问image: mysql:5.7.25environment:MYSQL_ROOT_PASSWORD: 123volumes:- "$PWD/mysql/data:/var/lib/mysql" #PWD是当前的意思,方便挂载- "$PWD/mysql/conf:/etc/mysql/conf.d/"userservice:build: ./user-serviceorderservice:build: ./order-servicegateway:  build: ./gateway  
#dockerfile完成当前构建(这句话的意思是在yml当前文件下找到gateway文件里面的dockerfile文件)ports:- "10010:10010" #只对外提供10010端口

然后我们在去自己的Java项目中修改相对应的配置(如之前的localhost要改成相应的服务名字,比如mysql中url的localhost就需要改成mysql,其他服务也类似nacos地址要改成nacos),并且打包后的名字改成dockerfile的内容写名字

最后准备就绪之后我们使用docker-compose up -d即可后台运行项目

然后我们使用docker-compose logs -f 来查看日志

结束

Docker的私有镜像仓库

        个人理解:当我们进入公司工作的时候,我么不可能把公司的镜像放在比如阿里啊

什么的公共镜像仓库里面,所以我们就有了私有镜像仓库。

搭建镜像仓库可以基于Docker官方提供的DockerRegistry来实现。

官网地址:https://hub.docker.com/_/registry

我们有两个版本:一个是简化版另一个是带图形化界面的版本

使用DockerCompose部署带有图象界面的DockerRegistry,命令如下:

version: '3.0'
services:registry:image: registryvolumes:- ./registry-data:/var/lib/registryui:image: joxit/docker-registry-ui:staticports:- 8080:80environment:- REGISTRY_TITLE=自己取一个自定义名字- REGISTRY_URL=http://registry:5000depends_on:- registry

我们的私服采用的是http协议,默认不被Docker信任,所以需要做一个配置:

# 打开要修改的文件
vi /etc/docker/daemon.json
# 添加内容:
"insecure-registries":["http://192.168.150.101:8080"]
# 重加载
systemctl daemon-reload
# 重启docker
systemctl restart docker

操作之后我们还需要再去新建一个文件夹用来存储镜像mkdir registry-ui

之后我们在去执行touch docker-composer.yml 建立一个文件用来编写compose文件内容

编写好了之后我们就可以基于compose文件内容创建自己的镜像docker-compose up -d

结束~~

我们可以在自己定义的网址里面看到自己的私有的镜像仓库有些什么内容了。

====================下面是个人感悟============================

学习了docker之后我想更多的是对集群部署有了更多的办法,比如我们在创建java项目的时候,可以想着我们在虚拟机上进行部署的时候我们需要先做哪些工作。我想这也是docker最大的贡献吧,可以在不同的环境下进行程序的部署以及微服务集群的部署,总之很强大的一个功能吧。

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ASP.Net.WebAPI和工具PostMan

1.WebAPI概述 1.1 WebAPI WebAPI 是一种传统的方式,用于构建和暴露 RESTUI风格的Web服务。它提供了丰富的功能和灵活性,可以处理各种HTTP请求,并支持各种数据格式,如JSON、XML等。 WebAPI使用控制器(Controllers)和动作方法(Ac…

力扣每日一题 6/30 记忆化搜索/动态规划

博客主页:誓则盟约系列专栏:IT竞赛 专栏关注博主,后期持续更新系列文章如果有错误感谢请大家批评指出,及时修改感谢大家点赞👍收藏⭐评论✍ 494.目标和【中等】 题目: 给你一个非负整数数组 nums 和一个…

INS-GPS组合导航——卡尔曼滤波

系列文章目录 《SAR笔记-卫星轨道建模》 《SAR笔记-卫星轨迹(三维建模)》 《常用坐标系》 文章目录 前言 一、经典卡尔曼滤波 二、扩展卡尔曼滤波 三、无迹卡尔曼滤波 总结 前言 SAR成像仪器搭载于运动平台,平台的自定位误差将影响SAR…

Redis缓存问题二、缓存雪崩

缓存雪崩 缓存雪崩:是指在同一时段大量的缓存key同时失效或者Redis服务宕机,导致大量请求到达数据库,带来巨大压力。 缓存雪崩的解决方案: 给不同的Key的TTL添加随机值利用Redis集群提高服务的可用性给缓存业务添加降级限流策略…

数据库物理结构设计-定义数据库模式结构(概念模式、用户外模式、内模式)、定义数据库、物理结构设计策略

一、引言 如何基于具体的DBMS产品,为数据库逻辑结构设计的结果,即关系数据库模式,制定适合应用要求的物理结构 1、在设计数据库物理结构前,数据库设计人员首先 要充分了解所用的DBMS产品的功能、性能和特点,包括提供…

DarkGPT:基于GPT-4-200k设计的人工智能OSINT助手

关于DarkGPT DarkGPT是一款功能强大的人工智能安全助手,该工具基于GPT-4-200k设计并实现其功能,可以帮助广大研究人员针对泄露数据库进行安全分析和数据查询相关的OSINT操作。 工具要求 openai1.13.3 requests python-dotenv pydantic1.10.12 工具安装 …

word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。解决办法

问题描述:word2016中新建页面显示出来的页面没有页眉页脚,只显示正文部分。设置了页边距也不管用。 如图1 图1 解决: 点击“视图”——“多页”——“单页”,即可。如图2操作 图2 结果展示:如图3 图3

操作系统精选题(三)(简答题、概念题)

🌈 个人主页:十二月的猫-CSDN博客 🔥 系列专栏: 🏀操作系统 💪🏻 十二月的寒冬阻挡不了春天的脚步,十二点的黑夜遮蔽不住黎明的曙光 目录 前言 简答题 一、对 CPU、内存、外设并…

红黑树插入删除流程(流程图)

红黑树插入删除流程(流程图) 红黑树性质 左根右(二叉树)根叶黑(根节点是黑色的)不红红(不存在相邻两个红色节点)黑路同(对于每个节点,从该节点出发到任一空叶节点所经过…

==和equals的区别(面试题)

和equals有什么区别 对于基本数据类型,比较的是值是否相等,对于引用类型则是比较的地址是否相等;对于equals来说,基本数据类型没有equals方法,对于引用类型equals比较的是引用对象是否相同 那针对以上结论&#xff0c…

基于模糊神经网络的时间序列预测(以hopkinsirandeath数据集为例,MATLAB)

模糊神经网络从提出发展到今天,主要有三种形式:算术神经网络、逻辑模糊神经网络和混合模糊神经网络。算术神经网络是最基本的,它主要是对输入量进行模糊化,且网络结构中的权重也是模糊权重;逻辑模糊神经网络的主要特点是模糊权值可…

Web后端开发概述环境搭建项目创建servlet生命周期

Web开发概述 web开发指的就是网页向后再让发送请求,与后端程序进行交互 web后端(javaEE)程序需要运行在服务器中 这样前端才可以对其进行进行访问 什么是服务器? 解释1: 服务器就是一款软件,可以向其发送请求,服务器会做出一个响应.可以在服务器中部署文件,让…

pytest-作用域

固件的作用是为了抽离出重复的工作和方便复用,为了更精细化控制固件(比如只想对数据库访问测试脚本使用自动连接关闭的固件),pytest 使用作用域来进行指定固件的使用范围。 在定义固件时,通过 scope 参数声明作用域&a…

专业指南:U盘数据恢复全攻略

一、引言:U盘数据恢复的重要性 在信息化日益发展的今天,U盘已成为我们日常生活中不可或缺的存储设备。然而,由于各种原因,U盘中的数据可能会面临丢失的风险。U盘数据恢复技术便应运而生,它旨在帮助用户找回因误删除、…

Unity制作一个简单抽卡系统(简单好抄)

业务流程:点击抽卡——>播放动画——>显示抽卡面板——>将随机结果添加到面板中——>关闭面板 1.准备素材并导入Unity中(包含2个抽卡动画,抽卡结果的图片,一个背景图片,一个你的展示图片) 2.给…

【前端】简易化看板

【前端】简易化看板 项目简介 看板分为三个模块,分别是待办,正在做,已做完三个部分。每个事件采取"卡片"式设计,支持任务间拖拽,删除等操作。 代码 import React, { useState } from react; import { Car…

通用管理页面的功能实现

在Windows Forms(WinForms)应用程序中,创建一个通用的管理页面通常涉及对数据的增删改查(CRUD)操作,以及一些额外的功能,如数据过滤、排序、导出和导入等。 先看一个仓库管理页面要素。 仓库管…

Redis-主从复制-测试主从模式下的读写操作

文章目录 1、在主机6379写入数据2、在从机6380上写数据报错3、从机只能读数据,不能写数据 1、在主机6379写入数据 127.0.0.1:6379> keys * (empty array) 127.0.0.1:6379> set uname jim OK 127.0.0.1:6379> get uname "jim" 127.0.0.1:6379>…

windows@文件高级共享设置@网络发现功能@从资源管理器网络中访问远程桌面

文章目录 高级共享设置常用选项其他选项操作界面说明 网络类型检查和设置(专用网络和公用网络)👺Note 高级共享设置和防火墙👺命令行方式使用图形界面方式配置 网络发现网络发现功能的详细介绍网络发现的作用👺网络发现的工作原理启用和配置网…

无水印视频素材库有哪些?高清无水印素材网站分享!

在这个数字化时代,短视频创作已成为流行趋势。为了让您的视频内容更具吸引力,选择合适的无水印高清视频素材至关重要。今天,我将向您推荐几个优秀的视频素材库,这些资源网站将大大提高您的创作效率和视频质感。 蛙学素材网&#…