1、Docker概述与安装
相关资源网站:
● docker官网:http://www.docker.com
● Docker Hub仓库官网: https://hub.docker.com/
注意,如果只是想看Docker的安装,可以直接往下拉跳转到Docker架构与安装章节下的Docker具体安装步骤,一步步带你安装自己的Docker;
Docker简介概述
Docker对我来说是一种全新技术,既然是全新的技术那么我就不禁要问了,Docker它到底是什么东西?它是基于什么场景下出现的,解决了什么问题呢?
Docker技术入门理解
首先什么是Docker?
Docker 是使用 Google 公司推出的 Go 语言 进行开发实现,基于 Linux 内核的 cgroup,namespace,以及 AUFS 类的 Union FS 等技术,对进程进行封装隔离,属于操作系统层面的虚拟化技术。由于隔离的进程独立于宿主和其它的隔离的进程,因此也称其为容器。最初实现是基于 LXC,从 0.7 版本以后开始去除 LXC,转而使用自行开发的 libcontainer,从 1.11 开始,则进一步演进为使用 runC 和 containerd。Docker 在容器的基础上,进行了进一步的封装,从文件系统、网络互联到进程隔离等等,极大的简化了容器的创建和维护,使得 Docker 虚拟技术比虚拟机技术更为轻便、快捷。
以上是我在网上搜刮出来的定义,很生硬,但可以简单地将Docker理解为一种类似于Linux虚拟机的虚拟化技术;
那么为什么会出现Docker这种虚拟化技术呢?它解决了什么问题?
我们来看一下下面这个场景:
假如说在你入职一个公司后,在公司参与开发了公司的一个项目,你使用的电脑中具有特定配置的开发环境,也就是说跟公司的其他开发人员的环境配置各有不同;你正在开发的应用肯定是依赖于你当前的环境配置以及某些配置文件,除此之外,公司也有一套标准化的测试和生产环境、以及自身的配置和一系列的支持文件的;你是不是遇到过自己在本地跑项目的时候是没有问题的,一推到线上或者代码给到运维跑的时候就出现了奇奇怪怪的Bug各种令人头疼;
这个时候一番扯皮推卸责任的免不了的;那么问题来了,你要如何确保你开发的应用能够在这些环境中运行和通过质量检测?并且在部署过程中不出现令人头疼的版本、配置问题,也无需重新编写代码和进行故障修复呢?
这就是Docker所解决的问题,它对此给出了一个标准化的解决方案,即系统平滑移植,容器虚拟化技术。
在没有Docker之前,开发人员将系统源代码提交给运维之后,运维就需要拿着这份源代码进行项目部署,但是在进行部署的时候就有可能会遇到一些问题,比如说环境不一致的问题,就像上面说的,开发环境跟运维环境不一致,这就需要运维人员根据开发人员给的版本清单,一步一步的进行手动安装环境,异常麻烦;而且更致命的是,若果开发的项目是分布式集群项目,每个集群中的每台机器都要安装一下环境,要是此时有任何一台机器在安装过程中出现了差错,都有可能导致项目部署失败;
还有就是若果说开发的系统需要进行机器扩容,增加某个集群的机器,这对运维来说也是一个难题;
上面一系列下来可以看出,环境的配置过程相当麻烦,换一台机器,就要重来一次,费力费时;而引入了Docker之后,假如说现在项目在开发环境下是完全百分百可以运行的,不管是源码、配置、环境、版本等都没有问题,这个时候Docker就可以将这一整套东西打包成一个镜像文件,你可以将这个镜像文件发送到任何平台环境,运行这个镜像文件时会开启一个容器,不管你是在什么环境下运行都与你在开发时的环境一模一样,相当于在开发环境中运行这个项目,达到应用平台无缝衔接;
为什么要选择Docker呢?用虚拟机技术不是也能达到类似效果吗?
首先Docker 容器的本质可以理解为通过容器虚拟技术,利用宿主机的硬件资源来虚拟出的一台主机,就像虚拟机一样,可以将应用及其运行环境部署在这台虚拟出的“主机”(容器)上运行。但容器与传统的虚拟机技术(VMware、VirtualBox等运行的虚拟机技术)又有着本质的不同。

传统的虚拟机技术
传统的虚拟技术是在物理机的操作系统之上安装一个虚拟机管理程序,例如 VMware、 VirtualBox 等,在虚拟机管理程序的管理下,使用者可以在同一个物理服务器上创建多个虚拟机,每个虚拟机需要安装自己独立的操作系统,而应用就是安装在虚拟机的操作系统之上的程序,应用程序通过调用各种命令或库函数来使用其需要的各种系统资源。
在这种情况下对于完全相同的两个应用,若它们需要运行在两个虚拟机中,就需要两套完全相同的虚拟机操作系统与 bins/libs,如上图左侧所示,存在大量的资源占用冗余,形成资源浪费。
Docker容器虚拟化技术
因为Docker 容器运行在 Docker 引擎之上,是在宿主机服务器的操作系统层面实现的虚拟化,可以直接复用本地物理主机的操作系统;所有 Docker 容器都共享同一个 Docker 引擎,所以不需要像传统虚拟机一样需要另外的虚拟硬件及虚拟操作系统, 而是共享的宿主机的硬件与操作系统,但它们的运行环境又是相互隔离、互不干扰的。并且所有 Docker 容器对于系统硬件资源的使用都是由 Docker 引擎统一进行管理,所以对系统资源的占用很少,其仅包含 运行时必须的一些资源,利用率很高。无论是应用执行速度、内存损耗或者文件存储速度, 都要比传统虚拟机技术更高效。
小结Docker解决的问题
1、 提供统一的运行环境
在生产环境中,很多时候的开发、测试及上线环境都是不一样的,从而导致项目(war 或 jar)在不同阶段出现很多其它阶段所不存在的奇怪的问题。 Docker 容器除了可以提供相同的应用外,还提供了该应用的统一运行环境,确保在任 何宿主机 HOST 上都可以跑出相同的结果。即 Docker = jar/war + 环境。
2、 便捷的应用迁移
由于 Docker 确保了统一的运行环境,使得应用的迁移更加便捷。无论是物理机、虚拟 机、公有云、私有云,Docker 镜像的运行结果都是相同的。用户可以很方便地将一个平台 上运行的应用,迁移到另一个平台上,而无需担心运行环境的变化导致应用无法正常运行。
3、 超快的启动时间
传统的虚拟机技术启动应用一般需要数分钟:首先需要启动虚拟机,然后再加载虚拟机 操作系统,最后还需要再手工启动应用。而 Docker 容器应用,由于直接运行于宿主机系统 中,无需启动操作系统,因此可以做到秒级、甚至毫秒级的启动。
4、 更轻松的维护和扩展
Docker 公司及各个开源项目团队一起维护了一大批高质量的官方镜像,既可以直接在 生产环境使用,又可以作为基础进一步定制,大大的降低了应用服务的镜像制作成本。
Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得应 用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。
Docker架构与安装
阅读docker官方的Guides文档可以发现,Docker系统整体上主要包含客户端Client、宿主机DOCKER_HOST(服务端)和仓库Register三大部分。我们日常使用各种 docker 命令,其实就是在使用Client 客户端工具 给 Docker 引擎(服务端守护进程Docker daemon) 提交请求进行交互,如下图所示。

1、Client 客户端
Docker 是一个客户端-服务器(C/S)架构程序。Docker 客户端只需要向 Docker 服务器或者守护进程发出请求,服务器或者守护进程将完成所有工作并返回结果。
Client 能够帮助我们使用命令行与 Docker 服务端进行交互,包括本地服务端和远程服务端:
通过-H参数可以指定客户端连接的服务端:docker -H host
2、Registry 仓库
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
Docker 用 Registry 来保存用户构建的镜像。Registry 分为公共和私有两种。一个 Docker Registry 中可以包含多个 仓库(Repository);每个仓库可以包含多个 标签(Tag);每个标签对应一个镜像。Docker 公司运营公共的 Registry 叫做 Docker Hub。用户可以在 Docker Hub 注册账号,分享并保存自己的镜像。
3、Docker 引擎(服务器端)
服务端会启动一个守护进程 Docker Daemon ,通过 socket 或者 RESTful API 监听来自客户端的请求,并且处理这些请求,实现对镜像和容器的操作。 守护进程可以 管理 Docker 对象(例如镜像、容器、网络和卷);还可以与其他守护进程通信以管理 Docker 服 务。
Docker的安装介绍
Docker 可以安装在 Windows、Linux、Mac 等系统中,我们经常说的安装Docker其实主要就是安装Docker引擎,只是为了简单直接说安装Docker而已;在安装 Docker 之前需要先了解 Docker 官方对其版本的分类。Docker 的版本分为大版本 与小版本。
Docker 从大版本来说,分为三类:Moby、社区版 Docker-CE(Community Edition)和企业版 Docker-EE(Enterprise Edition)。
从 v1.13.1 之后,Docker 的发布计划发生了变更,每个大版本下都出现了两个小版 本 Edge 月版与 Stable 季版。不过,现在的官网中一般只能看到 Stable 版本。
由于生产环境下,服务器使用 Linux 的居多,所以下面就以 Docker 在 CentOS7 中的安装为例来学习 Docker 的安装;
注意,虽然Docker可以安装在 Windows、Linux、Mac 等系统中,但Docker并非是一个通用的容器工具,它需要依赖于已存在并运行的 Linux内核环境。Docker的实质上是在已经运行的Linux下制造了一个隔离的文件环境,因此它执行的效率几乎等同于所部署的Linux主机。因此,Docker必须部署在Linux内核的系统上,如果其他系统想部署Docker就必须安装一个虚拟Linux环境;

即在Windows上部署Docker的方法都是先安装一个虚拟机,并在安装Linux系统的的虚拟机中运行Docker。注意,目前,CentOS 仅发行版本中的内核支持 Docker。Docker 运行在CentOS 7 (64-bit)上,要求系统为64位、Linux系统内核版本为 3.8以上,这里选用Centos7.x 。

官网 https://docs.docker.com/engine/install/centos/中可以看到具体安装方式与安装步骤。
Docker的具体安装步骤
前面啰嗦了一大堆,现在开始正式安装Docker,这里我们选择安装的是19.03.14版本,当然你不指定版本就是最新版本;
1、首先第一步配置yum工具,
● sudo yum install -y yum-utils
2、卸载系统之前的 docker
sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
3、安装 Docker 运行所需的依赖软件包
● sudo yum install -y yum-utils device-mapper-persistent-data lvm2
4、配置docker的yum源为阿里云仓库,告诉Linux从阿里云的镜像地址获取 Docker 相关软件包和更新;
sudo yum-config-manager \
--add-repo \
http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5、选择安装docker的版本
● 默认安装最新版:# sudo yum install -y docker-ce docker-ce-cli containerd.io
● 安装19.03.14版本:sudo yum install -y docker-ce-19.03.14 docker-ce-cli-19.03.14 containerd.io-1.4.6
6、docker安装好之后,需要给docker配置一下加速镜像源,默认的镜像源是Docker官网的,下载镜像的时候可能速度不是很快,这个镜像地址可以到自己的阿里云中获取,当然也可以随便找一个别人的:
控制台—>镜像容器服务---->镜像中心:镜像加速服务下获取
注意,这里额外添加了docker的生产环境核心配置cgroup
# 创建一个docker的配置文件
sudo mkdir -p /etc/docker
# 添加阿里云的加速镜像源,即registry-mirrors后面的地址
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://82m9ar63.mirror.aliyuncs.com"],"exec-opts": ["native.cgroupdriver=systemd"],"log-driver": "json-file","log-opts": {"max-size": "100m"},"storage-driver": "overlay2"
}
EOF
# 重启
sudo systemctl daemon-reload
sudo systemctl restart docker#启动 docker & 设置 docker 开机自启
sudo systemctl enable docker
到这里Docker就安装完成了,可以输入docker -v 验证一下;

相关文章:
1、Docker概述与安装
相关资源网站: ● docker官网:http://www.docker.com ● Docker Hub仓库官网: https://hub.docker.com/ 注意,如果只是想看Docker的安装,可以直接往下拉跳转到Docker架构与安装章节下的Docker具体安装步骤,一步步带你安…...
论文笔记——FasterNet
为了设计快速神经网络,许多工作都集中在减少浮点运算(FLOPs)的数量上。然而,作者观察到FLOPs的这种减少不一定会带来延迟的类似程度的减少。这主要源于每秒低浮点运算(FLOPS)效率低下。 为了实现更快的网络,作者重新回顾了FLOPs的运算符,并证明了如此低的FLOPS主要是由…...
计算机组成原理-固态硬盘SSD
文章目录 总览机械硬盘vs固态硬盘固态硬盘的结构固态硬盘与机械硬盘相比的特点磨损均衡技术例题 总览 机械硬盘vs固态硬盘 固态硬盘采用闪存技术,是电可擦除ROM 下图右边黑色的块块就是一块一块的闪存芯片 固态硬盘的结构 块大小16KB~512KB 页大小512B~4KB 对固…...
Electron+VUE3开发简版的编辑器【文件预览】
简版编辑器的功能主要是: 打开对话框,选择文件后台读取文件文件前端展示文件内容。主要技术栈是VUE3、Electron和Nodejs,VUE3做页面交互,Electron提供一个可执行Nodejs的环境以及支撑整个应用的环境,nodeJS负责读取文件内容。 环境配置、安装依赖这些步骤就不再叙述了。 …...
docker、elasticsearch8、springboot3集成备忘
目录 一、背景 二、安装docker 三、下载安装elasticsearch 四、下载安装elasticsearch-head 五、springboot集成elasticsearch 一、背景 前两年研究了一段时间elasticsearch,当时也是网上找了很多资料,最后解决个各种问题可以在springboot上运行了…...
【Lombok使用详解】
目录 前言:注解速查1.Lombok概念2.安装Lombok3. 使用Lombok3.1 😊Data3.2 GetterSetter3.3 NonNull3.4 Synchronized3.5 ToString:自动生成toString()方法3.6 Cleanup3.7 EqualsAndHashCode 前言:注解速查 NonNull : 用在成员方法…...
Tars框架 Tars-Go 学习
Tars 框架安装 网上安装教程比较多,官方可以参数这个 TARS官方文档 (tarsyun.com) 本文主要介绍部署应用。 安装完成后Tars 界面 增加应用amc 部署申请 amc.GoTestServer.GoTestObj 名称不知道的可以参考自己创建的app config 点击刷新可以看到自己部署的应用 服…...
基于JAVA+SpringBoot+VUE+微信小程序的前后端分离咖啡小程序
✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取项目下载方式🍅 一、项目背景介绍: 随着社会的快速发展和…...
2015年全国硕士研究生入学统一考试管理类专业学位联考数学试题——解析版
文章目录 2015 级考研管理类联考数学真题一、问题求解(本大题共 15 小题,每小题 3 分,共 45 分)下列每题给出 5 个选项中,只有一个是符合要求的,请在答题卡上将所选择的字母涂黑。真题(2015-01&…...
优秀软件设计特征与原则
1.摘要 一款软件产品好不好用, 除了拥有丰富的功能和人性化的界面设计之外, 还有其深厚的底层基础, 而设计模式和算法是构建这个底层基础的基石。好的设计模式能够让产品开发快速迭代且稳定可靠, 迅速抢占市场先机;而好的算法能够让产品具有核心价值, 例如字节跳动…...
设备管理系统-设备管理软件
一、为什么要使用设备管理系统 1.企业扩张快,设备配置多,管理混乱。 2.设备数量多,存放地点多,查找麻烦。 3.同类设备单独管理, 困难。 4.设备较多时相关信息统计容易出错,错误后修改困难。 二、凡尔码设备管理软件的…...
物联网AI MicroPython学习之语法 I2S音频总线接口
学物联网,来万物简单IoT物联网!! I2S 介绍 模块功能: I2S音频总线驱动模块 接口说明 I2S - 构建I2S对象 函数原型:I2S(id, sck, ws, sd, mode, bits, format, rate, ibuf)参数说明: 参数类型必选参数?…...
Day31| Leetcode 455. 分发饼干 Leetcode 376. 摆动序列 Leetcode 53. 最大子数组和
进入贪心了,我觉得本专题是最烧脑的专题 Leetcode 455. 分发饼干 题目链接 455 分发饼干 让大的饼干去满足需求量大的孩子即是本题的思路: class Solution { public:int findContentChildren(vector<int>& g, vector<int>& s) {…...
基于C#实现赫夫曼树
赫夫曼树又称最优二叉树,也就是带权路径最短的树,对于赫夫曼树,我想大家对它是非常的熟悉,也知道它的应用场景,但是有没有自己亲手写过,这个我就不清楚了,不管以前写没写,这一篇我们…...
Android 13.0 app进程保活白名单功能实现
1.前言 在13.0的系统rom产品开发中,在某些重要的app即使进入后台,产品需求要求也不想被系统杀掉进程,需要app长时间保活,就是app进程保活白名单功能的实现, 所以需要在系统杀进程的时候不杀掉白名单的进程,接下来就看怎么样来实现这些功能 2.app进程保活白名单功能实…...
查找学习笔记
1、静态查找表 以下查找的索引均从1开始 (1)顺序查找(带哨兵) #include<iostream> #include<vector>using namespace std;int search(vector<int> arr, int key) {arr[0] key;int i;for (i arr.size() - 1…...
Qt QIODevice介绍
作者:令狐掌门 技术交流QQ群:675120140 csdn博客:https://mingshiqiang.blog.csdn.net/ 文章目录 主要功能用法示例读取数据写入数据使用数据流基于套接字的读写注意事项QIODevice 是 Qt 中所有输入/输出设备的抽象基类。它为派生类提供了一组标准的接口用于读写数据。这些派…...
python -opencv 中值滤波 ,均值滤波,高斯滤波实战
python -opencv 中值滤波 ,均值滤波,高斯滤波实战 cv2.blur-均值滤波 cv2.medianBlur-中值滤波 cv2.GaussianBlur-高斯滤波 直接看代码吧,代码很简单: import copy import math import matplotlib.pyplot as plt import matp…...
【教学类-06-07】20231124 (55格版)X-X之间的加法、减法、加减混合题
背景需求 在大四班里,预测试55格“5以内、10以内、20以内的加法题、减法题、加减混合题”的“实用性”。 由于只打印一份20以内加法减法混合题。 “这套20以内的加减法最难”,我询问谁会做(摸底幼儿的水平) 有两位男孩举手想挑…...
postgresql经常出现连接一会后服务器拒绝连接
本地连接远程Linux上PG数据库经常自动断开连接 原因:Linux设置的tcp的keepalive超时时间太长,如果网络状况不佳,可能会导致连接断掉。 [rootlocalhost ~]# sysctl -a | grep net.ipv4.tcp_keepalive sysctl: reading key "net.ipv6.con…...
用《权游》学Prolog:逻辑编程实战指南
1. 项目概述:当逻辑编程遇上奇幻史诗去年冬天重刷《权力的游戏》时,我突发奇想:能不能用这部剧的复杂人物关系作为案例库,边追剧边学习Prolog?这个诞生于1972年的逻辑编程语言,在处理家族谱系、联盟关系这类…...
VR消防安全学习机,数字化消防培训新选择
在城市建设不断加快、公共空间日益复杂的背景下,消防安全教育的重要性愈发凸显。传统的消防宣传多以展板、手册、讲座为主,信息传递单一,参与感不足,难以让体验者真正理解火灾风险与应急处置要点。VR消防安全学习机正是在这样的需…...
【独家解析】Ernie-Image-AIO-Rapid一键部署本地运行整合包:深度融合架构如何重塑AI绘图效率?4K超分与硬件适配全指南
一、 引言:AI绘画的“快”时代 在AI图像生成领域,速度与质量的平衡一直是开发者追求的终极目标。随着Ernie-Image-AIO-Rapid的发布,这一平衡被彻底打破。不同于传统的模块化分步渲染,该模型基于**AIO(All-In-One&#…...
Windows屏幕采集进阶:手把手教你用DXGI对接NVIDIA NVENC实现硬件编码
Windows屏幕采集与硬件编码实战:DXGI对接NVENC全流程解析 在实时视频流处理领域,屏幕采集与硬件编码的高效结合一直是开发者面临的挑战。传统方案往往需要在GPU和CPU之间频繁拷贝数据,导致延迟增加和性能下降。本文将深入探讨如何利用DXGI直接…...
RTK定位中的RTCM3.2:GPS、BDS、Galileo多系统MSM电文(1074/1124等)配置与避坑指南
RTK定位中的RTCM3.2:GPS、BDS、Galileo多系统MSM电文配置实战 在无人机航测、自动驾驶高精定位和精准农业机械控制等场景中,工程师们常遇到这样的困境:明明使用了多模GNSS接收机,RTK固定率却始终达不到预期。去年我们在新疆某智慧…...
保姆级教程:用QuestaSim一步步调试SystemVerilog随机化(含pre/post_randomize顺序详解)
保姆级教程:用QuestaSim一步步调试SystemVerilog随机化(含pre/post_randomize顺序详解) 在数字验证领域,SystemVerilog的随机化机制是构建高效验证环境的核心支柱。本文将带您深入QuestaSim仿真环境,通过可视化调试手…...
STK可见性分析避坑指南:仰角、光照约束设置不当,你的卫星通信链路可能白算了
STK可见性分析避坑指南:仰角、光照约束设置不当,你的卫星通信链路可能白算了 在卫星通信和遥感任务中,精确计算可见性窗口是确保任务成功的关键。许多工程师在使用STK进行可见性分析时,往往只关注"无约束"条件下的计算结…...
ESP8266连接公共MQTT服务器,用户名密码怎么填才不报错?
ESP8266连接公共MQTT服务器的认证避坑指南 当你在深夜调试ESP8266连接MQTT服务器时,突然弹出一条"Connection failed: Bad username or password"的错误提示——这种挫败感每个物联网开发者都经历过。本文将带你深入理解公共MQTT服务器的认证机制…...
别再只用@keydown.enter了!盘点Vue表单交互中回车键监听的5个实用场景与避坑点
Vue表单交互中回车键的高级应用:5个实战场景与深度优化 在Web应用开发中,表单交互占据了用户操作的重要部分。虽然大多数开发者都熟悉基础的keydown.enter用法,但回车键在不同场景下的精细控制往往能显著提升用户体验。本文将深入探讨五个典型…...
别再只用默认参数了!手把手教你用Unity粒子系统调出电影级火焰特效(附材质与关键帧设置)
别再只用默认参数了!手把手教你用Unity粒子系统调出电影级火焰特效(附材质与关键帧设置) 火焰特效在游戏和影视作品中扮演着重要角色,它能瞬间提升场景的氛围感和视觉冲击力。但很多开发者在使用Unity粒子系统时,往往…...
