Docker 是什么

2023-05-16

本文首发自公众号「LinuxOK」,ID为:Linux_ok,关注公众号第一时间获取更新,分享记录职场开发过程中所见所感。

在这里插入图片描述
Docker 是一个用 GO 语言实现的开源项目,它可以将应用程序和程序的依赖打包成一个镜像,镜像交付到用户手里可以直接运行,成为一个容器。每个容器都是一个瘦身过后的简易版本的 Linux,它相当于集装箱。

容器所处的环境(操作系统以及操作系统底层)相当于货船,程序的表现只跟容器有关,相当于集装箱内的东西只跟集装箱有关,跟集装箱所处的货船无关。

1、Docker 解决了什么问题

Docker 的出现是解决如下问题:

  • 开发人员使用 Docker 技术可以消除协作编码时“在我的机器上可以正常运行,在你的机器上却不可以”的问题;在日常工作中,Docker 还可以帮助开发人员提高工作效率;
  • 运维人员使用 Docker 技术可以在隔离环境中轻松部署、管理应用软件,降低运维成本;
  • 软件企业使用 Docker 技术可以轻松敏捷构建软件交付通道,用更快的速度,更高的安全性,更可靠的稳定性发布、更新应用软件。

2、安装 Docker 环境

在深入学习 Docker 之前,我们先从安装 Docker 环境,简单体验 Docker 开始。
在这里插入图片描述

如上图所示,我的宿主机环境为 centos7,安装过程参考官网 https://www.docker.com 的帮助手册:

在这里插入图片描述
具体安装步骤:
(1) 更新操作系统软件源:

# yum makecache fase

在这里插入图片描述
(2) 安装所需安装包

# yum install -y yum-utils

(3) 设置镜像仓库,帮助手册给的仓库地址是国外的,访问较慢,建议设置成阿里云的

# yum-config-manager --add-repo \
http://mirrors.aliyun.com/Docker-ce/linux/centos/Docker-ce.repo

(4) 安装最新的 Docker 引擎(Docker-ce表明示社区版本)

# yum install Docker-ce Docker-ce-cli containerd.io

在这里插入图片描述
(5) 启动 Docker 并运行 version 命令,如下图说明安装成功了。
在这里插入图片描述
(6) 配置镜像加速器

阿里云为每一个开发者提供来一个镜像加速器,我们在 Docker 环境中配置好阿里云镜像加速,方便以后我们自己下载镜像时速度更快。

具体操作方法:登录阿里云官网:控制台 -> 搜索“容器镜像服务”,得到如下页面可见加速器地址:

在这里插入图片描述
页面中也很贴心的给出来设置方法:
在这里插入图片描述
配置完成后,下载并运行镜像:

在这里插入图片描述
如上所示说明 Docker 安装成功。从打印信息看出,docker run 先从远程仓库中拉取hello-world,拉取到本地完成打印 Pull complete 和 sha256 等信息,然后再运行此镜像。我们再次执行 docker run 就不再有拉取的动作来:

在这里插入图片描述

3、虚拟机和容器的区别

我们知道,部署服务器应用程序一直是个很复杂操作流程,比如搭建一个网站,既要部署主应用程序,还需要相关组件,如数据库、消息队列、Nginx 等等,需要耗费很大人力且非常容易出错。

由于这种复杂性,促使了程序员开始关注虚拟化技术,于是就有了虚拟机和容器。

虚拟机如 VMware,它是为 CPU、内存和存储提供了一个抽象层,用户可以对这个抽象层进行修改,比如新增 CPU、内存或者磁盘,而无需购买新的硬件。抽象层之上的应用程序对硬件是虚拟的还是物理的是无感知的,这样灵活且安全。

怎么理解抽象层呢,打个比方你要往磁盘写入某些数据,没有虚拟机时你调用的是操作系统的接口,进而调用到磁盘的读写,引入抽象层后,你调用的还是操作系统的接口,但是往下要执行的操作,都交接给来虚拟机,由虚拟机模拟写入磁盘并返回,应用程序无感知。

你的应用程序可以单独运行在一个虚拟机中,也可以和其他应用运行在虚拟机,缺点是,虚拟机一次只能运行一种操作系统,如果应用程序需要不同的环境中,则需要使用多个虚拟机,另外,虚拟机将模拟完整的计算机。启动、快照等操作非常缓慢,属于分钟基本级别。

容器则可以捆绑应用程序以及依赖项,容器化应用后可以将其部署在宿主机,宿主机提供标准化的运行环境,它将抽象化操作系统(和操作以下的基础硬件),容器化应用和其他容器化应用可以运行在同一宿主机,彼此隔离,互不干扰。

在这里插入图片描述
简而言之,虚拟机是将硬件虚拟化,容器则是将操作系统虚拟化,启动容器,只需要等待应用程序启动,而不是像虚拟机一样等待操作系统和应用程序两者启动。Docker 是容器化中最常用的技术。

4、Docker 的基本组成和工作原理

Docker 是由镜像(Image)、容器(Container)和仓库(Repository)仓库组成。

镜像:用来创建 Docker 容器的只读模板,一个镜像可以创建很多容器。镜像文件就是应用程序和配置依赖打包好形成一个可交付的运行环境。

容器:容器是镜像运行时的实体。从面向对象的角度看,镜像等价于类,容器等价于对象。容器是一个虚拟化的运行环境,应用程序或服务运行其中。容器可以被启动、开始、停止、删除。每个容器都是相互隔离的、保证安全的平台。每个容器都是一个简易版本的 Linux,里面有 root 用户、网络配置、进程空间等必备的系统资源,还有运行其中的应用程序和相关配置。

仓库:集中存放镜像文件的场所。Docker 公司提供的官方仓库 Docker Hub,国内的公开仓库包括阿里云等。

Docker 是一个 Client-Server 结构的系统,Docker 守护进程运行在主机上, 客户端通过 Socket 连接访问守护进程:

在这里插入图片描述
/usr/bin/dockerd 为 Docker 常驻后台(daemon)进程,/usr/bin/docker 为客户端程序。整体架构图如下:

在这里插入图片描述
守护进程从客户端接受命令并管理运行在主机上的容器。

在这里插入图片描述
(1) 用户使用 Docker Client 和 Docker daemon 建立通信,Docker daemon 接受响应 Docker Client 的请求;

(2) Docker engine 执行系列工作,每一项工作都是以 Job 的形式存在;

(3) Job 从 Docker registry 下载镜像后由镜像管理驱动 graph driver 负责将镜像保存为 graph 的形式存储;

(4) 网络管理驱动 Network driver 负责创建并配置容器的网络环境;

(5) Exec driver 负责执行用户指令,根据用户设置限制容器运行资源等。

(6) libcontainer 用于容器管理的包,基于 Namespace、Cgroup 以及文件系统等控制容器。

Namespace 和 Cgroup 是 Docker 内部实现的关键的基础,是 Linux 内核提供的技术,因为这两项技术才使得容器看起来像一个独立的操作系统。

Namespace 是一种资源隔离技术,比如进程 PID、进程间通讯媒介(IPC)、网络网卡等资源在 Linux 系统中是全局的,是属于整个操作系统的,而在 Namespace 隔离技术中这些资源将属于某个特定的 Namespace。Docker 使用 Namespace 就可以使得每个容器各个 Namespace 互不干扰。

Cgroup 是一种资源消耗控制技术,比如控制进程所能消耗的最大 CPU 使用率、内存占用、网络带宽等。Docker 使用 Cgroup 就可以限制某个容器使用资源的上限。

本文首发自公众号「LinuxOK」,ID为:Linux_ok,关注公众号第一时间获取更新,分享记录职场开发过程中所见所感。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Docker 是什么 的相关文章

随机推荐

  • Postman中的authorization

    1 概述 Authorization是验证是否拥有从服务器访问所需数据的权限 当发送请求时 xff0c 通常必须包含参数 xff0c 以确保请求具有访问和返回所需数据的权限 Postman提供了授权类型 xff0c 可以轻松地在Postma
  • 操作pdf,提示startxref not found

    startxref not found多半是文件被损坏了 xff0c 检查一下 xff0c 是不是之前自己写的代码把pdf文件跑崩了 可以尝试重新生成一遍该pdf文件 xff0c 然后再进行操作 或者尝试一下 xff1a https www
  • FTP 530未登录

    提供一种思路 xff1a 如果说FTP服务器已开 xff0c 服务器也能ping通 就得考虑是不是我们在FTP服务器上设置的默认路径有问题 xff08 不符合我们的需求 xff09 Windows10下 xff0c FTP设置默认位置 xf
  • 开源个小demo

    https github com UnderADome epms 内部项目管理
  • LDAP的基本知识

    https zhuanlan zhihu com p 147768058 https www cnblogs com gaoyanbing p 13967860 html
  • 「权威发布」2019年电赛最全各类题目细节问题解答汇总

    点击上方 大鱼机器人 xff0c 选择 置顶 星标公众号 福利干货 xff0c 第一时间送达 xff01 各位朋友大家上午好 xff0c 今天是比赛的第二天 xff0c 许多朋友都给我发消息 xff0c 我不是不回 xff0c 我实在是回不
  • Unable to find explicit activity class

    做项目从一个activity逐渐转向到使用多个activity xff0c 这个时候新手就容易出现一个问题 xff0c 忘了给activity在AndroidManifest xml中注册 打开日志 xff0c 在遇到这个报错信息的时候 x
  • Errors running builder 'Maven Project Builder'

    由于第一次玩maven的时候 xff0c 很多东西都还是懵懵懂懂 xff0c 不是很清楚 xff0c 不知道怎么把Myeclipse中的maven配置弄坏了 xff0c 从外部导入maven项目的时候 xff0c 总会报一些错误 xff1a
  • Type handler was null on parameter mapping for property '__frch_id_0'

    1 Type handler was null on parameter mapping for property frch id 0 2 Type handler was null on parameter mapping or prop
  • 如何解决error: failed to push some refs to 'xxx(远程库)'

    在使用git 对源代码进行push到gitHub时可能会出错 xff0c 信息如下 此时很多人会尝试下面的命令把当前分支代码上传到master分支上 git push u origin master 但依然没能解决问题 出现错误的主要原因是
  • expected an indented block

    Python中没有分号 xff0c 用严格的缩进来表示上下级从属关系 导致excepted an indented block这个错误的原因一般有两个 xff1a 1 冒号后面是要写上一定的内容的 xff08 新手容易遗忘这一点 xff09
  • C 实现TCP服务端(select、poll、epoll)

    使用C简单的实现一个tcp server xff0c 包括常规server 多线程实现server select实现server poll实现server epoll实现server IO模型原理可以看上一篇文章 常规模式 define M
  • UART串口通信

    目录 一 通信特点二 通信应用三 接线示意图三 UART通信协议四 STM32F4 串口使用1 资源分布2 特性3 UART框图4 使用方法5 相关库函数6 函数实例 五 实战 上位机控制开发板小灯 一 通信特点 异步 串行 全双工 一般描
  • 项目:文件搜索助手(FileSeeker)

    目录 1 项目简介 2 项目源代码 3 相关技术 4 实现原理 5 项目架构图 6 项目功能 7 测试报告 7 1 测试用例 7 2 测试环境 7 3 测试结论 7 3 1 功能测试 7 3 2 性能测试 7 3 3 兼容性 7 3 4 容
  • cocos2d实现2D地图A*广度路径算法

    h ifndef HELLOWORLD SCENE H define HELLOWORLD SCENE H include 34 cocos2d h 34 USING NS CC enum PatchFront Uper 61 1 Down
  • Keil 中,仿真调试查看局部变量值总是显示<not in scope>

    原因 xff1a 编译器把代码优化掉了 xff0c 直接导致在仿真中变量根本没有分配内存 xff0c 也就无法查看变量值 以后调试中遇到这种情况的解决办法 xff1a 核心思想是 xff1a 让变量值在代码中被读取其内存值 1 把变量定义为
  • 联合体在串口通讯中的妙用

    背景 本文主要涉及到的是一种串口通讯的数据处理方法 xff0c 主要是为了解决浮点数在串口通讯中的传输问题 xff1b 通常而言 xff0c 整形的数据类型 xff0c 只需进行移位运算按位取出每个字节即可 xff0c 那么遇到浮点型的数据
  • Linux 平均负载

    本文首发自公众号 LinuxOK xff0c ID 为 xff1a Linux ok 关注公众号第一时间获取更新 xff0c 分享不仅技术文章 xff0c 还有关于职场生活的碎碎念 在 Linux 系统中 xff0c 所谓平均负载 xff0
  • Linux 进程状态

    Linux 进程状态是平时排查问题 程序稳定性测试的基础知识 xff0c 查看进程状态的常用工具有 top 和 ps 以 top 的输出为例 xff1a S 列 xff08 Status xff09 表示进程的状态 xff0c 图中可见 D
  • Docker 是什么

    本文首发自公众号 LinuxOK xff0c ID为 xff1a Linux ok xff0c 关注公众号第一时间获取更新 xff0c 分享记录职场开发过程中所见所感 Docker 是一个用 GO 语言实现的开源项目 xff0c 它可以将应