微服务中的Docker详细学习

news2025/1/21 18:56:56

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.repo
    
sed -i 's/download.docker.com/mirrors.aliyun.com\/docker-ce/g' /etc/yum.repos.d/docker-ce.repo

yum 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/bin

COPY ./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: #服务名就是mysql
    image: mysql:5.7.25
    environment: 
     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-server
    environment:
      MODE: standalone
    ports:
      - "8848:8848"
  mysql: #并没有端口,因为不对外访问
    image: mysql:5.7.25
    environment:
      MYSQL_ROOT_PASSWORD: 123
    volumes:
      - "$PWD/mysql/data:/var/lib/mysql" #PWD是当前的意思,方便挂载
      - "$PWD/mysql/conf:/etc/mysql/conf.d/"
  userservice:
    build: ./user-service
  orderservice:
    build: ./order-service
  gateway:  
    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: registry
    volumes:
      - ./registry-data:/var/lib/registry
  ui:
    image: joxit/docker-registry-ui:static
    ports:
      - 8080:80
    environment:
      - REGISTRY_TITLE=自己取一个自定义名字
      - REGISTRY_URL=http://registry:5000
    depends_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.coloradmin.cn/o/1880429.html

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

相关文章

Excel显示/隐藏批注按钮为什么是灰色?

在excel中,经常使用批注来加强数据信息的提示,有时候会把很多的批注显示出来,但是再想将它们隐藏起来,全选工作表后,“显示/隐藏批注”按钮是灰色的,不可用。 二、可操作方法 批注在excel、WPS表格中都是按…

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

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

【知识学习】Unity3D中Scriptable Render Pipeline的概念及使用方法示例

Unity3D中的Scriptable Render Pipeline(SRP)是一种高度可定制的渲染管线框架,允许开发者完全控制渲染流程,以适应不同的渲染需求和硬件平台。SRP使得开发者可以编写自己的渲染逻辑,包括摄像机管理、渲染设置、光照处理…

使用RNN模型构建人名分类器

使用RNN模型构建人名分类器 1 项目需求和实现分析 短文本分类问题 2 数据处理三部曲 场景1:数据处理三部曲示意图 场景2:三个字母onehot编码形状分析 3 构建RNN模型 4 构建训练函数并进行训练 - 有关模型、损失函数、优化器三者在pytorch中的表示 5…

还不知道工业以太网和现场总线区别???

工业以太网 工业以太网是一种专为工业环境设计的网络通信技术,它基于标准的以太网技术,但针对工业应用进行了优化。工业以太网能够适应高温、低温、防尘等恶劣工业环境,采用TCP/IP协议,与IEEE 802.3标准兼容,并在应用层…

fastapi+vue3前后端分离开发第一个案例整理

开发思路 1、使用fastapi开发第一个后端接口 2、使用fastapi解决cors跨域的问题。cors跨域是浏览器的问题,只要使用浏览器,不同IP或者不同端口之间通信,就会存在这个问题。前后端分离是两个服务,端口不一样,所以必须要…

【课程总结】Day13(上):使用YOLO进行目标检测

前言 在上一章《【课程总结】Day11(下):YOLO的入门使用》的学习中,我们通过YOLO实现了对图片的分类任务。本章的学习内容,将以目标检测为切入口,了解目标检测流程,包括:数据标准、模…

03-权限绕过漏洞

一、基础知识 水平越权 水平越权是指用户在系统中拥有超出其权限范围的访问权限。这可能导致安全漏洞和潜在的风险,因为用户可以访问他们不应该有权访问的敏感信息或执行他们不应该执行的操作。 垂直越权 垂直越权是指用户或攻击者利用系统中的漏洞或错误配置&a…

12-Django项目--Ajax请求三

目录 路由 添加与编辑 视图函数 perform_list.html 路由 添加与编辑 视图函数 perform_list.html {% endblock %}{% block js %}<script>var DELETE_ID undefined;var MODIFY_ID undefined;$(function () {bindBtnAdd();bindBtnSave();bindBtnDelete();bindBtnDelet…

计算机基础之汇编语言学习笔记

学习来源&#xff1a;b站各种学习资料 前置知识&#xff1a;计算机组成原理等知识 学习参考的资源 汇编语言编程的速成指南[上]~从零开始的期末抢救计划 &#xff08;8086汇编&#xff09;_哔哩哔哩_bilibili 链接: https://pan.baidu.com/s/1tg_ZW7VD3TS_s1v_EjS89w?pwdak6…

Android:移动垃圾软件

讲解政策相关,最近升级AI扫荡系统和证书防高风险,回复按留言时间来排,请耐心等待 移动垃圾软件 官方政策公告行为透明、信息披露清晰保护用户数据不要损害移动体验软件准则反垃圾软件政策Google API 服务用户数据政策官方政策公告 ​ 在 Google,我们相信,如果我们关注用户…

vue2实例实现一个初步的vuex

vue2实例实现一个初步的vuex 实现源码&#xff1a;vue2-review 1.App.vue 2.store目录下的index.js 3.效果 微信公众号&#xff1a;刺头拾年

Crontab命令详解:轻松驾驭Linux定时任务,提升系统效率

​&#x1f308; 个人主页&#xff1a;danci_ &#x1f525; 系列专栏&#xff1a;《设计模式》《MYSQL》 &#x1f4aa;&#x1f3fb; 制定明确可量化的目标&#xff0c;坚持默默的做事。 引言&#xff1a; crond是Linux系统中用来定期执行命令或指定程序任务的一种服务或软件…

NzN的C++之路--拷贝构造函数赋值运算符重载

目录 Part 1 拷贝构造函数 一、概念 二、特征 Part 2 赋值运算符重载 一、运算符重载 二、赋值运算符重载 三、前置和后置重载 Part 3 const成员 Part 4 取地址及const取地址操作符重载 Part 1 拷贝构造函数 一、概念 拷贝构造函数&#xff1a;只有单个形参&#xf…

LeetCode 全排列

思路&#xff1a;这是一道暴力搜索问题&#xff0c;我们需要列出答案的所有可能组合。 题目给我们一个数组&#xff0c;我们很容易想到的做法是将数组中的元素进行排列&#xff0c;如何区分已选中和未选中的元素&#xff0c;容易想到的是建立一个标记数组&#xff0c;已经选中的…

AI模型的奥运会:谁将在OlympicArena中夺冠?

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读 引言&#xff1a;AI模型的奥林匹克级评测 评估和比较不同AI模型的性能始终是一个核心话题。随着技术的不断进步&#xff0c;这些模型在处理复杂任务的能力上有了显著的提升。为了更精确地衡…

Nacos-注册中心

一、注册中心的交互流程 注册中心通常有两个角色: 服务提供者(生产者)&#xff1a;对外提供服务的微服务应用。它会把自身的服务地址注册到注册中心&#xff0c;以供消费者发现和调用。服务调用者(消费者)&#xff1a;调用其他微服务的应用程序。它会向注册中心订阅自己需要的服…

Python | Leetcode Python题解之第188题买卖股票的最佳时机IV

题目&#xff1a; 题解&#xff1a; class Solution:def maxProfit(self, k: int, prices: List[int]) -> int:if not prices:return 0n len(prices)k min(k, n // 2)buy [0] * (k 1)sell [0] * (k 1)buy[0], sell[0] -prices[0], 0for i in range(1, k 1):buy[i] …

【计算机图形学 | 基于MFC三维图形开发】期末考试知识点汇总(上)

文章目录 视频教程第一章 计算机图形学概述计算机图形学的定义计算机图形学的应用计算机图形学 vs 图像处理 vs模式识别图形显示器的发展及工作原理理解三维渲染管线 第二章 基本图元的扫描转换扫描转换直线的扫描转换DDA算法Bresenham算法中点画线算法圆的扫描转换中点画圆算法…

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

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