【容器化】Docker

文章目录

  • 概述
    • 环境配置的难题
    • 虚拟机
    • Linux 容器
    • Docker
  • 核心概念
  • 安装
  • 命令
    • 启动与停止命令
    • 镜像相关命令
    • 容器相关命令
  • 部署
    • MySQL 部署
    • Tomcat 部署
    • Nginx 部署
    • Redis 部署
  • 迁移与备份
  • Dockerfile 制作镜像
  • Docker 私有仓库
    • 将镜像上传到私有仓库
    • 从私有仓库拉取镜像
  • 来源

概述

环境配置的难题

软件开发最大的麻烦事之一,就是环境配置。用户计算机的环境都不相同,你怎么知道自家的软件,能在那些机器跑起来?

用户必须保证两件事:操作系统的设置,各种库和组件的安装。只有它们都正确,软件才能运行。举例来说,安装一个 Python 应用,计算机必须有 Python 引擎,还必须有各种依赖,可能还要配置环境变量。

如果某些老旧的模块与当前环境不兼容,那就麻烦了。开发者常常会说:“它在我的机器可以跑了”(It works on my machine),言下之意就是,其他机器很可能跑不了。

环境配置如此麻烦,换一台机器,就要重来一次,旷日费时。很多人想到,能不能从根本上解决问题,软件可以带环境安装?也就是说,安装的时候,把原始环境一模一样地复制过来。

虚拟机

虚拟机(virtual machine)就是带环境安装的一种解决方案。它可以在一种操作系统里面运行另一种操作系统,比如在 Windows 系统里面运行 Linux 系统。应用程序对此毫无感知,因为虚拟机看上去跟真实系统一模一样,而对于底层系统来说,虚拟机就是一个普通文件,不需要了就删掉,对其他部分毫无影响。

虽然用户可以通过虚拟机还原软件的原始环境。但是,这个方案有几个缺点。

(1)资源占用多

虚拟机会独占一部分内存和硬盘空间。它运行的时候,其他程序就不能使用这些资源了。哪怕虚拟机里面的应用程序,真正使用的内存只有 1MB,虚拟机依然需要几百 MB 的内存才能运行。

(2)冗余步骤多

虚拟机是完整的操作系统,一些系统级别的操作步骤,往往无法跳过,比如用户登录。

(3)启动慢

启动操作系统需要多久,启动虚拟机就需要多久。可能要等几分钟,应用程序才能真正运行。

Linux 容器

由于虚拟机存在这些缺点,Linux 发展出了另一种虚拟化技术:Linux 容器(Linux Containers,缩写为 LXC)。

Linux 容器不是模拟一个完整的操作系统,而是对进程进行隔离。或者说,在正常进程的外面套了一个保护层。对于容器里面的进程来说,它接触到的各种资源都是虚拟的,从而实现与底层系统的隔离。

由于容器是进程级别的,相比虚拟机有很多优势。

(1)启动快

容器里面的应用,直接就是底层系统的一个进程,而不是虚拟机内部的进程。所以,启动容器相当于启动本机的一个进程,而不是启动一个操作系统,速度就快很多。

(2)资源占用少

容器只占用需要的资源,不占用那些没有用到的资源;虚拟机由于是完整的操作系统,不可避免要占用所有资源。另外,多个容器可以共享资源,虚拟机都是独享资源。

(3)体积小

容器只要包含用到的组件即可,而虚拟机是整个操作系统的打包,所以容器文件比虚拟机文件要小很多。

总之,容器有点像轻量级的虚拟机,能够提供虚拟化的环境,但是成本开销小得多。

Docker

Docker 就像是一个轻量级的虚拟机,Docker是一个轻量级的容器,我们可以将环境交给 Docker 来管理,当我们需要移植我们的产品的时候,就可以将环境整个的迁移到另一台主机上,而不向虚拟机一样,迁移一台虚拟机极其资源;

Docker 是一个开源的应用容器引擎,基于 Go 语言开发。

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口(类似 iPhone 的 app),更重要的是容器性能开销极低。

总之:Docker相较于虚拟机来说具有更加轻量,启动更快,效率更高,可移植性更强等优势,实现了“一次封装,到处运行”,不用在关心环境的不一致问题

核心概念

1、容器技术

Linux容器技术很早就有了,比较有名的是被集成到主流Linux内核中的LXC项目。容器通过对操作系统的资源访问进行限制,构建成独立的资源池,让应用运行在一个相对隔离的空间里,同时容器间也可以进行通信。

容器技术对比虚拟化技术,容器比虚拟化更轻量级,对资源的消耗小很多。容器操作也更快捷,启动和停止都要比虚拟机快。但Docker容器需要与主机共享操作系统内核,不能像虚拟机那样运行独立的内核。

Docker是一个基于LXC技术构建的容器引擎,基于GO语言开发,遵循Apache2.0协议开源。Docker的发展得益于为使用者提供了更好的容器操作接口。包括一系列的容器,镜像,网络等管理工具,可以让用户简单的创建和使用容器。

Docker支持将应用打包进一个可以移植的容器中,重新定义了应用开发,测试,部署上线的过程,核心理念就是 Build once, Run anywhere。

Docker容器技术的典型应用场景是开发运维上提供持续集成和持续部署的服务。

下面我们开始介绍Docker中的几个基本概念。

2、镜像

Docker的镜像概念类似于虚拟机里的镜像,是一个只读的模板,一个独立的文件系统,包括运行容器所需的数据,可以用来创建新的容器。

镜像可以基于Dockerfile构建,Dockerfile是一个描述文件,里面包含若干条命令,每条命令都会对基础文件系统创建新的层次结构。

用户可以通过编写Dockerfile创建新的镜像,也可以直接从类似github的Docker Hub上下载镜像使用。

3、容器

Docker容器是由Docker镜像创建的运行实例。Docker容器类似虚拟机,可以支持的操作包括启动,停止,删除等。每个容器间是相互隔离的,但隔离的效果比不上虚拟机。容器中会运行特定的应用,包含特定应用的代码及所需的依赖文件。

在Docker容器中,每个容器之间的隔离使用Linux的 CGroups 和 Namespaces技术实现的。其中 CGroups 对CPU,内存,磁盘等资源的访问限制,Namespaces 提供了环境的隔离。

4、仓库

如果你使用过 git 和 github 就很容易理解Docker的仓库概念。Docker仓库相当于一个 github 上的代码库。

Docker 仓库是用来包含镜像的位置,Docker提供一个注册服务器(Registry)来保存多个仓库,每个仓库又可以包含多个具备不同tag的镜像。Docker运行中使用的默认仓库是 Docker Hub 公共仓库。

仓库支持的操作类似 git,创建了新的镜像后,我们可以 push 提交到仓库,也可以从指定仓库 pull 拉取镜像到本地。

安装

安装docker

使用国内 daocloud 一键安装命令:

curl -sSL https://get.daocloud.io/docker | sh

通过将用户添加到docker用户组可以将sudo去掉,命令如下

sudo groupadd docker #添加docker用户组
 
sudo gpasswd -a $USER docker #将登陆用户加入到docker用户组中
 
newgrp docker #更新用户组

然后我们将通过检查版本来验证安装是否成功:

docker --version

安装docker-compose

GitHub源,下载很慢

sudo curl -L https://github.com/docker/compose/releases/download/1.21.2/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

使用 DaoCloud源下载

sudo curl -L https://get.daocloud.io/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

接下来我们将设置权限:

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

然后我们将通过检查版本来验证安装是否成功:

docker-compose --version

命令

启动与停止命令

命令解释
systemctl start docker启动 Docker
systemctl stop docker停止docker
systemctl restart docker查看docker状态
systemctl status docker开机启动
systemctl enable docker开机启动
docker info查看docker概要信息
docker --help查看docker帮助文档

镜像相关命令

命令解释
docker images查看本地存在的镜像
这些镜像都存储在 Docker 的 /var/lib/docker目录下
docker search 镜像名称从网络中查找需要的镜像
docker pull 镜像名称将远程镜像拉取到本地
docker rmi [-f] 镜像ID(强制)删除本地镜像
docker rmi -f 镜像名1:TAG 镜像名2:TAG删除多个镜像
docker rmi -f $(docker images -qa)删除所有镜像

使用:

docker images

在这里插入图片描述

docker search 镜像名字

在这里插入图片描述
在这里插入图片描述

容器相关命令

查看容器

命令解释
docker ps查看正在运行的容器
docker ps -a查看所有容器
docker ps -l查看最后一次运行的容器
docker ps -f status=exited查看停止的容器

创建与启动容器

docker run

-i:表示运行容器
-t:表示容器启动后会进入其命令行。加入这两个参数后,容器创建就能登录进去。即分配一个伪终端。
-v:表示目录映射关系(前者是宿主机目录,后者是映射到宿主机上的目录),可以使用多个-v做多个目录或文件映射。注意:最好做目录映射,在宿主机上做修改,然后共享到容器上。
-d:在run后面加上-d参数,则会创建一个守护式容器在后台运行(这样创建容器后不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进去容器)。
-p:表示端口映射,前者是宿主机端口,后者是容器内的映射端口。可以使用多个-p做多个端口映射
–name:为创建的容器命名。

以交互的方式创建容器

以交互式方式创建并启动容器,启动完成后,直接进入当前容器。使用exit命令退出容器。需要注意的是以此种方式启动容器,如果退出容器,则容器会进入停止状态。可以理解成交互式容器是前台容器。

docker run -it --name=容器名称 镜像名称:标签 /bin/bash

比如:docker run -it --name=mycentos centos:7 /bin/bash
docker run:表示创建容器
-it:表示运行容器并进入它的命令行
–name=mycentos:给当前的容器命名
centos:7:使用该镜像创建
/bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash
在这里插入图片描述
创建后台容器

创建一个守护式容器;如果对于一个需要长期运行的容器来说,我们可以创建一个守护式容器。
创建守护式容器:docker run -id --name=容器名字 centos:7
登录守护式容器:docker exec -it 容器名称 (或者容器ID) /bin/bash

在这里插入图片描述
停止与启动容器

docker stop 容器名称(或者容器ID)
docker start 容器名称(或者容器ID)

在这里插入图片描述
文件拷贝

将宿主机的文件拷贝的容器的指定目录下
宿主机向容器拷贝:docker cp 需要拷贝的文件或目录 容器名称:容器目录
容器向宿主机拷贝:docker cp 容器名称:容器目录 需要拷贝的文件或目录
例如: docker cp /opt/tomcat8080/conf/web.xml mycentos7_2:/usr/local/

在这里插入图片描述

目录挂载

我们可以在创建容器的时候,将宿主机的目录与容器内的目录进行映射,这样我们就可以通过修改宿主机某个目录的文件从而去影响容器。

创建容器并挂载:docker run -id --name=mycentos1 -v 宿主机的目录:容器的目录 centos:7

创建容器并挂载 linux 中的 /usr/local/myhtml 到,容器的 /usr/local/myhtml 目录

docker run -id --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7

在这里插入图片描述
如果你共享的是多级的目录,可能会出现权限不足的提示。
这是因为CentOS7中的安全模块selinux把权限禁掉了,我们需要添加参数
--privileged=true 来解决挂载的目录没有权限的问题

docker run -id --privileged=true --name=mycentos1 -v /usr/local/myhtml:/usr/local/myhtml centos:7

查看容器 IP 地址

我们可以通过 docker inspect 容器名称 来查看容器运行时的各种数据

当然我们也可以通过 docker inspect --format='{{属性的键}}' 容器名称 来查看单独某个属性

例如我们单独查看 IP 地址

docker inspect --format='{{.NetworkSettings.IPAddress}}' mycentos1

在这里插入图片描述

删除容器

docker rm 容器名称

当我们在删除一个正在运行的容器时,会报错;需要先关闭这个容器才可删除

当然我们也可以用 docker rm -f 容器名称 来强制删除一个容器

部署

MySQL 部署

在这里插入图片描述

  1. 拉取镜像

docker pull centos/mysql-57-centos7

  1. 创建容器

docker run -di --name=mysql5.7 -p 33306:3306 -e MYSQL_ROOT_PASSWORD=123456 centos/mysql-57-centos7

选项解释
-p 宿主机端口:容器端口指定端口映射
-e …传递环境变量,这里表示 MySQL 的密码为 123456,账户默认为 root
  1. 远程链接 MySQL

在这里插入图片描述

Tomcat 部署

  1. 拉取镜像
docker pull tomcat:7-jre7
  1. 创建容器
docker run -di --name=mytomcat -p 9000:8080 -v /usr/local/webapps:/usr/local/tomcat/webapps tomcat:7-jre7
  1. 找一个 web 项目,部署到宿主机的 /usr/local/webapps 目录下,然后进入 docker 容器查看项目有没有成功部署,最后在浏览器中测试看看能不能成功访问

在这里插入图片描述
输入默认的用户名之后,我们成功登录,说明项目已经部署成功了
在这里插入图片描述

Nginx 部署

  1. 拉取镜像
docker pull nginx
  1. 创建 Nginx 容器
docker run -di --name=mynginx -p 80:80 nginx

测试
在这里插入图片描述

Redis 部署

拉取镜像

docker pull redis

创建容器

docker run -di --name=myredis -p 6379:6379 redis

用 redis 客户端工具链接测试
在这里插入图片描述

迁移与备份

保存容器为镜像:docker commit 容器名称 镜像名称
例如:docker commit mynginx mynginx_i

保存镜像为 tar 文件:docker save –o tar文件名 镜像名

docker save -o mynginx.tar mynginx_i

加载 tar 文件为镜像:docker load -i tar文件名

docker load -i mynginx.tar

Dockerfile 制作镜像

前面已经知道了,想要获得一个镜像可以从 Docker 中心仓库拉取,但是如果我们想要自己制作一个镜像,这时就需要 Dockerfile 了;

Docker 实际上就是一个文本文件,我们可以在这个文本文件里输入一些命令或参数,来定制我们需要的镜像,之后 Docker 可以通过读取 Dockerfile 文件的描述来构建镜像;

  1. 对于开发人员:可以为开发团队提供一个完全一致的开发环境;
  2. 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了;
  3. 对于运维人员:在部署时,可以实现应用的无缝移植。

Dockerfile 常用的命令:

命令作用
FROM image_name:tag定义了使用哪个基础镜像启动构建流程
MAINTAINER user_name声明镜像的创建者
ENV key value设置环境变量 (可以写多条)
RUN command是Dockerfile的核心部分(可以写多条)
RUN 后面输入 linux 命令
ADD source_dir/file dest_dir/file将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
COPY source_dir/file dest_dir/file和ADD相似,但是如果有压缩文件并不能解压
WORKDIR path_dir设置工作目录(进入容器之后默认的工作路径)

下面我们以创建一个具有 jdk1.8 的 centos7 系统为例制作一个镜像

  1. 创建目录
mkdir –p /usr/local/dockerjdk8
  1. 下载 jdk-8u144-linux-x64.tar.gz 并上传到服务器(虚拟机)中的 /usr/local/dockerjdk8 目录
    在这里插入图片描述
  2. 创建 Dockerfile 文件(名字固定为Dockerfile)

#依赖的镜像的名称和版本
FROM centos:7
#指定镜像创建者信息
MAINTAINER ayi
#设置工作目录,进入容器之后默认的工作目录,即进入 centos7 应用容器之后默认的工作目录为 /usr
WORKDIR /usr
#RUN yum install -y glibc.i686 制作完镜像之后,用镜像安装的centos7可能会有问题,缺少 glibc.i686,所以这里我们可以安装一下,也可以稍后安装
#RUN 后面是我们在构建镜像时需要执行的命令,下面是创建一个文件夹
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把java添加到容器中
ADD jdk-8u144-linux-i586.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_144
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH J A V A H O M E / l i b / d t . j a r : JAVA_HOME/lib/dt.jar: JAVAHOME/lib/dt.jar:JAVA_HOME/lib/tools.jar: J R E H O M E / l i b : JRE_HOME/lib: JREHOME/lib:CLASSPATH
ENV PATH J A V A H O M E / b i n : JAVA_HOME/bin: JAVAHOME/bin:PATH

  1. 执行命令构建镜像
docker build -t='jdk1.8' .

注意:这里的 . 不要拉下了,“.” 的意思是指定相对目录为当前目录
-t:指定构建的镜像的名称
在这里插入图片描述
5.查看镜像是否构建成功

docker images

在这里插入图片描述
最后,运行容器进行测试
在这里插入图片描述
执行 java -version 发现报错,那么我们需要安装一下 glibc

yum install -y glibc.i686

在这里插入图片描述安装完成之后,就可以了

在这里插入图片描述

Docker 私有仓库

  1. 拉取私有仓库
docker pull registry
  1. 启动私有仓库容器
docker run -di --name=registry -p 5000:5000 registry
  1. 这里我们就可以访问我们的私有仓库了
http://192.168.211.144:5000/v2/_catalog,IP 改为你们自己的宿主机 IP 即可
  1. 修改 daemon.json,
    Docker 默认我们的私有仓库是不安全的,所以我们要配置一下,就和之前配置镜像加速一样
    vi /etc/docker/daemon.json
    "insecure-registries":["192.168.211.144:5000"] IP,改为你们自己的宿主机 IP

  2. 重启docker 服务

systemctl restart docker

在这里插入图片描述

将镜像上传到私有仓库

  1. 先将镜像标记为私有仓库的镜像
docker tag 自己的镜像名称 宿主机IP:私有服务容器的端口/jdk1.8
docker tag jdk1.8 192.168.17.132:5000/jdk1.8

5000:是我们之前创建 registry 的时候映射的端口,是宿主机的端口

在这里插入图片描述

  1. 再次启动私服容器
docker start registry
  1. 上传标记的镜像
docker push 192.168.211.144:5000/jdk1.8

在这里插入图片描述

从私有仓库拉取镜像

docker pull 192.168.211.144:5000/jdk1.8

来源

我整理了16张图,彻底搞懂Docker容器!
Docker 入门教程
Docker 概念及基本用法
什么是 Docker?为什么会有 Docker?Docker 的优势?
Ubuntu下安装docker和docker-compose

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

TIA博途中已经被调用的变量,为什么交叉引用时却没有显示调用信息?

TIA博途中已经被调用的变量,为什么交叉引用时却没有显示调用信息? 故障现象: 如下图所示,在HMI的画面中,已经连接了对应的变量, 如下图所示,这里为HMI变量表, 如下图所示&#xff…

野火霸天虎 STM32F407 学习笔记_5 按键输入;位带操作介绍

输入——按键点灯 开发板按键电路如下: 按键未按下接地,按下后为高电平。电容起到消抖作用,软件处理就不需要手动延时消抖了。 编程没啥难度,就是改了一下输入模式。使用 ReadInputDataBits 读取。 //bsp_button.c #include &q…

SpringCloudAlibaba系列之Nacos配置管理

目录 说明 认识配置中心 Nacos架构图 Nacos配置管理实现原理 核心源码分析-客户端 核心源码分析-服务端 配置修改的实时通知 主流配置中心对比 小小收获 说明 本篇文章主要目的是从头到尾比较粗粒度的分析Nacos配置中心的一些实现,很多细节没有涉及&#…

uniapp H5预览PDF支持手势缩放、分页、添加水印、懒加载、PDF下载

效果预览 项目说明 uniapp vue2 node:v14.18.3 npm: 6.14.15 安装pdfh5.js插件 pdfh5 - npm (npmjs.com)pdfh5.js 基于pdf.js和jQuery pdfh5 - npm (npmjs.com) npm install pdfh5 由于我安装最新的pdfh5.js后运行时报错 所以我选择降低版本,可能是node…

【Node.js入门】1.2 部署Node.js开发环境

1.2 部署Node.js开发环境 在 Windows 系统上安装 Node.js 两种文件格式的安装包 Windows安装包(.msi)Windows二进制文件(.exe)安装包 检查Node.js版本 node --version 在 Linux 系统上安装 Node.js Linux操作系统上安装Nod…

基础:JavaScript的怪癖之一:提升(Hoisting)

JavaScript,通常被称为“Web 语言”,是一种多功能且广泛使用的编程语言。它以其怪癖而闻名,其中之一就是 hoisting(提升)。无论你是经验丰富的开发人员还是刚刚开始你的编码之旅,理解提升对于编写干净和高效…

汽车标定技术(六)--基于模型开发如何生成完整的A2L文件(2)

目录 1. 自定义ASAP2文件 2. asap2userlib.tlc需要修改的部分 3. 标定量观测量地址替换 3.1 由elf文件替换 3.2 由map文件替换 3.3 正则表达式(含asap2post.m修改方法) 4.小结 书接上文汽车标定技术(五)--基于模型开发如何生成完整的A2L文件(1)-C…

时间序列预测中的数据分析->周期性、相关性、滞后性、趋势性、离群值等特性的分析方法

本文介绍 本篇文章给大家介绍的是,当我们在进行有关时间序列相关的工作或者实验时,需要对数据进行的一些数据分析操作(包括周期性、相关性、滞后性、趋势性、离群值等等分析)的方法。在本篇文章中会以实战的形式进行讲解,同时提供运行代码和…

若依 验证码出不来 Fontconfig head is null, check your fonts or fonts configuration

是因为使用的OenJDK不支持awt包下的字体 解决方法: 安装FontConfig组件即可 yum install -y fontconfig

C语言--分段函数--switch语句

如何用switch语句写分段函数呢?⭐️ 首先介绍一下switch语句的语法规则⭐️ switch(整形表达式) {case 常量表达式1; //标签必须唯一语句块1;break;case 常量表达式2; //if(a0),而case中时系统自动加语句块2;break;c…

每天一点python——day65

#每天一点Python——65 #字符串的内容对齐操作类似于word中左对齐、右对齐、居中对齐如图 #例: s1hello,python print(s1.center(20,*))#设置宽度20,填充图是*s1有12个字符,这个字符串的宽度设置为20, 20-128 因为center是居中对齐…

MVCC中的可见性算法

在之前的文章 MVCC详解-CSDN博客中我们已经介绍过了MVCC的原理(read viewundo log),今天来详细的说一下readview的匹配规则(可见性算法) 隔离级别在RC,RR的前提下 Read View是如何保证可见性判断的呢&#…

多篇论文介绍-摘要

论文地址https://arxiv.org/pdf/2301.10051.pdf 目录 01CIEFRNet:面向高速公路的抛洒物检测算法 02改进 YOLOv5 的 PDC 钻头复合片缺损识别 03 基于SimAM注意力机制的DCN-YOLOv5水下目标检测 04 基于改进YOLOv7-tiny 算法的输电线路螺栓缺销检测 ​编辑05 基于改进Y…

Unity | Shader(着色器)和material(材质)的关系

一、前言 在上一篇文章中 【精选】Unity | Shader基础知识(什么是shader)_unity shader_菌菌巧乐兹的博客-CSDN博客 我们讲了什么是shader,今天我们讲一下shder和material的关系 二、在unity中shader的本质 unity中,shader就…

pip无法下载moviepy -无法联网

猜测是无法联网 尝试更新匹配 ——失败 尝试1:从网络下载whl文件——还需要下载相关依赖,过于麻烦 但应该可行 下载地址 https://pypi.tuna.tsinghua.edu.cn/simple/对应的包名/ 可能会出现如下,然后继续挨个找 尝试2:使pip联网…

RabbitMQ的高级特性

目录 数据导入 MQ的常见问题 消息可靠性问题 生产者确认机制 SpringAMQP实现生产者确认 消息持久化 消费者消息确认 失败重试机制 消费者失败消息处理策略 死信交换机 TTL 延时队列 待更 数据导入 资料下载地址:day05MQ高级 MQ的常见问题 消息可靠性…

关于卷积神经网络的池化层(pooling)

了解池化层 池化层又称“下采样层”或“子采样层”,池化层可以大大降低特征的维度,减少计算量,同时可以避免过拟合问题。 顾名思义,最大池化层就是从输入的矩阵中某一范围内,选择最大的元素进行保留;平均池…

ThreadLocal原理以及内存泄露问题

1、ThreadLocal实现原理 1、每个线程中有一个ThreadLocalsMap,这是一个哈希表的结构里面有很多entry(也就是k-v),当我们使用ThreadLocal进行set值的时候,会将这个threadLocal设置为key,然后值设置为value放入ThreadLocalsMap,key为弱引用&am…

Python爬虫实战-批量爬取美女图片网下载图片

大家好,我是python222小锋老师。 近日锋哥又卷了一波Python实战课程-批量爬取美女图片网下载图片,主要是巩固下Python爬虫基础 视频版教程: Python爬虫实战-批量爬取美女图片网下载图片 视频教程_哔哩哔哩_bilibiliPython爬虫实战-批量爬取…

兴达易控232转profinet在搅拌站使用案例配置案例

该搅拌站所采用的是双行星动力搅拌桨混合机,借助兴达易控232转profinet网关(XD-PNR200)与PLC和变频器进行通信,从而实现对变频器的精确控制,大大提升了搅拌过程的稳定性和效率。 这一方案还具备高度的灵活性和可扩展性,使得搅拌站…