文章目录
- Docker
- Docker使用场景
- Docker安装
-
- 1.关闭防火墙
- 2.卸载旧版本
- 3.安装Docker依赖环境
- 4.设置 Docker 安装地址
- 5.安装 Docker Engine-Community
- 6.Docker 镜像加速
-
-
-
- 配置daemon.json
-
-
- 7.启动 Docker
- 8.开启Docker自动补全
-
-
-
- bash-complete
- 刷新文件
- 测试
-
-
- Docker 基本概念
-
- 镜像
- 容器
- 仓库
- Docker命令
-
- 镜像相关操作
- 容器相关操作
- 容器化技术发展
-
- LXC
-
- 主要技术点
- 旧版 Docker
-
-
-
- 摆脱 LXC的限制
- 拆分Docker daemon
-
- 组件介绍
-
- containerd
- shim
- runc
-
-
Docker
Docker官网
Docker使用场景
容器变得越来越重要,尤其是在云环境中,许多企业甚至在考虑将容器替代 VM 作为其应用程序和工作负载的通用计算平台
- 微服务:容器小巧轻便,非常适合微服务体系结构,在微体系结构中,应用程序可以由许多松散耦合且可独立部署的较小服务构成。
- DevOps:微服务作为架构和容器作为平台的结合,是许多团队将 DevOps 视为构建,交付和运行软件的方式的共同基础。
- 混合,多云:由于容器可以在笔记本电脑,本地和云环境中的任何地方连续运行,因此它们是混合云和多云方案的理想基础架构,在这种情况下,组织发现自己跨多个公共云运行与自己的数据中心结合, 应用程序现代化和迁移:使应用程序现代化的最常见方法之一是将它们容器化,以便可以将它们迁移到云中。
Docker安装
1.关闭防火墙
systemctl status firewalld
systemctl stop firewalld
systemctl disable firewalld
2.卸载旧版本
较旧的 Docker 版本称为 docker 或 docker-engine ,如果已安装这些程序,请卸载它们以及相关的依赖项。
yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine
3.安装Docker依赖环境
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库,之后,您可以从仓库安装和更新 Docker。
yum install -y yum-utils \device-mapper-persistent-data \lvm2
4.设置 Docker 安装地址
在新主机上首次安装 Docker Engine-Community 之前,需要设置 Docker 仓库,之后,您可以从仓库安装和更新 Docker,使用以下命令来设置稳定的仓库**(阿里云)**
sudo yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo
5.安装 Docker Engine-Community
安装最新版本的 Docker Engine-Community 和 containerd
sudo yum install -y docker-ce docker-ce-cli containerd.io
如果提示您接受 GPG 密钥,请选是。
Docker 安装完默认未启动,并且已经创建好 docker 用户组,但该用户组下没有用户。
6.Docker 镜像加速
阿里云镜像获取地址:https://cr.console.aliyun.com/cn-hangzhou/instances/mirrors,登陆后,左侧菜单选中镜像加速器就可以看到你的专属地址了:
配置daemon.json
您可以通过修改daemon配置文件/etc/docker/daemon.json来使用加速器
sudo mkdir -p /etc/docker
sudo tee /etc/docker/daemon.json <<-'EOF'
{"registry-mirrors": ["https://xxxxx.mirror.aliyuncs.com"]
}
EOF
sudo systemctl daemon-reload
sudo systemctl restart docker
7.启动 Docker
service docker start
通过运行 hello-world 映像来验证是否正确安装了 Docker Engine-Community
docker run hello-world
运行该代码后首先会从仓库拉取
hello-world
镜像,然后运行该镜像,运行后会输出一个Hello from Docker!
8.开启Docker自动补全
使用docker时无法自动补全镜像名和其他参数,这样使用效率大大降低,下面是解决方法
bash-complete
yum install -y bash-completion
刷新文件
source /usr/share/bash-completion/completions/docker
source /usr/share/bash-completion/bash_completion
测试
输入docker p
后docker会将可选项列出来
docker p
Docker 基本概念
镜像
Docker 镜像是一个特殊的文件系统,除了提供容器运行时所需的程序、库、资源、配置等文件外,还包含了一些为运行时准备的一些配置参数(如匿名卷、环境变量、用户等),镜像不包含任何动态数据,其内容在构建之后也不会被改变。
Union FS
联合文件系统是(Union FS)是linux的存储技术,也是Docker镜像的存储方式, 它是分层的文件系统,将不同目录拉到同一个虚拟目录下,下图展示了Docker用Union FS 搭建的分层镜像:(比如最下层是操作系统的引导,上一层是Linux操作系统,再上一层是Tomcat,jdk,再上一层是应用代码)
这些层是只读的,加载完后这些文件会被看成是同一个目录,相当于只有一个文件系统。
我们可以通过docker info查看镜像的一些信息,可以看到存储驱动用的并不是Union FS 而是overlay2,overlay也是一个联合文件系统,所以上述主要介绍联合文件系统的概念,至于这些存储驱动的演变过程和优缺点
镜像构建时,会一层层构建,前一层是后一层的基础,每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层。(比如,删除前一层文件的操作,实际不是真的删除前一层的文件,而是仅在当前层标记为该文件已删除,在最终容器运行的时候,虽然不会看到这个文件,但是实际上该文件会一直跟随镜像,因此,在构建镜像的时候,需要额外小心,每一层尽量只包含该层需要添加的东西,任何额外的东西应该在该层构建结束前清理掉)
容器
镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的 类 和 实例 一样,镜像是静态的定义,容器是镜像运行时的实体,容器可以被创建、启动、停止、删除、暂停等。
容器的实质是进程,但与直接在宿主执行的进程不同,容器进程运行于属于自己的独立的命名空间,因此容器可以拥有自己的root文件系统、自己的网络配置、自己的进程空间,甚至自己的用户 ID 空间。
容器内的进程是运行在一个隔离的环境里,使用起来,就好像是在一个独立于宿主的系统下操作一样,这种特性使得容器封装的应用比直接在宿主运行更加安全,也因为这种隔离的特性,很多人初学 Docker 时常常会混淆容器和虚拟机。
前面讲过镜像使用的是分层存储,容器也是如此,每一个容器运行时,是以镜像为基础层,在其上创建一个当前容器的存储层,我们可以称这个为容器运行时读写而准备的存储层为容器存储层。
容器存储层的生存周期和容器一样,容器消亡时,容器存储层也随之消亡,因此,任何保存于容器存储层的信息都会随容器删除而丢失。
仓库
镜像构建完成后,可以很容易的在当前宿主机上运行,但是,如果需要在其它服务器上使用这个镜像,我们就需要一个集中的存储、分发镜像的服务,Docker Registry 就是这样的服务。
一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。
通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本,我们可以通过<仓库名>:<标签>的格式来指定具体是这个软件哪个版本的镜像,如果不给出标签,将以latest作为默认标签。
以 Ubuntu 镜像为例,ubuntu是仓库的名字,其内包含有不同的版本标签,如,14.04,16.04,我们可以通过ubuntu:14.04,或者ubuntu:16.04来具体指定所需哪个版本的镜像,如果忽略了标签,比如ubuntu,那将视为ubuntu:latest
仓库名经常以三段式路径形式出现,比如heima.com/nginx-proxy:tag
,前者往往意味着 Docker Registry 多用户环境下的用户名,后者则往往是对应的软件名,但这并非绝对,取决于所使用的具体 Docker Registry 的软件或服务
Docker命令
镜像相关操作
# 查找镜像
docker search 镜像名称# 下载镜像
docker pull 镜像名称
# 注意事项:
# 1.如果不写版本号默认拉取最新的版本好latest。
# 2.拉取的时候是多个层一起拉取的,这样可用让其他镜像复用分层
# 3.如果拉取的镜像不写仓库地址默认就是docker.io/library/# 下载指定版本的镜像 https://hub.docker.com 找到Tags
docker pull mysql:5.7.40# 查看镜像
docker images
查找指定镜像
容器相关操作
# 通过镜像启动容器
docker run -d -p 3306:3306 -v /tmp/etc/mysql:/etc/mysql/mysql.conf.d/ -v /tmp/data/mysql:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=root --name mysql mysql:5.7.40
# 参数解释:
# -d:是指容器后台运行,如果不加-d,当用户断开客户端时容器会结束运行
# -p:将容器的3306端口映射到主机的3306端口,用来暴漏端口的 (宿主机:容器)
# -v:这个命令是用来挂载目录的,将本地目录挂载到容器中,这样容器操作的就是本地目录 (宿主机:容器)
# -e:这个命令是配置环境参数的,这里MYSQL_ROOT_PASSWORD=root指的是用root用户运行mysql,可以登录Docker容器通过ENV命令查看
# --name:这个命令是配置Mysql的容器名称的,如果不配置,默认是随机生成的名字# 查看容器运行状态
docker ps
# 查看全部容器
docker ps -a# 停止容器
docker stop 容器ID# 启动停止的容器
docker start 容器ID# 重启容器
docker restart 容器ID# 删除容器 对于运行中的容器可以加上-f参数强制删除
docker rm -f 容器ID# 查看容器运行日志
docker logs -f mysql# 登录容器
docker exec [options] container command [arg...]
# docker exec -it mysql /bin/bash
# 参数解释:
# 简写 名称 描述
# -d --detach 后台运行模式,在后台执行命令相关命令
# --detach-keys 覆盖容器后台运行的一些参数信息
# -e --env 设置环境变量
# -i --interactive 展示容器输入信息STDIN
# --privileged 为命令提供一些扩展权限
# -t --tty 命令行交互模式
# -u --user 设置用户名(format: <name|uid>[:<group|gid>])
# -w --workdir 指定容器内的目录
容器化技术发展
LXC
LXC是
Linux containers
的简称,Linux Container容器是一种内核虚拟化技术,可以提供轻量级的虚拟化,以便隔离进程和资源
完整的LXC能力在2008年合入Linux主线,所以容器的概念在2008年就基本定型了,并不是后面Docker造出来的,关于LXC的介绍很多,大体都会说“LXC是Linux内核提供的容器技术,能提供轻量级的虚拟化能力,能隔离进程和资源”,但总结起来,无外乎就两大知识点Cgroups(Linux Control Group)和Linux Namespace,搞清楚他俩,容器技术就基本掌握了。
Linux容器技术其实就是整合内核的功能,让其支持多个容器运行时资源相互隔离;我们知道内核的功能用户是无法直接操作的,必须得有一用户空间的软件,通过系统调用去操作内核功能;所以lxc就是用来操作Linux内核容器化的工具
主要技术点
- chroot:创建一个虚拟的根目录文件系统 【实质还是调用底层的文件系统】,不过是简历一个虚拟的,可以跟其他容器的虚拟文件系统相互隔离;但共享底层的文件系统
- namespaces:命名空间可以提供一个进程相互隔离的独立网络空间,不同的容器间 进程pid可以相同,进程并不冲突影响;但可以共享底层的计算和存储(cpu + mem)
- CGroups:实现了对容器的资源分配和限制,比如给容器1分配10core 30G 内存;那这个容器最多用这么大的资源;如果内存超过30G ,会启动swap,效率降低,也可能会被调度系统给kill掉
旧版 Docker
Docker 引擎首次发布的时候,由两个核心组件构成:LXC 和 Docker daemon
Docker deamon 是一个单一的二进制文件,由 Docker Client 、Docker API、容器运行时、构建镜像等组成, LXC 由命名空间 Namespace 和 控制组 CGroup 等基础工具组成,由 Linux 内核的容器虚拟化技术提供
摆脱 LXC的限制
对 LXC 的依赖自始至终都是个问题
- 首先,LXC 是基于 Linux 的,这对于一个立志于跨平台的项目来说是个问题。
- 其次,如此核心的组件依赖于外部工具,这会给项目带来巨大风险,甚至影响其发展。
因此,Docker 公司开发了名为 Libcontainer 的自研工具,用于替代 LXC,Libcontainer 的目标是成为与平台无关的工具,可基于不同内核为 Docker 上层提供必要的容器交互功能,在 Docker 0.9 版本中,Libcontainer 取代 LXC 成为默认的执行驱动,也就是现在常说的Runc。
拆分Docker daemon
随着时间的推移,Docker daemon 的整体性带来了越来越多的问题,难于变更、运行越来越慢,这并非生态(或Docker公司)所期望的。
Docker 公司意识到了这些问题,开始努力着手拆解这个大而全的 Docker daemon 进程,并将其模块化,这项任务的目标是尽可能拆解出其中的功能特性,并用小而专的工具来实现它,这些小工具可以是可替换的,也可以被第三方拿去用于构建其他工具。
这一计划遵循了在 UNIX 中得以实践并验证过的一种软件哲学:小而专的工具可以组装为大型工具,这项拆解和重构 Docker 引擎的工作仍在进行中,不过,所有容器执行和容器运行时的代码已经完全从 daemon 中移除,并重构为小而专的工具。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MsUhoD0M-1679929771103)(Docker学习笔记.assets/docker265.png)]
组件介绍
containerd
这是一个管理和运行容器的守护进程,它推送和拉动镜像,管理存储和网络,并监督容器的运行
Containerd作为一个生产环境可用的OCI 实现,它利用了OCI 运行时和镜像格式,在对 Docker daemon 的功能进行拆解后,所有的容器执行逻辑被重构到一个新的名为 containerd的工具中
它是从 Docker 项目中分离出来,之后 containerd 被捐赠给云原生计算基金会(CNCF)为容器社区提供创建新容器解决方案的基础,所以 Docker 自己在内部使用 containerd,当你安装 Docker 时也会安装 containerd
containerd 通过其 CRI 插件实现了 Kubernetes 容器运行时接口(CRI),它可以管理容器的整个生命周期,包括从镜像的传输、存储到容器的执行、监控再到网络
containerd 在 Linux 和 Windows 中以 daemon 的方式运行,从 1.11 版本之后 Docker 就开始在 Linux 上使用它,Docker 引擎技术栈中,containerd 位于 daemon 和 runc 所在的 OCI 层之间。Kubernetes 也可以通过 cri-containerd 使用 containerd。
如前所述,containerd 最初被设计为轻量级的小型工具,仅用于容器的生命周期管理,然而,随着时间的推移,它被赋予了更多的功能,比如镜像管理。
shim
shim是一个真实运行的容器的真实垫片载体,每启动一个容器都会起一个新的docker-shim的一个进程
shim是实现无daemon的容器(用于将运行中的容器与daemon解耦,以便进行daemon升级等操作)不可或缺的工具
containerd 指挥runc来创建新容器,事实上,每次创建容器时它都会fork一个新的runc实例,不过,一旦容器创建完毕,对应的runc进程就会退出,因此,即使运行上百个容器,也无须保持上百个运行中的runc实例。
一旦容器进程的父进程runc退出,相关联的containerd-shim 进程就会成为容器的父进程,作为容器的父进程,shim 的部分职责如下
- 保持所有STDIN和STDOUT流是开启状态,从而当daemon重启的时候,容器不会因为管道( pipe)的关闭而终止
- 将容器的退出状态反馈给daemon
runc
这是低级别的容器运行时(实际创建和运行容器的东西),它包括 libcontainer,一个用于创建容器的基于 Go 的本地实现
runc是docker贡献给oci的容器运行时,也是目前使用比较多的容器运行时,docker目前的实现也是使用的runc,如前所述,runc 是 OCI 容器运行时规范的参考实现,Docker 公司参与了规范的制定以及 runc 的开发
去粗取精,会发现 runc 实质上是一个轻量级的、针对 Libcontainer 进行了包装的命令行交互工具(Libcontainer 取代了早期 Docker 架构中的 LXC)
查看全文
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dgrt.cn/a/2081350.html
如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!
相关文章:
【博学谷学习记录】超强总结,用心分享 | 架构师 Docker学习总结
文章目录DockerDocker使用场景Docker安装1.关闭防火墙2.卸载旧版本3.安装Docker依赖环境4.设置 Docker 安装地址5.安装 Docker Engine-Community6.Docker 镜像加速配置daemon.json7.启动 Docker8.开启Docker自动补全bash-complete刷新文件测试Docker 基本概念镜像容器仓库Docke……
spark UI中Locality Level的 NODE_LOCAL和PROCESS_LOCAL区别
在Spark中,Locality Level是指任务所在的节点与数据所在的节点之间的距离。其中,Locality Level可以分为以下四种:
PROCESS_LOCAL:任务与数据位于同一进程中。这是最佳的Locality Level,因为数据可以直接从内存中获取……
关于线程池你了解些什么?
前言学习线程池的思维导图线程池是什么?它有什么用?虽然线程比进程更轻量级,但是每个进程所占的资源空间是有限,如果我们频繁创建和销毁线程也会消耗很多CPU资源,那么我们该如何解决这个问题呢?官方解释:线程池是一种多线程处理形式,其处理过程可以将多个任务添加到阻塞队列……
uni状态管理pinpia
vuex的升级版 方便简洁个人感觉比vuex好用的多
引入就不多说了,官方文档都有介绍 下面直接上代码
1、首先定义仓库
import {defineStore
} from pinia;export const editStore defineStore(edit, {state: () > {return {vIndex: 0,views: [],isShowRight: fa……
小白学Pytorch系列–Torch.nn API Recurrent Layers(8)
小白学Pytorch系列–Torch.nn API Recurrent Layers(8) 方法注释nn.RNNBasenn.RNN将具有tanh tanh或ReLU ReLU非线性的多层Elman RNN应用于输入序列。nn.LSTM将多层长短期记忆(LSTM) RNN应用于输入序列。nn.GRU将多层门控循环单元(GRU) RNN应用于输入序列。nn.RNNCell具有tanh或……
Chatgpt-3 使用的提取积累数据集技术和数据集自动化处理
为了积累数据集,ChatGPT-3使用了一系列技术来从不同来源的文本中提取数据。其中最常用的技术包括: Web scraping:ChatGPT-3使用Web scraping技术从互联网上的网页中提取文本。它可以自动化抓取网页,并从中提取出需要的信息。 数据……
项目经理注意!掌握这5个关键点,提升效率80%!
很多项目在刚接手时,遇到的问题种类多并且复杂,乍一看很令人头疼,但仔细梳理下来好像也没有那么难,只需要厘清以下5个关键点:
一、做好项目的五个关键
具体的思路就是: 明确事->找对人->排计划->定机制->……
配置JRebel热部署
1:此对应设置的是IntelliJ IDEA 2022.1.3 (Ultimate Edition)的热部署设置
2:激活插件失败,提示【LS client not configued】原因是版本过高,解决办法:手动下载jRebel,官网去找到过去版本的jRebel,地址&am……
1.HTML_w3初学笔记汇总(自用)
目录 HTML简介
HTML编辑器
基本的HTML标签
HTML元素 HTML属性
HTML标题
HTML段落
HTML样式 HTML文本格式化 HTML引用 HTML注释
HTML颜色
HTML颜色名 HTML CSS
HTML链接
HTML图像 HTML表格 HTML列表
HTML 和 HTML类 HTML id属性 HTML Iframe HTML JavaScript HT……
PTA-PAT(Basic Level)Practice(中文) 1001害死人不偿命猜想
题目描述
1001害死人不偿命的(3n1)猜想
卡拉兹(Callatz)猜想:
对任何一个正整数 n,如果它是偶数,那么把它砍掉一半;如果它是奇数,那么把 (3n1) 砍掉一半。这样一直反复砍下去,最后……
Pandas入门实践2 -数据处理
为了准备数据进行分析,我们需要执行数据处理。在本节中,我们将学习如何清理和重新格式化数据(例如,重命名列和修复数据类型不匹配)、对其进行重构/整形,以及对其进行丰富(例如,离散化……
一、lua基础知识1
一、lua 的数据类型
–类型 a1; –number print(type(a)) –number b"HelloWorld"; print(type(b)) –string 两种数据类型 ctrue; print(type(c)) –boolean true 或者 false d print; d("HelloWorld"); print(type(d)); –function类型 ……
二、lua语言基础2
1.lua的类型有哪些?答:lua的数据类型有:number,string,nil function,table,thread,userdata(用户自定义的类型),boolean(布尔类型) 2.什么是尾调用,尾调用有什么优点尾调用:在一个函数的最后一步开始调用另……
quick-cocos2dx-luaUI控件讲解
–MyApp部分 require("config") require("cocos.init") require("framework.init") local MyApp class("MyApp", cc.mvc.AppBase) function MyApp:ctor() MyApp.super.ctor(self) end function MyApp:run() cc.FileUti……
quick-cocos2dx lua语言讲解 (动作,定时器,触摸事件,工程的类的讲解)
–MainScene部分
— display.newScene 创建一个场景 — 在quick里面我们的控件、精灵 一般是加载到场景上的 local MainScene class("MainScene", function() return display.newScene("MainScene") end) function MainScene:ctor() –创……
使用quick-cocos2dx-lua 实现的小游戏(包含碰撞检测,触屏发子弹)
–主界面local MainScene class("MainScene", function()return display.newScene("MainScene")end)ON true;function MainScene:ctor()local bg cc.Sprite:create("main_background.png");bg:setScale(2);bg:setPosition(display.cx,display……
cocos2d-js 中scrollview详解
/****
开头的一些废话:
1、多思考,善于思考
2、懂得变通
3、多多查询API首先复制一段 API中的源码:(UIScrollView.js)这段代码可以看出 scrollview
中的容器是一个node,并且他的位置是:代码最后……
cocos2d-js中的回调函数中世界坐标系和节点坐标系的相互转换
世界坐标系和节点坐标系都是OPENGL 坐标系 1、世界坐标系原点就是屏幕的左下角; 2、节点坐标系的原点就是一个节点的左下角; 3、两个坐标系可以通过已经写好的cocosAPI进行想换转换; 4、所有的节点需要转为一个节点上或者是统一的世界坐标系……
通过JavaScript实现漂浮
<html>
<head><meta http-equiv"Content-Type" content"text/html"; charset"gb2312" /><title>漂浮广告</title><style type"text/css">div{position:absolute;}</style>
</head>
&……
序列动画和图片内存问题
一、帧动画问题 /*** 帧动画总结:* 1、如果精灵进行新建时,加载了纹理,那么setRestoreOriginalFrame可以设置为false或者true* 2、如果精灵新建时,没有加载纹理的话,那么setRestoreOriginalFrame需要设置为false&#……
编程日记2023/4/16 15:01:22