您现在的位置是:首页 >技术杂谈 >Docker 简介网站首页技术杂谈

Docker 简介

专注如一 2024-06-17 11:28:19
简介Docker 简介

Docker 简介

1. 什么是 Docker

1. Docker 简介

  • Docker 是一个开放平台,用于打包、分发与部署;粗略可以理解为一个轻量的虚拟机
  • Docker 可以将应用程序与基础架构分离,以便快速交付软件
  • Docker 基于 Go 语言开发实现,基于 Linux 内核,对进程进行封装隔离,属于操作系统层面的虚拟化技术

2. 打包、分发、部署

  • 打包:把软件运行所需的依赖、第三方库、软件打包到一起,变成一个安装包
  • 分发:把安装包上传到一个镜像仓库,其他人可以非常方便的获取和安装(类似 Maven)
  • 部署:使用安装包通过一个命令就可以运行应用,自动模拟出相同的运行环境,不管是在 Windows/Mac/Linux

3. Docker 优点

  • Docker 容器比传统虚拟机更轻便、快捷
    • 传统虚拟机技术是虚拟出一套硬件后,在其上运行一个完整操作系统,在该系统上再运行所需应用进程
    • Docker 容器内的应用进程直接运行于宿主的内核,容器内没有自己的内核,而且也没有进行硬件虚拟
  • Docker 容器更便于开发
    • 一致的运行环境:不管是在 Windows/Mac/Linux 均可使用 Docker 镜像提供除内核外完整的运行时环境;开发部署流程:开发、测试 --> 打包为 Docker 镜像 --> 各种服务器上均只需一个命令就部署好
    • 更高效的利用系统资源:不需要虚拟硬件以及运行完整操作系统,应用执行速度、内存损耗或者文件存储速度,都更高效
    • 更快速的启动:直接运行于宿主内核,无需启动完整的操作系统,可以做到秒级、甚至毫秒级的启动时间
    • CI/CD:开发人员可以通过 Dockerfile 来进行镜像构建,并结合 CI/CD
    • 更轻松的迁移、维护与扩展:Docker 确保了执行环境的一致性,使用了分层存储以及镜像的技术

4. Docker 通常用来做什么

  • 本地编写代码并使用 Docker 容器,方便的共享给同事分发、部署应用
  • 快速安装测试/学习软件,用完就丢(类似小程序),例如 Redis / MongoDB / ElasticSearch / ELK
  • 多个版本软件共存,不污染系统,例如 Python2、Python3,Redis4.0,Redis5.0
  • Windows 上体验/学习各种 Linux 系统

2. 三大组件

1. 镜像(Image)

  • 打包出来的安装包,本质是文件、提供容器运行时所需的文件与配置参数的模板;它不包含任何动态数据,其内容在构建之后不会被改变
    • 所需的文件包括:程序、库、资源、配置等
    • 所需的配置参数包括:匿名卷、环境变量、用户等
  • 分层存储:多层文件系统联合组成
    • 镜像构建时,会一层层构建,前一层是后一层的基础
    • 每一层构建完就不会再发生改变,后一层上的任何改变只发生在自己这一层
    • 任何额外的东西应该在该层构建结束前清理掉
  • 构建自己的镜像需要创建 Dockerfile,它的每条指令都会在镜像中创建一层
    • 更改 Dockerfile 并重构镜像时,仅重建更改的那些层

2. 容器(Container)

  • 镜像是静态的定义相当于类,容器是镜像运行时的实体相当于实例对象
    • 容器可以被创建、启动、停止、删除、暂停
    • 软件安装包安装后的状态,每个容器运行环境都是独立的、隔离的
    • Docker 使用命名空间(namespaces)技术来提供容器的隔离层,容器的在单独的命名空间中运行,访问仅限于该命名空间
  • 分层存储:以镜像为基础层,创建容器的存储层
    • 容器存储层的生存周期和容器一样,任何保存于容器存储层的信息都会随容器死亡而丢失
    • 按照 Docker 最佳实践的要求,容器存储层要保持无状态化
    • 所有的文件写入操作,都应该使用数据卷(Volume)、或者绑定宿主目录,在这些位置的读写会跳过容器存储层,直接对宿主(或网络存储)发生读写,其性能和稳定性更高

3. Registry 与 仓库(Repository)

  • 一个 Docker Registry 包含多个仓库,一个仓库包含多个标签,一个标签对应一个镜像
  • 一个仓库会包含同一个软件不同版本的镜像,标签就是版本,通过 <仓库名>:<标签> 的格式来指定具体软件,如果不给出标签,将以 latest 作为默认标签
  • 公开的 Docker Registry 有:官方的默认 Docker Hub、Red Hat 的 Quay.io、Google 的 Google Container Registry 、GitHub 推出的 ghcr.io、网易云镜像服务、DaoCloud 镜像市场、阿里云镜像库等
  • 用户还可以在本地搭建私有 Docker Registry

3. Docker 架构

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-max6Dr5N-1684746416494)(:/af15fc98b9fa4dc594206426acef7eb0)]

  • Docker 使用客户端-服务器架构
    • Docker 客户端与 Docker 守护进程通信,Docker 守护进程负责构建,运行和分发 Docker 容器的繁重任
    • Docker 客户端和守护程序可以在同一系统上运行,也可以在分布式系统中远程连接
    • Docker 客户端和守护进程使用 REST API 通过 UNIX 套接字或网络接口进行通信
  • Docker 客户端(docker)是用户与 Docker 交互的主要方式
    • 使用 docker run 等 Docker API 命令时,客户端会将这些命令发送给 Docker 守护程序(dockerd)让它执行
    • Docker 客户端可以与多个守护进程通信
  • Docker 守护程序(dockerd)监听 Docker API 请求并管理 Docker 对象:镜像、容器、网络和数据卷
    • 守护程序可以与其他守护程序通信以管理 Docker 服务
  • Docker 桌面(Desktop)是一款易于安装在 Windows/Mac/Linux 的应用程序
    • Docker Desktop 包括:Docker 守护进程、Docker 客户端、Docker Compose、Docker Content Trust、Kubernetes 和 Credential 助手等

4. Docker 客户端(docker)命令实例

  • docker pulldocker run 命令:从配置的 Registry 中拉取所需的镜像
  • docker push 命令:镜像将被推送到配置的 Registry

1. docker run 命令示例

  • 以交互方式附加到本地命令行会话:docker run -i -t ubuntu /bin/bash
    1. 如果本地没有 ubuntu 镜像,Docker 会从配置的 registry 中拉取,就像手动运行:docker pull ubuntu
    2. Docker 创建一个新容器,就像手动运行:docker container create
    3. Docker 为容器分配一个读写文件系统,作为最终层:允许正在运行的容器在其本地文件系统中创建或修改文件和目录
    4. Docker 创建一个网络接口将容器连接到默认网络:为容器分配 IP 地址,容器使用主机机器的网络连接连接到外部网络
    5. -i-t 标志:容器以交互方式运行并将输出记录到终端
    6. Docker 启动容器并执行 /bin/bash
    7. 键入 exit 终止 /bin/bash 命令时,容器将停止但不会删除

参考:
https://docs.docker.com/get-started/overview/
https://vuepress.mirror.docker-practice.com/introduction/what/
https://docker.easydoc.net/doc/81170005/cCewZWoN/lTKfePfP

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。