2-1-docker基础

熊 0 阅读 容器

1. 什么是Docker

Docker ( 码头工人)是一个开源项目 , 诞生于 2013 年初 , 最初是 dotCloud 公司(后由于 Docker 开源后大受欢迎就将公司改名为 Docker Inc , 总部位于美国加州的旧金山)内部的一个开源的PAAS服务 (Platform as a ServiceService ) 的业余项目。它基于 Google 公司推出的 Go 语言实现。 项目后来加入了Linux基金会 , 遵从了Apache 2.0协议 , 项目代码在GitHub 上进行维护。

Docker是基于linux内核实现 , Docker最早采用LXC技术 , LXC 是Linux原生支持的容器技术 , 可以提供轻量级的虚拟化 , 可以说 docker就是基于 LXC 发展起来的 , 提供LXC的高级封装 , 标准的配置方法 , 在LXC的基础之上 , docker提供了一系列更强大的功能。而虚拟化技术 KVM(KernelKernel-based Virtual Machine ) 基于 模块实现 , 后来Docker 改为自己研发并开源的runc 技术运行容器, 彻底抛弃了LXC。

Docker 相比虚拟机的交付速度更快 , 资源消耗更低 , Docker 采用客户端/服务端架构 , 使用远程API来管理和创建容器 , 其可以轻松的创建一个轻量级的、可移植的、自给自足的容器 , docker的三大理念是build(构建)、ship(运输)、 run(运行) , Docker遵从apache 2.0协议 , 并通过(namespace及cgroup等)来提供容器的资源隔离与安全保障等 , 所以Docker容器在运行时不需要类似虚拟机(空运行的虚拟机占用物理机6-8%性能)的额外资源开销 , 因此可以大幅提高资源利用率,总而言之Docker是一种用了新颖方式实现的轻量级虚拟机.类似于VM但是在原理和应用上和VM的差别还是很大的 , 并且docker的专业叫法是应用容器(Application Container)。

2. Docker的组成

Docker经典入门学习教程插图(1)

Docker经典入门学习教程插图(2)

  • Docker主机(Host) : 一个物理机或虚拟机 , 用于运行Docker服务进程和容器 , 也称为宿主机 、node节点

  • Docker服务端(Server) : Docker守护进程 , 运行docker容器

  • Docker客户端(Client) : 客户端使用docker 命令或其他工具调用docker API

  • Docker仓库(Registry): 保存镜像的仓库 , 官方仓库: https://hub.docker.com/, 可以搭建私有仓库harbor。类似于git或svn这样的版本控制系统。

  • Docker镜像(Images) : 镜像可以理解为创建实例使用的模板

  • Docker容器(Container): 容器是从镜像生成对外提供服务的一个或一组服务

Docker经典入门学习教程插图(3)

3. Docker 和虚拟机, 物理主机

Docker经典入门学习教程插图(4)

容器和虚拟机比较

docker和vm

  • 资源利用率更高 : 一台物理机可以运行数百个容器, 但是一般只能运行数十个虚拟机

  • 开销更小 : 不需要启动单独的虚拟机OS内核占用硬件资源

  • 启动速度更快 : 可以在数秒内完成启动

  • 集成性更好 : 和CI/CD ( 持续集成/持续部署 ) 相关技术结合性更好, 实现自动化

Docker经典入门学习教程插图(6)

使用虚拟机是为了更好的实现服务运行环境隔离, 每个虚拟机都有独立的内核, 虚拟化可以实现不同操作系统的虚拟机 , 但是通常一个虚拟机只运行一个服务, 很明显资源利用率比较低且造成不必要的性能损耗, 我们创建虚拟机的目的是为了运行应用程序, 比如Nginx、PHP、Tomcat等web程序, 使用虚拟机无疑带来了一些不必要的资源开销, 但是容器技术则基于减少中间运行环节带来较大的性能提升。

根据实验, 一个运行着CentOS的KVM虚拟机启动后, 在不做优化的情况下, 虚拟机自己就需要占用100~200 MB内存。此外 , 用户应用运行在虚拟机里面 , 它对宿主机操作系统的调用就不可避免地要经过虚拟化软件的拦截和处理, 这本身又是一层性能损耗, 尤其对计算资源、网络和磁盘I/O的损耗非常大。

比如 : 一台96G内存的物理服务器, 运行java程序的虚拟机一般分配8G内存/4核的资源, 只能运行13台左右虚拟机, 但是改为运行docker容器每个容器分配4G内存, 就可以运行25个左右容器, 运行数量相当于提高一倍, 可以大幅节省IT支出, 通常情况下至少可以节约一半以上的物理设备

LXC可以在操作系统层次上为进程提供虚拟的执行环境 , 一个虚拟的执行环境就是一个容器, 同时可以为容器绑定特定的cpu和memory节点, 分配特定比例的cpu时间、IO时间, 限制可以使用的内存大小 ( 包括内存和是swap空间 ) , 提供device访问控制, 提供独立的namespace ( 网络、pid、ipc、mnt、uts ) 。

LXC主要包含三个方面 : cgroup、network和rootfs。

Cgroups是control groups的缩写, 是Linux内核提供的一种可以限制、记录、隔离进程组 ( process groups ) 所使用的物理资源 ( 如 : cpu,memory,IO等等 ) 的机制。LXC主要通过cgroup实现对于资源的管理和控制。

Network是为容器提供的网络环境设置。

rootfs用于指定容器的虚拟根目录, 设定此项以后, 容器内所有进程将会把此目录根目录, 不能访问此目录之外的路径, 相当于chroot的效果。

Docker的优势

  • 快速部署 : 短时间内可以部署成百上千个应用 , 更快速交付到线上

  • 高效虚拟化 : 不需要额外hypervisor支持 , 基于linux内核实现应用虚拟化 , 相比虚拟机大幅提高性能和效率

  • 节省开支 : 提高服务器利用率 , 降低IT支出

  • 简化配置 : 将运行环境打包保存至容器 , 使用时直接启动即可

  • 环境统一 : 将开发 , 测试 , 生产的应用运行环境进行标准化和统一 , 减少环境不一样带来的各种问题

  • 快速迁移和扩展 : 可实现跨平台运行在物理机、虚拟机、公有云等环境 , 良好的兼容性可以方便将应用从A宿主机迁移到B宿主机 , 甚至是A平台迁移到B平台

Docker的缺点

  • 隔离性 : 多个容器共用宿主机的内核 , 各应用之间的隔离不如虚拟机彻底

4. docker 核心技术

4.1 容器规范

容器技术除了的docker之外, 还有coreOS的rkt , 还有阿里的Pouch , 为了保证容器生态的标准性和健康可持续发展 , 包括Linux 基金会、Docker、微软、红帽谷歌和、IBM、等公司在2015年6月共同成立了一个叫open container(OCI)的组织 , 其目的就是制定开放的标准的容器规范 , 目前OCI一共发布了两个规范 , 分别是runtime spec和 image format spec , 有了这两个规范 , 不同的容器公司开发的容器只要兼容这两个规范 , 就可以保证容器的可移植性和相互可操作性。

4.2 容器runtime

runtime是真正运行容器的地方 , 因此为了运行不同的容器runtime需要和操作系统内核紧密合作相互在支持 , 以便为容器提供相应的运行环境

目前主流的三种runtime :

Lxc : linux上早期的runtime , Docker早期就是采用lxc作为runtime

runc : 目前Docker默认的runtime , runc遵守OCI规范 , 因此可以兼容lxc

rkt : 是CoreOS开发的容器runtime , 也符合OCI规范 , 所以使用rkt runtime也可以运行Docker容器

[root@localhost ~]# docker info
Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Build with BuildKit (Docker Inc., v0.5.1-docker)
  scan: Docker Scan (Docker Inc.)
​
Server:
 Containers: 8
  Running: 0
  Paused: 0
  Stopped: 8
 Images: 6
 Server Version: 20.10.6
 Storage Driver: overlay2
  Backing Filesystem: xfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: cgroupfs
 Cgroup Version: 1
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runtime.v1.linux runc io.containerd.runc.v2
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: 05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc version: 12644e614e25b05da6fd08a38ffa0cfe1903fdec
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
 Kernel Version: 3.10.0-957.el7.x86_64
 Operating System: CentOS Linux 7 (Core)
 OSType: linux
 Architecture: x86_64
 CPUs: 16
 Total Memory: 15.39GiB
 Name: localhost.localdomain
 ID: MMGL:O7T5:5TPY:FUIW:CNQJ:R7SV:YBFJ:MELZ:UBRB:MSJT:NKXS:3HIF
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Username: xiong888
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: false
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

4.3 容器管理工具

管理工具连接runtime与用户 , 对用户提供图形或命令方式操作 , 然后管理工具将用户操作传递给runtime执行。

lxc是lxd的管理工具

Runc的管理工具是docker engine , docker engine包含后台deamon和cli两部分, 大家经常提到的Docker就是指的docker engine

Rkt的管理工具是rkt cli

范例 : 查看docker engine

[root@localhost ~]# docker version
Client: Docker Engine - Community
 Version:           20.10.6
 API version:       1.41
 Go version:        go1.13.15
 Git commit:        370c289
 Built:             Fri Apr  9 22:45:33 2021
 OS/Arch:           linux/amd64
 Context:           default
 Experimental:      true
​
Server: Docker Engine - Community
 Engine:
  Version:          20.10.6
  API version:      1.41 (minimum version 1.12)
  Go version:       go1.13.15
  Git commit:       8728dd2
  Built:            Fri Apr  9 22:43:57 2021
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.4.4
  GitCommit:        05f951a3781f4f2c1911b05e61c160e9c30eaa8e
 runc:
  Version:          1.0.0-rc93
  GitCommit:        12644e614e25b05da6fd08a38ffa0cfe1903fdec
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

4.4 容器定义工具

容器定义工具允许用户定义容器的属性和内容 , 以方便容器能够被保存、共享和重建。

Docker image : 是docker容器的模板 , runtime依据docker image创建容器。

Dockerfile : 包含N个命令的文本文件 , 通过dockerfile创建出docker image。

ACI(App container image) : 与docker image类似 , 是CoreOS开发的rkt容器的镜像格式

4.5 Registry

统一保存镜像而且是多个不同镜像版本的地方, 叫做镜像仓库。

Docker hub : docker官方的公共仓库 , 已经保存了大量的常用镜像, 可以方便大家直接使用阿里云, 网易等第三方镜像仓库

Image registry : docker 官方提供的私有仓库部署工具, 无web管理界面, 目前使用较少

Harbor : vmware 提供的自带web界面自带认证功能的镜像仓库 , 目前有很多公司使用

范例 : 镜像地址格式

172.18.200.101/project/centos:7.2.1511
172.18.200.101/project/centos: latest
172.18.200.101/project/java-7.0.59:v1
172.18.200.101/project/java-7.0.59:v2

4.6 编排工具

当多个容器在多个主机运行的时候 , 单独管理容器是相当复杂而且很容易出错 , 而且也无法实现某一台主机宕机后容器自动迁移到其他主机从而实现高可用的目的 , 也无法实现动态伸缩的功能 , 因此需要有一种工具可以实现统一管理、动态伸缩、故障自愈、批量执行等功能, 这就是容器编排引擎。

容器编排通常包括容器管理、调度、集群定义和服务发现等功能。

Docker swarm : docker 开发的容器编排引擎。

Kubernetes : google领导开发的容器编排引擎 , 内部项目为Borg , 且其同时支持docker和CoreOS

Mesos+Marathon : Mesos是Apache下的开源分布式资源管理框架 , 它被称为是分布式系统的内核。Mesos最初是由加州大学伯克利分校的AMPLab开发的 , 后在Twitter得到广泛使用。通用的集群组员调度平台 , mesos(资源分配)与marathon(容器编排平台)一起提供容器编排引擎功能。

5 容器依赖技术

容器网络 : docker自带的网络docker network仅支持管理单机上的容器网络, 当多主机运行的时候需要使用第三方开源网络 , 例如calico、flannel等。

服务发现 : 容器的动态扩容特性决定了容器IP也会随之变化 , 因此需要有一种机制开源自动识别并将用户请求动态转发到新创建的容器上 , kubernetes自带服务发现功能 , 需要结合kube-dns服务解析内部域名。

容器监控 : 可以通过原生命令docker ps/top/stats 查看容器运行状态 , 另外也可以使Prometheus 、heapster等第三方监控工具监控容器的运行状态

数据管理 : 容器的动态迁移会导致其在不同的Host之间迁移 , 因此如何保证与容器相关的数据也能随之迁移或随时访问 , 可以使用逻辑卷/存储挂载等方式解决

日志收集 : docker 原生的日志查看工具docker logs , 但是容器内部的日志需要通过ELK等专门的日志收集分析和展示工具进行处理

6. docker管理命令

  • docker info : 显示Docker系统信息,包括镜像和容器数

    • 语法 : docker info [OPTIONS]

    • OPTIONS

      • -f : 使用给定的模板格式化输出(一般不用)

    [root@centos7 ~]# docker info
    Client: Docker Engine - Community
     Version:    24.0.2
     Context:    default
     Debug Mode: false
     Plugins:
      buildx: Docker Buildx (Docker Inc.)
        Version:  v0.10.5
        Path:     /usr/libexec/docker/cli-plugins/docker-buildx
      compose: Docker Compose (Docker Inc.)
        Version:  v2.18.1
        Path:     /usr/libexec/docker/cli-plugins/docker-compose
    ​
    Server:
     Containers: 4
      Running: 1
      Paused: 0
      Stopped: 3
     Images: 4
     Server Version: 24.0.2
     Storage Driver: overlay2
      Backing Filesystem: xfs
      Supports d_type: true
      Using metacopy: false
      Native Overlay Diff: true
      userxattr: false
     Logging Driver: json-file
     Cgroup Driver: cgroupfs
     Cgroup Version: 1
     Plugins:
      Volume: local
      Network: bridge host ipvlan macvlan null overlay
      Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
     Swarm: inactive
     Runtimes: io.containerd.runc.v2 runc
     Default Runtime: runc
     Init Binary: docker-init
     containerd version: 3dce8eb055cbb6872793272b4f20ed16117344f8
     runc version: v1.1.7-0-g860f061
     init version: de40ad0
     Security Options:
      seccomp
       Profile: builtin
     Kernel Version: 3.10.0-1160.el7.x86_64
     Operating System: CentOS Linux 7 (Core)
     OSType: linux
     Architecture: x86_64
     CPUs: 2
     Total Memory: 1.777GiB
     Name: centos7
     ID: ae0ab687-dada-4545-8b91-1a276c4c92cf
     Docker Root Dir: /var/lib/docker
     Debug Mode: false
     Experimental: false
     Insecure Registries:
      127.0.0.0/8
     Live Restore Enabled: false
    • Client:docker客户端信息

    • Server:docker服务端信息

    • Containers:容器数量

    • Images:镜像数量

    • Server Version:docker版本

    • Docker Root Dir:docker根目录

    • Registry Mirrors:当前使用的镜像源

  • docker version : 显示 Docker 版本信息

    • 语法 : docker version [OPTIONS]

    [root@centos7 ~]# docker version
    Client: Docker Engine - Community
     Version:           24.0.2
     API version:       1.43
     Go version:        go1.20.4
     Git commit:        cb74dfc
     Built:             Thu May 25 21:55:21 2023
     OS/Arch:           linux/amd64
     Context:           default
    ​
    Server: Docker Engine - Community
     Engine:
      Version:          24.0.2
      API version:      1.43 (minimum version 1.12)
      Go version:       go1.20.4
      Git commit:       659604f
      Built:            Thu May 25 21:54:24 2023
      OS/Arch:          linux/amd64
      Experimental:     false
     containerd:
      Version:          1.6.21
      GitCommit:        3dce8eb055cbb6872793272b4f20ed16117344f8
     runc:
      Version:          1.1.7
      GitCommit:        v1.1.7-0-g860f061
     docker-init:
      Version:          0.19.0
      GitCommit:        de40ad0
    ​

    可以看到Docker Client、Docker Server的信息


参考链接

运维派:docker教程:Docker经典入门学习教程

segmentfault:public0821:Linux文件系统之aufs

https://zhangchenchen.github.io/2018/03/09/record-for-docker-storage-driver/

COOLSHELL- 陈皓-DOCKER基础技术 : AUFS

微信公众号: 潍鲸: Docker 文件存储驱动 AUFS

CSDN:Max_Cong : docker 存储驱动 ( 一 ) ---- overlay2