欢迎访问 生活随笔!

生活随笔

当前位置: 首页 >

初识docker容器(优势真的巨大,比虚拟机好用多了)

发布时间:2024/3/24 56 豆豆
生活随笔 收集整理的这篇文章主要介绍了 初识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通过引入操作系统的 CgroupsNamespace 等机制,从而来为每个应用单独创建一个叫做「沙盒」的隔离环境,然后在这些「沙盒」中启动应用,通过这样的方法就让虚拟机中应用各自互不干扰,让其自由翱翔,至于 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和虚拟化比有什么优势

不同点containerVM
启动速度秒级分钟级
运行性能接近原生(直接在内核中运行)50%左右损失
磁盘占用MBGB
数量成百上千一般十几台
隔离性进程级别系统级别(更彻底)
操作系统主要支持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 1234567891011121314151617181920212223242526272829303132333435

PS
docker-server 端配置文件 daemon.json

#生产配置示例,在 daemon.json 中定义 {"graph": "/data/docker","storage-driver": "overlay2","insecure-registries": ["registry.access.redhat.com","quary.io"]"registry-mirrors": ["https://q"]"bip": "172.7.5.1/24","exec-opts": ["native.cgroupdriver=systemd"],"live-restore": true }#参数说明 "graph": "/data/docker", #指定数据目录 "storage-driver": "overlay2", #指定存储引擎 "insecure-registries": ["registry.access.redhat.com","quary.io"] #私有仓库 "registry-mirrors": ["https://q"] #配置镜像加速 "bip": "172.7.5.1/24", #docker 网络,中间两位建议和宿主机一样,容器有问题好定位在哪个宿主机 "exec-opts": ["native.cgroupdriver=systemd"], #启动时候的额外参数(驱动,k8s使用) "live-restore": true #当docker容器引擎挂掉的时候,使用docker跑起来的容器还能运行(分离) 12345678910111213141516171819

五、Docker 镜像与容器命令管理

5.1 镜像命令管理

PS:

  • docker client 客户端连接到了服务端(服务端是以一个守护进程的形式跑在操作系统里面的)restful api 典型的 C/S 架构
  • 由 docker 服务端的守护进程从 docker hub 上下载了镜像(PS:服务端会先检查本地系统是否有这个镜像)
  • 服务端创建了一个新的容器,然后从拉去的这个镜像启动了一个容器,容器执行了脚本/可执行程序让我们可以查看/使用
  • docker 服务端把这些信息流(传递)返回到客户端并展示出来(展示在终端上)
#查询 docker 版本和信息 docker version docker info#搜索镜像(可以自己制作镜像上传本地或官网仓库 dockerfile) docker search <镜像名>#下载镜像 docker pull <镜像名>#查看镜像列表 docker images#查看镜像详细信息 docker inspect <镜像 ID>#给镜像打标签 docker tag <镜像名>:<原标签> <镜像名>:<新标签> #docker tag nginx:latest nginx:lnmp#删除镜像 docker rmi <镜像名> docker rmi <镜像标签> docker rmi <镜像 ID> docker rmi `docker images -aq` #删除所有镜像 docker images | awk 'NR>=2{print "docker rmi -f "$3}' | bash#镜像导出 docker save -o <导出的文件名> <镜像名> #docker save -o nginx_v1 nginx:latest#镜像导入 docker load < [镜像文件] #docker load < nginx_v1 12345678910111213141516171819202122232425262728293031323334

5.2 容器命令管理


#查询容器 docker ps -a#查看容器占用系统资源信息 docker stats#创建容器 docker create -it nginx:latest /bin/bash #常用参数说明 > -i 让容器的标准输入保持打开 > -t 分配一个伪终端 > -d 以后台守护进程的方式运行#开启/停止/重启 容器 docker start <容器 ID> docker stop <容器 ID> docker restart <容器 ID>#后台运行,指定容器名称为 test docker run -itd --name test nginx:latest /bin/bash#进入容器 docker exec -it <容器 ID> /bin/bash #exit 退出#容器 导出/导入 docker export [容器 ID] > [文件名] docker import [容器文件名] [指定镜像名称] #导入的是镜像#批量停止容器 docker ps -a | awk 'NR>=2{print "docker stop "$1}' | bash docker ps -a | awk 'NR>=2{print $1}' | xargs docker stop#批量删除容器 docker rm -f `docker ps -aq` docker ps -a | awk 'NR>=2{print "docker rm "$1}' | bash docker ps -a | awk 'NR>=2{print $1}' | xargs docker rm -f#批量删除 "exit" 状态(指定状态)的容器 for i in `docker ps -a | grep -i exit | awk '{print $1}'`; do docker rm -f $i;done#查看容器进程号 docker inspect -f '{{.State.Pid}}' <容器名> docker inspect -f '{{.State.Pid}}' <容器 ID> 12345678910111213141516171819202122232425262728293031323334353637383940414243

容器与宿主机之间文件的复制

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 1234567891011

docker 在后台的标准运行过程:
(1)检查本地是否存在指定的镜像。当镜像不存在时,会从公有仓库下载;
(2)利用镜像创建并启动一个容器;
(3)分配一个文件系统给容器,在只读的镜像层外面挂载一层可读写层;
(4)从宿主主机配置的网桥接口中桥接一个虚拟机接口到容器中;
(5)分配一个地址池中的IP地址给容器;
(6)执行用户指定的应用程序,执行完毕后容器被终止运行。

总结

以上是生活随笔为你收集整理的初识docker容器(优势真的巨大,比虚拟机好用多了)的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。