微服务中的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.mzph.cn/pingmian/38237.shtml

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

相关文章

Redis 高可用(理论)

目录 Redis 高可用 Redis 持久化 RDB 持久化 触发条件 手动触发 自动触发 ##其他自动触发机制## 执行流程 启动时加载 AOF 持久化 执行流程 (1)命令追加(append) (2)文件写入(write)和文件同步(sync) (3&…

帝国CMS(EmpireCMS)漏洞复现

简介 《帝国网站管理系统》英文译为Empire CMS,简称Ecms,它是基于B/S结构,且功能强大而帝国CMS-logo易用的网站管理系统。 帝国CMS官网:http://www.phome.net/ 参考相关漏洞分析文章,加上更详细的渗透测试过程。 参考…

snat、dnat和firewalld

目录 概述 SNAT源地址转换 DANT目的地址转换 抓包 firewalld 端口管理 概述 snat :源地址转换 内网——外网 内网ip转换成可以访问外网的ip 也就是内网的多个主机可以只有一个有效的公网ip地址访问外部网络 DNAT:目的地址转发 外部用户&#…

人工智能导论速成笔记

文章目录 前言考试题型第一章、人工智能导引 (10分 )课后习题第二章、Python基础 (10分 )*文件读写NumPy的使用Python绘图基础第三章、机器学习初步(15分 )逻辑回归分类(Logistic Regression)*,3.5线性回归预测(Linear Regression)*,3.6 、3.7、 3.8聚类 3.9第四章、自然语言…

一文带你了解乐观锁和悲观锁的本质区别!

文章目录 悲观锁是什么?乐观锁是什么?如何实现乐观锁?什么是CAS应用局限性ABA问题是什么? 悲观锁是什么? 悲观锁它总是假设最坏的情况,它会认为共享资源在每次被访问的时候就会出现线程安全问题&#xff0…

JVM调优(一)——JVM调优诊断工具详解

最近项目要生产上线,正在做压测性能测试,开始进行一些性能瓶颈分析,记得上一次做性能分析优化,还是国网项目,针对Kafka,Canal,ES,服务,数据库等一系列的排查分析,后面打算补一下总结内容&#x…

安全和加密常识(6)Base64编码方式

文章目录 什么是 Base64编码原理编解码示例应用什么是 Base64 Base64 是一种用于将二进制数据编码为仅包含64种ASCII字符的文本格式的编码方法,注意,它不是加密算法。它设计的目的主要是使二进制数据能够通过只支持文本的传输层(如电子邮件)进行传输。Base64常用于在需要处…

Windows系统下文件夹权限详解

文章目录 问题描述文件夹属性 问题描述 今天在Win10系统下,实现文件夹设置权限,具体的方案的涉及到我们公司内部的一款加密软件,不太方便透漏,借此机会,我也重新的回顾下windows系统下的文件夹权限 文件夹属性 打开…

vue3+Ts封装axios网络请求

1.安装axios npm i axios 在package.json中检查axios是否安装成功 "dependencies": {"axios": "^1.7.2","vue": "^3.4.29","vue-router": "^4.4.0"}, 2.新建文件 新建文件utils/request.ts import…

Java 并发编程常见问题

1、线程状态它们之间是如何扭转的? 1、谈谈对于多线程的理解? 1、对于多核CPU,多线程可以提升CPU的利用率; 2、对于多IO操作的程序,多线程可以提升系统的整体性能及吞吐量; 3、使用多线程在一些场景下可…

鸿蒙开发设备管理:【@ohos.multimodalInput.inputDevice (输入设备)】

输入设备 输入设备管理模块,用于监听输入设备连接、断开和变化,并查看输入设备相关信息。比如监听鼠标插拔,并获取鼠标的id、name和指针移动速度等信息。 说明: 本模块首批接口从API version 8开始支持。后续版本的新增接口&…

【算法专题--栈】用队列实现栈 -- 高频面试题(图文详解,小白一看就懂!!)

目录 一、前言 二、题目描述 三、解题方法 ⭐两个队列实现栈 🥝解题思路 🍍案例图解 ⭐用一个队列实现栈 🍇解题思路 🍍案例图解 四、总结与提炼 五、共勉 一、前言 用队列实现栈 这道题,可以说是--栈…

002-基于Sklearn的机器学习入门:回归分析(上)

本节及后续章节将介绍机器学习中的几种经典回归算法,所选方法都在Sklearn库中聚类模块有具体实现。本节为上篇,将介绍基础的线性回归方法,包括线性回归、逻辑回归、多项式回归和岭回归等。 2.1 回归分析概述 回归(Regression&…

《昇思25天学习打卡营第14天 | 昇思MindSpore基于MindNLP+MusicGen生成自己的个性化音乐》

14天 本节学了基于MindNLPMusicGen生成自己的个性化音乐。 MusicGen是来自Meta AI的Jade Copet等人提出的基于单个语言模型的音乐生成模型,能够根据文本描述或音频提示生成高质量的音乐样本。 MusicGen模型基于Transformer结构,可以分解为三个不同的阶段…

⭐ UI自动化工具轻松实现微信消息提醒 ⚡

🌿🌿🌿🌿🌿🌿 演示效果 🌿🌿🌿🌿🌿🌿 😅😅😅😅😅😅 Python安装…

STM32 SWD烧写

最小电路 stm32f103x 内部已经集成了振荡电路,可以省略;rst引脚电路,可以省略,boot0,boot1不需要设置 正常烧录 -------------------------------------------------------------------STM32CubeProgrammer v2.9.0 …

使用 go-control-plane 自定义服务网格控制面

写在前面 阅读本文需要最起码了解envoy相关的概念 本文只是一个类似于demo的测试,只为了学习istio,更好的理解istio中的控制面和数据面(pilot -> proxy)是如何交互的,下图的蓝色虚线 先说go-control-plane是什么…

nginx 1024 worker_connections are not enough while connecting to upstream

现象 请求api响应慢,甚至出现504 gateway timeout,重启后端服务不能恢复,但重启nginx可以恢复。 解决方案 worker_connections使用了默认值 1024,当流量增长时,导致连接不够 在nginx.conf中修改连接数就可以了&…

小白学python(第四天)顺序与分支篇

这几天因为个人原因,python篇会更新比较慢,还望大家谅解,那么废话不多说,我们现在就进入正题 顺序篇 这个没啥好说的,就是自上而下,依次执行 分支篇 条件(if)语句语法格式&#…

【C++】————string基础用法及部分函数底层实现

作者主页: 作者主页 本篇博客专栏:C 创作时间 :2024年6月30日 前言: 本文主要介绍STL容器之一 ---- string,在学习C的过程中,我们要将C视为一个语言联邦(摘录于Effective C 条款一&#x…