0%

初识Docker

Docker

一、什么是Docker

Docker是开发,运行和部署应用程序的开放管理平台

  • 开发人员能利用docker开发和运行应用程序
  • 运维人员能利用docker部署和管理应用程序

二、为什么使用docker

  • Docker使您能够将应用程序与基础架构分开 以便您快速交付软件
  • 借助Docker 可以像管理应用程序一样管理基础架构
  • 通过利用Docker的方法快速进行运输 测试 和部署代码 可以显著缩短编写代码和在生产环境中运行代码之间的延迟
  • 如:
    • 开发人员在本地编写代码 可以使用Docker与同事进行共享 实现协同工作
    • 使用Docker开发完成程序 可以直接对应用程序执行自动和手动测试
    • 当开发人员发现错误或者BUG时,可以直接在开发环境中修复后 并迅速将他们重新部署到测试环境进行测试和验证
    • 利用Docker开发完成后 交付时 直接交付Ddock 也就意味着交付完成 后续如果有提供修补程序或者更新 需要推送到生成环境运行起来 也是一样的简单
  • Docker主要解决的问题:
    • 保证程序运行环境的一致性
    • 降低配置开发环境 生产环境的复杂度和成本
    • 实现程序的快速部署和分发

三、Docker整体结构了解

Docker引擎介绍(Docker Engine)

  • Docker Engine是一个包含以下组件的客户端-服务端(C/S)应用程序
    • 服务端:一个长时间运行的守护进程(Docker Daemon)
    • REST API:一套用于与Docker Daemon通信并指示其执行操作的接口
    • 客户端:命令执行接口CLI(Command Line Interface)
  • CLI利用Docker命令通过REST API 直接操控Docker Daemon执行操作
  • Docker Daemon负责创建并管理Docker的对象(镜像、容器、网络、数据卷)

Docker结构概览图

image-20221006171700496

Docker结构简介:

  • Docker客户端(Docker Client)
    • Docker客户端是用户与Docker进行交互的最主要方式。当在终端输入docker命令时 对应的就会在服务端产生对应的作用 并把结果返回给客户端 Docker Client除了连接本地服务端 通过更改或者指定DOCKET_HOST连接远程的服务端
  • Docker服务端(Docker Server)
    • Docker Daemon其实就是Docker的服务端 他负责监听Docker API请求(如:Docker Client)并管理Docker对象(Docker Object) 如镜像 容器 网络 数据卷等
  • Docker Registries
    • 俗称Docker仓库 专门用于存储镜像的云服务器环境
    • Docker Hub 就是一个公有的存放镜像的地方 类似GitHub存储代码文件 同样的也可以类似GitHub那样创建私有的仓库。
  • Docker 对象(Docker Objects)
    • 镜像:一个Docker的可执行文件 其中包括运行应用程序所需的所有代码内容 依赖库 环境变量和配置文件等
    • 容器:镜像被运行起来后的实例。
    • 网络:外部或者容器间如何相互访问的网络方式 如host、bridge模式
    • 数据卷:容器与宿主机之间、容器与容器之间共享存储方式,类似虚拟机与主机之间的共享文件目录。

Docker底层使用的技术介绍(一)

  • Docker使用Go语言实现

  • Docker利用Linux内核的几个特性来实现功能:

    • 利用Linux的命名空间(Namespaces)
    • 利用Linux的控制组(Control Groups)
    • 利用Linux的联合文件系统(Union Files Systems)

    这也就意味着Docker只能在Linux运行

    在windows、MacOS上运行Docker 其实本质上是借助了虚拟化技术 然后在Linux虚拟机上运行的Doc而程序

  • 容器格式:

    • Docker Engine将namespace、cgroups、UnionFS进行组合sss后的一个package,就是一个容器格式(Container Format)。Docker通过对这个package中的namespace、cgroups、UnionFS进行管理控制实现容器的创建和生命周期管理
    • 容器格式(Container Format)有多种,其中Docker目前使用的容器格式被称为libcontainer

Docker底层使用的技术介绍(二)

  • Namespace(命名空间):为Docker容器提供操作系统层面的隔离
    • 进程号隔离:每一个容器内运行的第一个进程,进程号总是从1开始算起
    • 网络隔离:容器的网络与宿主机或其他容器的网络是隔离的、分开的,也就是相当于两个网络
    • 进程间通隔离:容器中的进程与宿主机或其他容器中的进程是互不可见的,通信需要借助网络
    • 文件系统挂在隔离:容器拥有自己单独的工作目录
    • 内核以及系统版本号隔离:容器查看内核版本号或者系统版本号时,查看的是容器的而非宿主机的
  • Control Groups(控制组-cgroups):为Docker容器提供硬件层面的隔离
    • 控制组能控制应用程序所使用的硬件资源
    • 基于该性质 控制组帮助docker引擎将硬件资源共享给容器使用 并且加以约束和限制,如控制容器所使用的内存大小
  • Union File System(联合文件系统–UnionFS):利用分层(layer)思想管理镜像和容器

总结

  • 重点掌握Docker以下组件或对象直接的联系:
    • Docker Client CLI
    • Docker Daemon(Docker server)
    • Docker Object
    • Registry
  • 了解以下列出的DOK而使用的底层技术
    • Namespaces
    • Control Groups
    • Union File System
    • Container Format

Docker核心技术之镜像

镜像简介

  • 镜像是一个Docker的可执行文件,其中包括运行应用程序所需的所有代码内容、依赖库、环境变量和配置文件等
  • 通过镜像可以创建一个或多个容器

镜像管理

  • 作用:

    搜索Docker Hub(镜像仓库)上的镜像

  • 命令格式:

    docker search [OPTIONS] TERM

  • 命令参数(OPTIONS):

    • -f, –filter filter:根据提供的格式进行筛选结果
    • –format string:利用Go语言的format格式化输出结果
    • –limit int:展示最大的结果数,默认25个
    • –no-trunc:内容全部展示

Docker核心技术之容器

什么是容器?

容器是一种轻量级、可移植、并将应用程序进行打包的技术,使应用程序可以在几乎任何一个地方以相同的方式运行

  • Docker将镜像文件运行起来后,产生的对象就是容器。容器相当于是镜像运行起来的一个实例
  • 容器具备一定的生命周期
  • 另外,可以借助docker ps命令查看运行的容器,如同在Linux上利用ps命令查看运行着的进程那样

容器与虚拟机对比(一)

  • 容器和虚拟机一样,都会对物理硬件资源进行共享使用
  • 容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)
  • 容器中或虚拟机中都可以安装各种应用,如:Redis、MySQL、Nginx等,也就是说,在容器中的操作,如同在一个虚拟机(操作系统)中操作一样
  • 同虚拟机一样,容器创建后,会存储在宿主机上:Linux上位于/var/lib/docker/container下

容器与虚拟机不同点 对比(二)

注意:容器并不是虚拟机 但他们有很多相似地方

  • 虚拟机的创建、启动和关闭都是基于一个完整的操作系统。一个虚拟机就是一个完整的操作系统。而容器直接运行在宿主机的内核上,其本质上以一系列进程的结合
  • 容器是轻量级的,虚拟机是重量级的。首先容器不需要额外的资源来管理(不需要Hypervisor、GuestOS),虚拟机额外更多的性能消耗;其次,创建、启动和关闭容器,如同创建、启动和关闭进程name轻松,而创建、启动和关闭一个操作系统就没有这么方便了
  • 也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上。

容器的生命周期

虚拟机的生命周期

image-20221007111626578

容器的生命周期

image-20221007112115939

容器的创建——docker create
  • 作用:利用镜像创建出一个Created 状态的待启动容器
  • 命令格式:
    • docker create [OPTIONS] IMAGE [COMMAND] [ARG….]
  • 命令参数(OPTIONS):
    • -t, –ty:分配一个伪TTY,也就是分配虚拟终端
    • -i, interactive:即使没有连接,也要保持STDIN打开
    • –name:为容器起名,如果没有指定将会随机产生一个名称
  • 命令参数(COMMAND):
    • COMMAND表示容器启动后,需要在容器中执行的命令,如ps,ls等命令
    • ARG表示执行COMMMAND时需要提供一些参数,如ps命令的aux,ls命令的-a等等