Docker基础

  • Docker概述
    • Linux 容器的具体实现方式
      • namespace机制
      • cgroup技术
    • 使用Docker的优势
  • Docker的架构
    • Docker组件
      • Docker镜像和容器
  • Docker安装
    • 阿里云镜像加速
    • 分析docker helloworld流程
  • Docker底层原理

Docker概述

  • Docker是基于Go语言开发的,官网地址和文档地址

  • Docker基于容器技术的轻量级虚拟化解决方案

  • Docker是容器引擎,把Linux的cgroupnamespace等容器底层技术进行封装抽象为用户提供了创建和管理容器的便捷界面(包括命令行和API)

  • Docker是一个开源项目,诞生于2013年初,基于Google公司推出的Go语言实现

  • 微软,红帽Linux,IBM,Oracle等主流IT厂商已经在自己的产品里增加对Docker的支持

  • 相比其他早期的容器技术,Docker引入了一整套容器管理的生态系统,包括分层的镜像模型,容器注册库,友好的Rest API

Linux 容器的具体实现方式

一个“容器”,实际上是一个由Linux Namespace、Linux Cgroups 和 rootfs 三种技术构建出来的进程的隔离环境。

  1. Namespace 的作用是“隔离”,它让应用进程只能看到该 Namespace 内的“世界”;修改进程视图的主要方法
  2. Cgroups 的作用是“限制”,它给这个“世界”围上了一圈看不见的墙。制造约束的主要手段
  3. 一组联合挂载在 /var/lib/docker/aufs/mnt 上的 rootfs,这一部分我们称为“容器镜像”(Container Image),是容器的静态视图;一个由 Namespace+Cgroups 构成的隔离环境,这一部分我们称为“容器运行时”(Container Runtime),是容器的动态视图。

namespace机制

在容器中看到只有自己一个进程 ,但是这个进程其实是在宿主机上的 只不过是一个独立的namespace

定义了5个命名空间结构体,多个进程可以使用同一个namespace

  1. UTS: 运行内核的名称、版本、底层体系结构类型等信息(UNIX Timesharing System)
  2. IPC: 与进程间通信(IPC)有关
  3. MNT: 已经装载的文件系统的视图 Mount Namespace,用于让被隔离进程只看到当前 Namespace 里的挂载点信息
  4. PID:有关进程ID的信息
  5. NET:网络相关的命名空间参数 Network Namespace,用于让被隔离进程看到当前 Namespace 里的网络设备和配置。

在 Linux 内核中,有很多资源和对象是不能被 Namespace 化的,最典型的例子就是:时间

cgroup技术

Linux Cgroups 就是 Linux 内核中用来为进程设置资源限制的一个重要功能。

  • Linux Cgroups 的全称是 Linux Control Group。它最主要的作用,就是限制一个进程组能够使用的资源上限,包括 CPU、内存、磁盘、网络带宽等等。
  • 此外,Cgroups 还能够对进程进行优先级设置、审计,以及将进程挂起和恢复等操作
  • 一个正在运行的 Docker 容器,其实就是一个启用了多个 Linux Namespace 的应用进程,而这个进程能够使用的资源量,则受 Cgroups 配置的限制。这也是容器技术中一个非常重要的概念,即:容器是一个单进程模型。
  • centos ubuntu等本来就是用的相同的linux内核,但是其他操作系统的一些可执行文件等等就是各个linux发行版不同的地方了。

Cgroups技术针对进程而言的,在centos7系统上,可以通过以下方式来实现对进程的资源限制:

while :;do :;done &
[1] 2702
pidstat -u -p 2702 2  # 未加cgroups限制下,跑满单个CPU核心
11:09:54 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
11:09:56 AM     0      2702   99.50    0.00    0.00   99.50     4  bash
11:09:58 AM     0      2702  100.00    0.00    0.00  100.00     4  bash
11:10:00 AM     0      2702  100.00    0.00    0.00  100.00     4  bashmount -t cgroup # 查看当前cgroups路径
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)mkdir /sys/fs/cgroup/cpu/loop
cat /sys/fs/cgroup/cpu/loop/cpu.cfs_quota_us
-1cat /sys/fs/cgroup/cpu/loop/cpu.cfs_period_us
100000echo 10000 >/sys/fs/cgroup/cpu/loop/cpu.cfs_quota_us  # CPU时间限制在20%echo 2702 > /sys/fs/cgroup/cpu/loop/tasks # 指定限制的进程PIDpidstat -u -p 2702 2
Linux 3.10.0-862.el7.x86_64 (centos-82)     03/02/2019  _x86_64_    (8 CPU)
11:16:37 AM   UID       PID    %usr %system  %guest    %CPU   CPU  Command
11:16:39 AM     0      2702   10.50    0.00    0.00   10.50     4  bash
11:16:41 AM     0      2702   10.00    0.00    0.00   10.00     4  bash
11:16:43 AM     0      2702    9.50    0.00    0.00    9.50     4  bash
11:16:45 AM     0      2702    9.95    0.00    0.00    9.95     4  bash已经将cpu使用率限制到了20%

使用Docker的优势

DevOps 开发运维一体化

  • 应用更快速的交付和部署

    • 传统:一堆帮助文档,安装程序
    • Docker:打包镜像,发布测试,一键运行
  • 更便捷的升级和扩缩容

    • 使用Docker之后,我们部署应用就特别方便
    • 还有升级服务等等,如需要升级SpringBoot,Redis,Tomcat,以前我们只能一个一个升级,有了docker可以将所有服务打成一个包,一起升级
    • 将项目打包成一个镜像,当水平扩展的时候,将服务器A的环境和服务直接打包成镜像,在服务器B上一键运行
  • 更简单的系统运维

    • 在容器化之后,我们的开发、测试环境都是高度一致的
  • 更高效的计算资源利用

    • Docker是内核级别的虚拟化,可以在一个物理机上运行很多个容器实例,服务器的性能能够被利用到极致

Docker的架构

Docker组件

  • Docker服务有三个部分组成,分别是Client,Docker Host,Registry(仓库)。Docker Host又包含Containers(容器)和Images(镜像)

  • 当创建新的容器时,会向Docker Daemon发送指令,Docker Daemon通过本地镜像文件创建容器,当本地不存在镜像时,将从Registry下载镜像。

  • Registry由两个部分组成:

    • Repostitory

      • 由特定的docker镜像的所有迭代版本组成一个镜像仓库
      • 一个Registry可以包括多个Repostitory
      • Repostitory包含顶层仓库和用户仓库
        • 顶层仓库: 仓库名:标签, nginx:latest
        • 用户仓库: 用户名/仓库名:标签, maomao/nginx:1.4.2
      • 一个镜像可以有多个标签,如最新版的nginx,可以是nginx:latest,nginx:1.4.2
    • Index
      • 提供用户认证、镜像检索功能

Docker镜像和容器

Docker镜像

  • 左边的是多个只读层,他们相互堆叠在一起。除了最下层之外,其它每一层都会有一个指针指向下一层。这些层是Docker内部的实现细节,并且能够在宿主机的文件系统上访问到。
  • 统一文件系统(union file system,aufs)技术(新版用overlay2)能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。我们可以在图片的右边看到这个视角的形式。
  • 每一层都包含了当前层的ID,Metadata,Pointer(指向上一层)三层,最底层不包含Pointer。
  • docker镜像就好比是一个模板,可以通过这个模板来创建容器服务,比如一个tomcat镜像 ==> 启动(run) >tomcat01 容器(提供服务器),通过这个镜像可以创建多个容器(最终服务运行或者项目运行,就是在容器中)

Docker容器

  • Docker容器包含静止状态和运行状态两种,这两种状态下的层级不一样。
  • 静态状态的容器仅仅是在镜像状态下增加一个可读写的层级,运行状态中的容器包含了进程和对应的进程空间:

  • Docker利用容器技术,独立运行一个或者一个组应用,通过镜像来创建的。
  • 可以简单的把容器理解为一个简易的linux系统

Docker仓库

  • 仓库就是存放镜像的地方
  • 仓库分为公有仓库和私有仓库
    • Docker Hub(默认国外i的)
    • 阿里云(配置镜像加速)

Docker安装

查看内核 系统最好是3.10以上
uname -r
3.10.0-862.el7.x86_64卸载旧的版本
[root@docker ~]# yum remove docker \
>                   docker-client \
>                   docker-client-latest \
>                   docker-common \
>                   docker-latest \
>                   docker-latest-logrotate \
>                   docker-logrotate \
>                   docker-engine安装需要的安装包
yum install -y yum-utils设置镜像仓库
我们用阿里云yum-config-manager \--add-repo \http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo更新yum软件包索引
yum makecache fast安装docker  docker-ce 社区
yum -y install docker-ce docker-ce-cli containerd.io启动docker
systemctl start docker查看版本
docker versionClient: Docker Engine - CommunityVersion:           20.10.6API version:       1.41Go version:        go1.13.15Git commit:        370c289Built:             Fri Apr  9 22:45:33 2021OS/Arch:           linux/amd64Context:           defaultExperimental:      trueServer: Docker Engine - CommunityEngine:Version:          20.10.6API version:      1.41 (minimum version 1.12)Go version:       go1.13.15Git commit:       8728dd2Built:            Fri Apr  9 22:43:57 2021OS/Arch:          linux/amd64Experimental:     falsecontainerd:Version:          1.4.4GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8erunc:Version:          1.0.0-rc93GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdecdocker-init:Version:          0.19.0GitCommit:        de40ad0执行hello-world
docker run hello-world第一步寻找本地镜像 没有找到helloword的镜像
Unable to find image 'hello-world:latest' locally
第二步从library拉取镜像
latest: Pulling from library/hello-world
b8dfde127a29: Pull complete
Digest: sha256:f2266cbfc127c960fd30e76b7c792dc23b588c0db76233517e1891a4e357d519
Status: Downloaded newer image for hello-world:latest拉去完成之后 显示Hello from Docker!
Hello from Docker!说明安装成功
查看一下下载的hello-world镜像docker imagesREPOSITORY    TAG       IMAGE ID       CREATED       SIZE
hello-world   latest    d1165f221234   6 weeks ago   13.3kB

了解:卸载docker

卸载依赖
yum remove docker-ce docker-ce-cli containerd.io删除资源
rm -rf /var/lib/docker/var/lib/docker 是docker默认的工作路径

阿里云镜像加速

mkdir -p /etc/docker这个是我自己阿里云的加速 每个人都不一样 可以去阿里云官方查看tee /etc/docker/daemon.json <<-EOF{"registry-mirrors": ["https://m0rsqupc.mirror.aliyuncs.com"]}
EOF{"registry-mirrors": ["https://m0rsqupc.mirror.aliyuncs.com"]
}systemctl daemon-reload
systemctl restart docker

查看docker信息

查看信息
docker infoClient:Debug Mode: falseServer:Containers: 1     容器数量Running: 0Paused: 0Stopped: 1Images: 1          镜像数量Server Version: 20.10.6 server版本Storage Driver: overlay2Backing Filesystem: xfs 宿主机上的底层文件系统Supports d_type: trueNative Overlay Diff: trueuserxattr: falseLogging Driver: json-fileCgroup Driver: cgroupfs   Cgroups 驱动Cgroup Version: 1Plugins:Volume: localNetwork: bridge host ipvlan macvlan null overlayLog: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslogSwarm: inactiveRuntimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runcDefault Runtime: runcInit Binary: docker-initcontainerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8erunc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdecinit version: de40ad0Security Options:seccompProfile: defaultKernel Version: 3.10.0-862.el7.x86_64      宿主机的相关信息Operating System: CentOS Linux 7 (Core)OSType: linuxArchitecture: x86_64CPUs: 4Total Memory: 3.842GiBName: dockerID: E6Z7:MKAH:5EFQ:I2ZA:V6UG:VB4G:AXDU:ALKF:U4ZX:OYWC:7MKF:ZGLVDocker Root Dir: /var/lib/docker        docker 数据存储目录Debug Mode: falseRegistry: https://index.docker.io/v1/   registry 地址Labels:Experimental: falseInsecure Registries:127.0.0.0/8Registry Mirrors:     加速站点https://m0rsqupc.mirror.aliyuncs.com/Live Restore Enabled: false

分析docker helloworld流程

  1. docker run hello-world 回车启动
  2. docker会在本机寻找镜像,判断本机是否有这个镜像
    1. 如果有 就使用这个镜像运行
    2. 如果没有 就去仓库下载
      1. 如果在仓库找不到镜像则返回错误
      2. 如果找到镜像,则下载镜像到本地,接着运行

Docker底层原理

Docker是怎么工作的?

  • Docker是一个 Client-Server 结构的系统,Docker的守护进程运行在主机上,通过Sockte从客户端访问
  • DockerServer 接收到 Docker-Client 的指令,就会执行这个命令

    Docker为什么比vm快?
  1. Docker有着比虚拟机更少的抽象层
  2. Docker利用的是宿主机的内核,vm需要是Guest OS
  • 所以说,我们新建一个容器的时候,docker不需要像vm虚拟机一样重新加载一个操作系统内核,避免引导操作
  • 虚拟机加载Guest OS 启动是分钟级别的
  • 而Docker是利用宿主机的操作系统。省略了这个复杂的过程,启动是秒级的。

Docker——Docker的基础和安装相关推荐

  1. docker基础——关于安装、常用指令以及镜像制作初体验

    为什么使用docker docker就是一个轻量级的虚拟机,他解决的是服务迁移部署的时候环境配置问题.比如常见的web服务依赖于jdk.Tomcat.数据库等工具,迁移项目就需要在新的机器重新配置这些 ...

  2. Docker基础之安装部署

    1.查看linux系统环境 #内核3.10以上 [root@centos ~]# uname -r 3.10.0-1160.71.1.el7.x86_64#系统版本 [root@centos ~]# ...

  3. 在虚拟机安装中Docker及一些基础命令

    一.安装 yum -y update yum install -y docker docker version 查看docker版本信息 安装成功如上图. 二.基础命令 1.docker pull 镜 ...

  4. Docker | Docker技术基础梳理(五) - Docker网络管理

    Docker | Docker技术基础梳理(五) - Docker网络管理 链接: 原文链接 原文链接: https://gitbook.cn/books/5b8f3c471966b44b00d265 ...

  5. Docker学习(3)——安装部署过程及简单应用

    一. Docker的部署与安装 1.安装docker和相关依赖性 [root@server1 docker]# ls container-selinux-2.21-1.el7.noarch.rpm d ...

  6. Docker系列 一. CentOS上安装Docker

    1.环境&工具: 阿里云轻量级服务器.Centos7系统.FinalShell(其他连接客户端也可以) 2.步骤: 2.1 安装docker 2.1.1 以root身份登录服务器 2.1.2查 ...

  7. Docker的简单介绍与安装(Windows10)

    目录 1.什么是Docker 2.Docker的应用场景 3.Docker 的优点 4.Docker 架构 5.Doker安装 Win10 系统 开启 Hyper-V 1.安装 Toolbox 2.运 ...

  8. docker停止容器后配置_整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划...

    作者 | IronmanJay 责编 | 王晓曼 出品 | CSDN博客 Docker 基础介绍 下图为 Docker 图标(是一个鲸鱼上面是集装箱). 1.我们为什么要使用Docker 当我们在工作 ...

  9. 整理了一份 Docker系统知识,从安装到熟练操作看这篇就够了 | 原力计划

    作者 | IronmanJay 责编 | 王晓曼 出品 | CSDN博客 Docker 基础介绍 下图为 Docker 图标(是一个鲸鱼上面是集装箱). 1.我们为什么要使用Docker 当我们在工作 ...

最新文章

  1. 编程入门python语言是多大孩子学的-不学点编程,将来怎么给孩子辅导作业―Python新手入门教程...
  2. 14. Java基础之泛型
  3. 《R语言实战》第4章
  4. php 存储多选项_php高并发之opcache详解
  5. 又到 6 月底,想来和你聊一聊毕业季,愿你前程似锦!
  6. sparksql(2)——dataframe的ap-printSchema、withColum、count、drop、describe、select
  7. 机器视角:长文揭秘图像处理和卷积神经网络架构
  8. BZOJ3139: [Hnoi2013]比赛
  9. Java定时器quartz停止
  10. rails mysql优化_Ruby on Rails中的MySQL性能
  11. android弹幕控件,可能是目前轻量级弹幕控件中功能最强大的一款
  12. linux如何设置root权限,linux设置root权限的方法
  13. 第十章:如何制定项目目标?
  14. Show一下拿的奖杯
  15. JS(JQ)实现table表格固定表头且表头可以随横向滚动而滚动
  16. vivado 2021.2下载安装兼容的matlab
  17. 替换空格--《剑指offer》
  18. 基于 Flink 构建关联分析引擎的挑战和实践
  19. 百趣代谢组学分享:从SWATH到MRM:一种新型高覆盖度靶向代谢组学技术
  20. 谷歌开放生成式AI Bard,百度文心一言《唐伯虎点秋香》出圈

热门文章

  1. c语言程序整数划分源代码,C语言实现整数划分问题
  2. 派克Parker防爆伺服电机与普通伺服电机区别
  3. 将指定页面横屏 landScape
  4. OBS云插件,智播,智慧主播最佳选择
  5. python自定义windowsr日志支持文件分割
  6. 亚马逊测评成号率会高吗?亚马逊测评技术IP详解篇
  7. 清华 计算机文化基础精品课,Visual C++视频教程 72个文件 清华大学 精品课程
  8. 2020.6.3 东莞信息技术特长生 总结
  9. 四旋翼无人机建模与实现(二)
  10. 中小企业在管理中常见的几大问题