初识Docker

2023-09-12 14:07:28


Docker安装

基于Centos7进行安装

1.确认系统版本和CPU架构,Centos7的x86_64架构

# cat /etc/*release*
# uname -a

2.卸载旧版本

yum remove docker \
docker-client \
docker-client-latest \
docker-common \
docker-latest \
docker-latest-logrotate \
docker-logrotate \
docker-engine

3.卸载历史版本

# 执行卸载
# yum remove docker-ce docker-ce-cli containerd.io dockerbuildx-plugin docker-compose-plugin docker-ce-rootless-extras
# 删除目录
# rm -rf /var/lib/docker
# rm -rf /var/lib/containerd

# 根据实际情况删除配置文件和对应镜像目录
# rm -rf /data/var/lib/docker
# rm -rf /etc/docker/daemon.json

4.获取yum源,

# yum install -y yum-utils
# yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
配置使用国内源
# sed -i 's@//download.docker.com@//mirrors.ustc.edu.cn/docker-ce@g' /etc/yum.repos.d/docker-ce.repo

5.安装并启动docker

# yum install -y docker-ce docker-ce-cli containerd.io dockerbuildx-plugin docker-compose-plugin
# systemctl start docker
# systemctl enable docker
# systemctl status docker

6.验证

# docker version
# docker info

7.修改docker安装目录和拉取镜像国内源

Docker 默认的安装目录为/var/lib/docker,这里面会存放很多很多镜像,所以我们在安装的时候需要考虑这个目录的空间,拉取镜像的时候使用国内源可以加快速度。

# cat /etc/docker/daemon.json
{
  "registry-mirrors": [
        "https://dockerproxy.com",
        "https://hub-mirror.c.163.com",
        "https://mirror.baidubce.com",
        "https://ccr.ccs.tencentyun.com"
    ],
  "data-root" : "/data/var/lib/docker"
}
# systemctl daemon-reload
# systemctl restart docker

Docker简介

1.什么是虚拟化、容器化?

  • 物理机:只的是实际的服务器或者笔记本等对实体机器的称呼,物理机器给虚拟机提供了硬件环境,有时候也称为宿主机。
  • 虚拟化:是指通过虚拟化技术将一台物理计算机虚拟为多台计算机,将一台计算机上同时运行多个逻辑计算机,每个逻辑计算机可运行不同的操作系统,并且这多个计算机的应用程序都可以在相互独立的空间内运行且互不影响,也就是在硬件层面的虚拟化,比如腾讯云阿里云这些云服务器把一台物理机虚拟成多台计算机给用户使用。
  • 容器化:容器化是一种虚拟化技术,又称操作系统层虚拟化,虚拟的是操作系统层面,容器之间共享宿主机系统内核。

2. 为什么需要虚拟化、容器化?

  • 资源利用率高:将利用率较低的服务器资源进行整合,用更少的硬件资源运行更多的业务
  • 环境标准化:使用容器化可以让开发、测试、生产环境保持一致,Docker的镜像提供了除内核外完整的运行时环境,保证了环境的统一性。
  • 资源弹性伸缩:根据不同的场景动态调整存储、网络、计算等硬件资源,请求压力大了就扩容,等压力平稳了进行收回。
  • 差异化环境提供:同时提供多套差异化的执行环境,限制环境使用资源。比如我的服务一个以来 Ubuntu 操作系统,一个服务依赖 CentOS 操作系统,但是没有预算购买两个物理机,这个时候容器化就能很好的提供多种不同的环境。
  • 沙箱安全:如果在服务器执行了rm -rf /这样的危险命令,如果是在容器内就可以保证我们物理主机的安全
  • 容器对比虚拟机启动更快:传统的虚拟机技术启动应用服务往往需要数分钟,而 Docker 容器应用,由于直接运行于宿主内核,无需启动完整的操作系统,因此可以做到秒级、甚至毫秒级的启动时间。大大的节约了开发、测试、部署的时间。
  • 更好的维护和复用:Docker 使用的分层存储以及镜像的技术,使得应用重复部分的复用更为容易,也使得
    应用的维护更新更加简单,基于基础镜像进一步扩展镜像也变得非常简单。Docker 团队同各个开源项目团队一起维护了一大批高质量的 官方镜像,既可以直接在生产环境使用,又可以作为基础进一步定制 。

3. 虚拟化的实现方式

应用程序执行环境分层

在这里插入图片描述

  • 硬件层:提供硬件抽象,包括指令集架构、硬件设备及硬件访问接口
  • 操作系统层 :提供系统调用接口,管理硬件资源
  • 程序库层:提供数据结构定义及函数调用接口

主机虚拟化的实现方式

主机虚拟化的原理是通过在物理服务器上安装一个虚拟化层来实现。这个虚拟化层可以在物理服务器和客户操作系统之间建立虚拟机,使得它们可以独立运行。 这个虚拟化层一般通过一个软件来实现,比如说Vmware。

容器虚拟化实现

容器虚拟化实现原理
容器虚拟化,有别于主机虚拟化,是操作系统层的虚拟化。通过 namespace 进行各程序的隔离,加上 cgroups 进行资源的控制,以此来进行虚拟化。容器虚拟化基础之 NameSpace
什么是 Namespace(命名空间)
namespace 是 Linux 内核用来隔离内核资源的方式。通过 namespace 可以让一些进程只能看到与自己相关的一部分资源,而另外一些进程也只能看到与它们自己相关的资源,这两拨进程根本就感觉不到对方的存在。具体的实现方式是把一个或多个进程的相关资源指定在同一个 namespace 中。 Linux namespaces 是对全局系统资源的一种封装隔离,使得处于不同 namespace 的进程拥有独立的全局系统资源,改变一个 namespace 中的系统资源只会影响当前namespace 里的进程,对其他 namespace 中的进程没有影响。

控制组(Control Groups)

Docker使用Linux内核的控制组功能,通过控制组可以限制容器使用的资源,如CPU、内存、磁盘IO等。这样可以确保容器之间资源的隔离和公平分配。

4. 虚拟机和Docker的区别

虚拟机Docker
磁盘占用几个G到几十个G几十M到几百M
CPU和内存占用虚拟操作系统非常占用CPU 和内存,需要通过虚拟层调用占用率高Docker 引擎占用资源极低,直接作用于硬件资源占用少
启动速度从开机到启动项目几分钟从开启容器到运行项目只需几秒
安装管理需要专门的运维技术通过镜像仓库安装、管理方便
应用部署手动部署,速度慢体系化部署,可以自动化,速度快
隔离性系统级别进程级别
封装程度打包整个操作系统打包项目代码和依赖信息

Docker 为什么比虚拟机资源利用率高,启动快?

  1. 轻量级:Docker容器是基于操作系统级别的虚拟化,而虚拟机是基于硬件级别的虚拟化。Docker容器共享宿主机的操作系统内核,因此不需要额外的操作系统启动和资源消耗,相比之下,虚拟机需要独立的操作系统和资源管理。
  2. 资源隔离:Docker使用Linux内核的命名空间和控制组来实现资源隔离。每个Docker容器都可以被限制在一定的资源范围内,如CPU、内存和磁盘等。这种细粒度的资源控制使得Docker容器可以更有效地利用宿主机的资源。
  3. 共享文件系统:Docker使用联合文件系统来构建容器的文件系统。联合文件系统允许多个容器共享相同的基础镜像,并在其上添加自己的文件系统层。这种共享文件系统的机制使得容器的启动速度更快,因为不需要为每个容器复制完整的操作系统文件。
  4. 镜像管理:Docker使用镜像来构建容器。镜像是一个只读的文件系统,包含了运行一个容器所需的所有文件和配置。镜像可以通过分层的方式进行管理,每个镜像层都可以被共享和重用。这种镜像管理的机制使得容器的启动速度更快,因为只需要加载和启动必要的镜像层。
  5. docker 有比虚拟机更少的抽象层。 docker 不需要 Hypervisor 实现硬件资源虚拟化,运行在 docker 容器上的程序直接使用的是实际物理机的硬件资源。因此在 cpu、内存利用率上 docker 将会在效率上有明显的优势。 docker 利用的是宿主机的内核,而不需要Guest OS,节省了 Guest OS 占用的资源。
  6. docker 不需要 Guest OS,创建一个容器时,不需要和虚拟机一样重新加载一个操作系统内核。从而避免引寻、加载操作系统内核返回时耗时耗资源的过程,当新建一个虚拟机时,虚拟机软件需要加载 Guest OS,返回新建过程是分钟级别的。而新建一个docker 容器只需要几秒钟

更多推荐

Webpack的Tree Shaking是如何工作的以及它的作用

聚沙成塔·每天进步一点点⭐专栏简介⭐什么是TreeShaking?⭐如何工作⭐它的作用⭐示例⭐写在最后⭐专栏简介前端入门之旅:探索Web开发的奇妙世界欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发者,这里都将

kubernetes进阶 (三) 基础练习

前两天朋友给了我几道题,看着挺简单的,但实际做的时候发现坑不少,这里做下笔记一、镜像构建部署lnmp1、构建镜像nginx、php、mysql要求使用centos7作为基础镜像2、使用deployment部署上面的容器,要求3个服务要放到一个pod中(虽然这样是不对的)3、使用ingress将上面部署的服务发布出去,通

(NDK编译)详解使用Android.mk编译的C/C++程序过程

想要在Android设备上运行C/C++程序可执行文件,可采用一个方法就是使用NDK编译,很多时候要比gcc编译更适合,这里我采用的是imx6q开发板上面装载了自己编写的Android6.0.1镜像,在Ubuntu64位系统上采用NDK编译。目录1.准备文件2.编写Android.mk注意完整Android.mk代码3

【Linux】生产消费模型 + 线程池

文章目录📖前言1.生产消费模型2.阻塞队列2.1成员变量:2.2入队(push)和出队(pop):2.3封装与测试运行:2.3-1对代码进一步封装2.3-2分配运算任务2.3-3测试与运行3.循环阻塞队列3.1POSIX信号量:3.1-1sem_init/sem_destroy3.1-2sem_wait3.1-3se

QT中的线程池的介绍和使用

文章目录前言一、线程池概念讲解二、使用线程池的场景三、QThreadPool类四、QT中使用线程池总结前言本篇文章将为大家讲解一下QT中线程池的概念和使用的方法。一、线程池概念讲解线程池是一种常见的并发编程模型,用于管理和复用多个线程来执行任务。它的基本思想是在应用程序启动时创建一组线程,这些线程可以重复使用,以执行一

HTML5 游戏开发实战 | 贪吃蛇

在该游戏中,玩家操纵一条贪吃的蛇在长方形场地里行走,贪吃蛇按玩家所按的方向键折行,蛇头吃到食物(豆)后,分数加10分,蛇身会变长,如果贪吃蛇碰上墙壁或者自身的话,游戏就结束了(当然也可能是减去一条生命)。贪吃蛇游戏的运行界面如上图所示。01、贪吃蛇游戏设计的思路把游戏画面看成40×30的方格。食物(豆)和组成蛇的块均在

HTML5 实现扑克翻牌游戏

扑克翻牌游戏就是桌面24张牌,玩家翻到两张相同扑克牌则消去,如果时间2分钟到了,仍然没有成功则游戏失败。扑克翻牌游戏运行结果如图1。01、程序设计的思路1.Html5倒计时功能Html5倒计时功能可以使用setTimeout()函数或者setInterval()函数来实现。1.使用setTimeout实现倒计时功能se

动态规划-货币问题

动态规划-货币问题题目一arr是货币数组,其中的值都是正数。再给定一个正数aim。每个值都认为是一张货币,即便是值相同的货币也认为每一张都是不同的,返回组成aim的方法数。例如:arr={1,1,1},aim=2,第0个和第1个能组成2,第1个和第2个能组成2,第0个和第2个能组成2,一共3种方法,所以返回3从递归入手

第三届阿里云磐久智维算法大赛——GRU BaseLine

赛题比赛链接:第三届阿里云磐久智维算法大赛-天池大赛-阿里云天池(aliyun.com)大赛概况庸医只知头痛医头脚痛医脚,凡良医者,必会抽丝剥茧,察其根本,方得药到病除。第一届和第二届磐久智维算法大赛,我们针对异常预测开展了积极的探索和卓有成效的实践。本届大赛我们延续对异常/故障这一领域的深入挖掘,以根因诊断为赛题,和

HTML

HTML1.HTML结构1.1认识HTMLHTML是超文本标记语言,电脑上看到的所有网站都是html实现的HTML代码是“标签”构成的,简单来说,html就是一堆标签的组合形如<body>hello</body>标签名(body)放到<>中大部分标签成对出现.为开始标签,为结束标签.少数标签只有开始标签,称为“单标签”

Linux内嵌汇编

文章目录前言一、内嵌汇编二、内嵌汇编示例三、不使用printf实现打印四、INT80H总结前言本篇文章我们来讲讲内嵌汇编的概念和教大家如何来编写内嵌汇编的代码。一、内嵌汇编内嵌汇编(InlineAssembly)是将汇编代码嵌入到高级语言中的一种编码技术。内嵌汇编能够将底层的机器代码和高层的高级语言代码无缝地结合起来,

热文推荐