初识docker容器(优势真的巨大,比虚拟机好用多了)
目录
- 背景:
- 一、名称空间
- Namespaces
- Docker Engine在Linux.上使用以下名称空间:
- 二、docker与虚拟化
- 2.1cgroups
- 2.2全虚拟、半虚拟、容器技术
- 2.3那如何区分虚拟机中的不同应用呢?
- 2.4微服务
- 2.5企业中——开发运维整体流程
- 2.6docker数据流向图
- 2.7docker镜像流向
- 2.8Container和VM(虚拟机)
- 2.9docker和虚拟化比有什么优势
- docker 有哪些优势?
- 三、Docker
- 3.1Docker的使用场景
- 3.2 Docker引擎( Docker Engine )
- 3.3 Docker的架构 ( Docker architecture )
- 3.4docker 三大组件
- 四、安装 Docker
- 五、Docker 镜像与容器命令管理
- 5.1 镜像命令管理
- 5.2 容器命令管理
背景:
以linux而言,linux操作系统会有一个主进程pid=1派生出其他进程来控制不同服务
例如: pid=2 --> python pid=3–>java pid4–>php ,三个服务可能会相互影响
使用者期望将这三个不同的服务,跑在不同的运行时环境中实现相互不影响,同时不会增加服务器成本
延伸出一-》能否将这三种服务分别封装起来一》KVM虛拟化技术,实现了一-个操作系统模拟多个操作系统/不同的运行时
环境
随着技术发展—》虚拟化技术开销较大( 例如:只要运行一个py脚本,想要使用虚拟化方式实现,还需要安装一个操作系统,并不方便/合理)
延伸出容器技术
虚拟化层的抽象层(用户层)剥离,使用docker engine
来替代(来宾操作系统去除),只要通过引擎就可以直接连接到宿主机操作系统中,极大减小了开销
1232
2464
docker与虚拟机区别之一( 资源利用率/损耗)
###那如何实现应用A和应用B隔离
应用和应用的隔离,如何进行判断
以操作系统维度
应用A.与应用B隔离,在操作系统中,是通过namespaces( 名称空间、命名空间)实现的,只要实现以下6个空间隔离,才能
认为两个应用实现了完全/完整隔离
一、名称空间
容器隔离了6个名称空间(namespace次元隔离-用容器化技术封装)* * * * *
mount 文件系统,挂载点 ——》一个文件系统内,不能重复挂在一个指定目录,例如: /mnt
user 操作进程的用户和用户组 .。。。。。。。。。。
pid 进程编号
uts 主机名和主机域
ipc 信号量、消息队列,共享内存 (理解,不同的应用调用内存资源的时候应该使用不同的内存空间)
net 网络设备、网络协议栈、端口等
-
cgroups 管理 3.8版本
-
cgroups linux 内核态中资源管理的模块
-
cgroups 管理一些系统资源
Namespaces
Docker使用-种称为namespaces提供容器的隔离工作区的技术。运行容器时,Docker 会为该容器创建- -组名称空间。这些名称空间提供了一-层隔离。容器的每个方面都在单独的名称空间中运行,并且其访问仅限于该名称空间。
Docker Engine在Linux.上使用以下名称空间:
该pid命名空间:进程隔离(PID:进程ID)
该net命令空间:管理网络接口(NET:网络)
该ipc命名空间:管理访问IPC资源(IPC: 进程间通信)
该mnt命名空间:管理文件系统挂载点(MNT:mount)
该uts命名空间:隔离内核和版本标识符。(UTS:Unix时间共享系统)
docker 引擎 对内核版本是有要求的 (至少是3.8+)
docker 需要cgroups 的资源管理功能
最晚的一个名称空间是3.8
使用docker有什么意义?
ECS,属于IAAS、Docker(k8s) 属于PAAS
IASS : 基础设施服务
SAAS : 应用即服务
PAAS : 平台及服务
Docker images :镜像
Docker container:容器
Docker registry:镜像仓库
存储镜像的地方,默认在公共的Docker Hub上查找,可以搞个人仓库
二、docker与虚拟化
2.1cgroups
Linux上的Docker引擎还依赖于另一种称为控制组( cgroups)的技术。cgroup将应用程序限制为一组特定的资源。控制组允许Docker Engine将可用的硬件资源共享给容器,并有选择地实施限制和约束。
例如,您可以限制特定容器可用的内存。
2.2全虚拟、半虚拟、容器技术
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SS6HlBWQ-1641814563053)(C:\Users\赵金华\Desktop\整理复习\docker图片\1.png)]
2.3那如何区分虚拟机中的不同应用呢?
虚拟机一般不可能只跑一个应用,因为这样确实也太浪费资源了,我们可以想想,现在手上的电脑,可以用 Vmvare 导入几个虚拟机,所以诸如 Cloud Foundry通过引入操作系统的 Cgroups 和 Namespace 等机制,从而来为每个应用单独创建一个叫做「沙盒」的隔离环境,然后在这些「沙盒」中启动应用,通过这样的方法就让虚拟机中应用各自互不干扰,让其自由翱翔,至于 Cgroups 和 Namespace 的实现原理,后续我们再共同的探讨
这里所谓的隔离环境就是「容器」。
2.4微服务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ynGF9ZOG-1641814563054)(C:\Users\赵金华\Desktop\整理复习\docker图片\2.png)]
将40G的包拆分成4组10G的包来同时进行运作,化整为零就是微服务的概念,本来需要一台机器跑40G的包,但是微服务进行细小化,分成多个小块,同时进行处理,极大的加快了部署的速度。
在更新的时候包的时候一般需要全部更新,这样极度的消耗时间,而这个时候可以单独给单拆分的模块来进行镜像升级,一般只有10G左右,升级时间就减少了。
2.5企业中——开发运维整体流程
①首先由开发进行代码研发,研发好之后进行编译、打包
PS: 打包:一般会使用maven.工具打war包或者jar包.
②打完包之后,放置对应的运行时环境中,进行试运行
PS: 这里的运行时环境指:例如tomcat ( java环境) php (php环境)等1
③中间会加.上一些测试过程,测试代码的有效性、可用性和可执行性
④以上测试完成,运维会将这个软件包拉过来,运行在实际生产的运行时
环境中
问题:在以上的第o点中,不同开发语言的运行时环境混淆在一起运行会有很大的隐患,以及不便
传统中,所谓的运行时环境,例如tomcat (java环境) php ( php环境)等
容器中,所谓的运行时环境,指的试"容器”内部
在此之前,容器一》是一个运行时环境,构成容器的组件是image镜像(一个运行时环境的模板)
2.6docker数据流向图
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Q5c6mNTg-1641814563055)(C:\Users\赵金华\Desktop\整理复习\docker图片\3.png)]
Docker守护程序(dockerd)侦听Docker API请求并管理Docker对象,例如图像,容器,网络卷。守护程序还可以与其他守护程序通信以管理Docker服务。
Docker images:镜像
Docker container:容器
Docker registry:镜像仓库65却55lo’iuu
2.7docker镜像流向
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-e9idnL4L-1641814563055)(C:\Users\赵金华\Desktop\整理复习\docker图片\4.png)]
2.8Container和VM(虚拟机)
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-vQJZNElH-1641814563056)(C:\Users\赵金华\Desktop\整理复习\docker图片\5.png)]
2.9docker和虚拟化比有什么优势
| 启动速度 | 秒级 | 分钟级 |
| 运行性能 | 接近原生(直接在内核中运行) | 50%左右损失 |
| 磁盘占用 | MB | GB |
| 数量 | 成百上千 | 一般十几台 |
| 隔离性 | 进程级别 | 系统级别(更彻底) |
| 操作系统 | 主要支持Linux | 几乎所有 |
| 封装程度 | 只打包项目代码和依赖关系,共享主机内核 | 完整的操作系统,与宿主机隔离 |
docker 有哪些优势?
PS: (三个统一 封装的模式image ,运行时环境container,统一的平台engine)
和虚拟化比有什么优势(表格中的对比)
docker和VM之前的区别,主要就是在于资源利用率和隔离性(共享内核、独立的造作系统)
docker 把容器化技术做成了标准化平台CAAS ( docker统一-/指定了容器化技术的标准化平台)使用docker有什么意思?
docker 引擎统一了基础设施环境-docker容器环境(引擎)
docker 引擎统一了程序打包(装箱)方式-docker镜像
docker 引擎统一了程序部署(运行)方式-docker容器
镜像————》封装的某个时刻的服务/应用状态
容器————》应用跑起来的状态(正常提供服务的状态-运行时)
实现了一次构建、多次、多处使用
docker-ce (社区版) docker-ee(企业版)
三、Docker
3.1Docker的使用场景
K8S image镜像+ container容器的方式
war jar——》 github gitlab 私有仓库(代码仓库) 一-》 jenkins (测试)
(应用程序封装/构建镜像)一-》运维下载,使用容器技术进行运行/发布
打包应用程序简单部署
可脱离底层硬件任意迁移(实现了应用的隔离,将应用拆分并进行解耦),例如:服务器从
腾讯云迁移到阿里云
持续集成和持续交付(CI/CD):开发到测试发布
部署微服务
提供PAAS产品(平台即服务) {OpenStack的云 主机类似于阿里云的ECS,属于IAAS、Docker (
K8S) 属于PAAS}
docker 三要素
镜像——》模板
容器——》基于镜像,运行状态/运行时状态
仓库——》存放镜像模板
3.2 Docker引擎( Docker Engine )
Docker Engine 是具有以下主要组件的C/S客户端-服务器应用程序:
server端:服务器是一种长期运行的程序,称为守护程序进程(dockerd命令)。
CLIENT端:RESTAPI,它指定程序可以用来与守护程序进行通信并指示其操作的接口。
命令行界面(CLI) 客户端(docker命令)。
docker run
docker start
docker rm
客户端传入——》通过restAPI——》进入内核中的docker-server端
——》由server端进行处理
——》通过rest API 返回给docker-client 端进行展示
3.3 Docker的架构 ( Docker architecture )
Docker使用客户端-服务器架构。Docker 客户端与Docker
守护进程进行对话,该守护进程完成了构建,运行和分发Docker容器的繁重工作。
Docker区别于传统的虚拟化,不需要虚拟硬件资源,直接使用容器引擎,所以速度快
Docker Client: 客户端/提供一个与用户交互,展示的平台+
管理、控制docker服务端(功能)的工具docker
Docker客户端(docker) 是许多Docker用户与Docker交互的主要方式。当您使用诸如之类的
命令时docker
run,客户端会将这些命令发送到dockerd,以执行这些命令。该docker命令使用Docker
API。Docker客户 端可以与多个守护程序通信。
Docker daemon:守护进程
Docker守护程序( dockerd)侦听Docker
API请求并管理Docker对象,例如图像,容器,网络和卷。守护程序还可以与其他守护程序通信以管理Docker服务。
Docker images: 镜像
cgroups namespace
3.4docker 三大组件
容器可以被打包成镜像
-
Docker container: 容器
-
Docker registry:镜像仓库(yum仓库)
组件:
- 镜像:–组资源集合,包含了应用程序软件包、应用程序相关的依赖包、运行应用程序所需要的基础环境(泛指操作系统环境),可以理解为容器的模板
- 容器:基于镜像的一-种运行时状态
- 仓库:存放image镜像,仓库大类: 1、公共仓库一-》 docker hub 2、私有仓库registry
harbor
四、安装 Docker
#环境配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0#安装依赖包 yum -y install yum-utils device-mapper-persistemt-data lvm2#设置阿里云镜像源 cd /etc/yum.repos.d/ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装 docker-ce 社区版(企业版叫 docker-ee,收费) yum -y install docker-ce#启动 systemctl enable docker && systemctl start docker 12345678910111213141516 配置阿里云镜像加速 sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://4iv7219l.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload sudo systemctl restart docker 12345678 网络优化 cat >> /etc/sysctl.conf <<EOF net.ipv4.ip_forward=1 EOFsysctl -p systemctl restart network systemctl restart docker 1234567 一键安装 [root@c7-1 ~]#cat docker.sh #!/bin/bash#环境配置 systemctl stop firewalld && systemctl disable firewalld setenforce 0#安装依赖包 yum -y install yum-utils device-mapper-persistemt-data lvm2#设置阿里云镜像源 cd /etc/yum.repos.d/ yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo#安装 docker-ce 社区版(企业版叫 docker-ee,收费) yum -y install docker-ce#配置阿里云镜像加速(尽量使用自己的) #地址 https://help.aliyun.com/document_detail/60750.html sudo mkdir -p /etc/docker sudo tee /etc/docker/daemon.json <<-'EOF' {"registry-mirrors": ["https://4iv7219l.mirror.aliyuncs.com"] } EOF sudo systemctl daemon-reload#网络优化 cat >> /etc/sysctl.conf <<EOF net.ipv4.ip_forward=1 EOFsysctl -p systemctl restart network systemctl enable docker && systemctl restart docker 1234567891011121314151617181920212223242526272829303132333435PS
docker-server 端配置文件 daemon.json
五、Docker 镜像与容器命令管理
5.1 镜像命令管理
PS:
- docker client 客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restful api 典型的 C/S 架构
- 由 docker 服务端的守护进程从 docker hub 上下载了镜像(PS:服务端会先检查本地系统是否有这个镜像)
- 服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
- docker 服务端把这些信息流(传递)返回到客户端并展示出来(展示在终端上)
5.2 容器命令管理
容器与宿主机之间文件的复制
docker run -itd --name nginx_test nginx:latest /bin/bash#主机复制到容器 [root@tengxun-02 ~]#touch testfile [root@tengxun-02 ~]#ls testfile [root@tengxun-02 ~]#docker cp testfile nginx_test:/opt [root@tengxun-02 ~]#docker exec -it nginx_test bash root@2ca07b152329:/# cd /opt root@2ca07b152329:/opt# ls testfile#容器复制到主机 root@2ca07b152329:/opt# ls testfile root@2ca07b152329:/opt# touch haha root@2ca07b152329:/opt# ls haha testfile root@2ca07b152329:/opt# exit exit [root@tengxun-02 ~]#docker cp nginx_test:/opt/haha . [root@tengxun-02 ~]#ls haha testfile 1234567891011121314151617181920212223 进入容器没有 systemctl 命令解决 添加 --privileged=true(指定此容器是否为特权容器),使用此参数,则不能用 attach。 > 示例: docker run -itd --name test3 --privileged=true centos /sbin/init`/sbin/init 内核启动时主动呼叫的第一个进程`可以使用 docker inspect <容器ID> docker ps -a docker exec -it <容器ID> /bin/bash yum install httpd -y systemctl status httpd 1234567891011docker 在后台的标准运行过程:
(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
(2)利用镜像创建并启动一个容器;
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
(5)分配一个地址池中的IP地址给容器;
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。
总结
以上是生活随笔为你收集整理的初识docker容器(优势真的巨大,比虚拟机好用多了)的全部内容,希望文章能够帮你解决所遇到的问题。
- 上一篇: 6.S081 附加Lab1 用户执行系统
- 下一篇: 电气工程毕业论文题目【415个】