Docker 是什么?为什么它对开发者如此重要且必不可少?第一部分
什么是 Docker 以及容器化意味着什么?
众所周知,船舶是全球货物运输的主要方式。过去,由于每件货物的形状和材质各不相同,运输成本相当高昂。将一袋鱼或一辆汽车装上船是一项截然不同的任务,需要不同的流程和工具。装载方法存在诸多问题,需要使用各种起重机和工具。而考虑到货物本身的易碎性,要在船上熟练地包装货物并非易事。
但不知从何时起,一切都变了。集装箱使各种类型的货物和装卸工具在世界各地统一起来,从而简化了流程,加快了速度,并最终降低了成本。集装箱化进程,或者说集装箱系统的建立,始于20世纪60年代,当时多式联运货物开始使用多式联运集装箱,并彻底改变了物流体系。
软件开发领域也发生了同样的事情。Docker 已成为一种通用的软件交付工具,无论其结构、依赖关系或安装方式如何。通过 Docker 分发程序所需的一切资源都包含在镜像中,并且与主系统和其他容器互不干扰。这一点的重要性怎么强调也不为过。现在,更新软件版本既不涉及系统本身,也不涉及其他程序。一切都不会再中断。您只需下载要更新的程序的新镜像即可。换句话说,Docker 消除了依赖地狱问题,并使基础设施变得不可变。
Docker 是一款旨在简化使用容器创建、部署和运行应用程序的工具。容器允许开发人员将应用程序所需的所有组件(例如库和其他依赖项)打包,并将其作为一个包发布出去。借助容器,开发人员可以放心,应用程序可以在任何其他 Linux 计算机上运行,无论该计算机的自定义设置与用于编写和测试代码的计算机有何不同。
从某种程度上来说,Docker 有点像虚拟机。但与虚拟机不同的是,Docker 并非创建一整套虚拟操作系统,而是允许应用程序使用与其所运行系统相同的 Linux 内核,并且仅要求应用程序附带主机上尚未运行的程序。这显著提升了性能,并减小了应用程序的大小。
更重要的是,Docker 是开源的。这意味着任何人都可以为 Docker 做出贡献,并根据需要扩展它,以满足自己的需求(如果他们需要一些开箱即用的功能)。
Docker 是一款旨在让开发人员和系统管理员都受益的工具,使其成为众多 DevOps(开发人员 + 运维)工具链的一部分。对于开发人员而言,这意味着他们可以专注于编写代码,而无需担心最终运行的系统。此外,它还允许他们利用数千个已设计为在 Docker 容器中运行的程序作为其应用程序的一部分,从而抢占先机。对于运维人员而言,Docker 提供了灵活性,并且由于其占用空间小且开销较低,可以潜在地减少所需的系统数量。
关于 Docker 你应该知道的事情:
- Docker 不是 LXC。
- Docker 不是虚拟机解决方案。
- Docker 不是一个配置管理系统,也不能替代 chef、puppet、Ansible 等。
- Docker 不是一种平台即服务技术。
Docker 组件:
- Docker由以下四个组件组成
- Docker 客户端和守护进程
- 图片
- Docker 注册表
- 容器
Docker 架构
镜像是 Docker 的基本构建块。容器由镜像构建而成。镜像可以配置应用程序,并用作创建容器的模板。镜像采用分层结构组织。镜像中的每个更改都会在其上添加一层。
Docker 注册表
Docker 镜像仓库。使用 Docker 镜像仓库,您可以构建镜像并与团队共享。镜像仓库可以是公共的,也可以是私有的。Docker 公司提供名为 Docker Hub 的托管镜像仓库服务。它允许您从中心位置上传和下载镜像。如果您的镜像仓库是公共的,则其他 Docker Hub 用户都可以访问您的所有镜像。您也可以在 Docker Hub、Google Cloud Registry、Amazon Registry 等平台上创建私有镜像仓库。Docker Hub 的作用类似于 git,您可以在笔记本电脑上本地构建镜像,提交后再推送到 Docker Hub。
容器
是 Docker 的执行环境。容器由镜像创建。它是镜像的可写层。您可以将应用程序打包到容器中,提交它并将其作为黄金镜像,以便从中构建更多容器。两个或多个容器可以链接在一起,形成分层应用程序架构。容器可以启动、停止、提交和终止。如果您在未提交的情况下终止容器,则对该容器所做的所有更改都将丢失。
从 LXC 到 Docker
最初的 Linux 容器技术被称为 Linux 容器,简称 LXC。LXC 是一种操作系统级虚拟化方法,旨在在单个主机上运行多个独立的 Linux 系统。
容器将应用程序与操作系统分离。这意味着用户拥有一个干净、精简的 Linux 操作系统,并且您可以在一个或多个隔离的容器中运行所有进程。由于操作系统与容器分离,您可以将容器移动到任何支持容器操作环境的 Linux 服务器上。Docker 最初是一个为单个应用程序构建 LXC 容器的项目,但它对 LXC 进行了重大改进,使容器更加可移植且灵活。
Docker 和 LXC 的主要区别:
1. 单流程 vs. 多流程
Docker 限制容器,使它们作为单个进程运行。如果您的应用程序环境包含 X 个并发进程,Docker 将启动 X 个容器,每个容器都有自己的进程。与 Docker 不同,LXC 容器可以运行多个进程。要在 Docker 中运行一个简单的多层级 Web 应用程序,您需要一个 PHP 容器、一个 Nginx 容器 Web 服务器、一个用于数据库进程的 MySQL 容器,以及几个用于存储数据库表和其他应用程序信息的数据容器。
单进程容器有很多优点,包括更新更简单、规模更小。当您只想更新 Web 服务器时,无需终止数据库进程。此外,单进程容器拥有构建基于微服务的应用程序的高效架构。但单进程容器也存在一些局限性。例如,您无法在容器内运行代理、注册脚本或自动运行 SSH 进程。在应用程序级别对单进程容器进行细微升级也并非易事。您必须启动一个新更新的容器。
2. 无结构性与结构性
Docker 容器的设计比 LXC 更加无结构化。
首先,Docker 不支持外部存储。Docker 允许你将主机存储挂载为容器中的 Docker 卷,从而规避了这个问题。由于挂载的数量是固定的,因此它们不被视为容器环境的一部分。
其次,Docker 容器由读取模式的层组成。这意味着容器的镜像一旦创建,就不会改变。在程序执行期间,如果容器中的进程更改其内部状态,则内部状态与创建容器的镜像之间会产生差异。
如果您运行 docker commit 命令,两个版本之间的差异将成为新镜像的一部分,但不是原始镜像,而是新镜像,您可以从中创建新的容器。如果您删除容器,版本差异将消失。
无结构容器是一种不常见的实体。你可以更新容器,但一系列更新会创建一系列新的容器镜像,因此系统很容易回滚。
3.可移植性
这或许是 Docker 相较于 LXC 最关键的优势。Docker 比 LXC 更加分离网络资源、存储和操作系统细节。使用 Docker,应用程序真正地独立于这些底层资源的设置。当你将 Docker 容器从一台 Docker 主机移动到另一台 Docker 机器时,Docker 能够确保应用程序的环境保持不变。
这种方法的一个直接好处是,Docker 可以帮助程序员创建看起来像生产服务器的本地开发环境。当程序员完成编写并开始测试代码时,他可以将其包装到容器中,直接发布到服务器上或私有云中,由于这是同一个环境,因此可以立即开始工作。
使用 LXC,程序员可以在自己的机器上运行某些代码,但部署到服务器后却发现代码无法正常工作。服务器环境会有所不同,程序员必须花费大量时间来修复这些差异并解决问题。使用 Docker,就不会出现这样的问题。
4. 为开发人员创建的架构
将应用程序与底层硬件分离是虚拟化的基本概念。容器则更进一步,将应用程序与操作系统分离。得益于这一特性,程序员在开发过程中获得了灵活性和可扩展性。
Docker 还取代了什么?
值得一提的是,Docker 出现后,在处理基础设施时,哪些技术已经变得多余。当然,对于其他应用来说,这些技术仍然不可或缺。例如,如何替代 SSH 或 Git 用于其他用途?
Chef / Puppet / Ansible
简洁快速的 Dockerfile 取代了有状态的服务器配置管理系统。由于 Docker 可以在几秒钟内组装容器镜像,并在几毫秒内启动容器,您不再需要编写脚本来保持笨重且昂贵的服务器更新。只需启动一个新容器并收回旧容器的成本即可。如果您在 Docker 迅速普及之前使用 Chef 部署无状态服务器,那么您可能已经爱上了 Docker。
Upstart / SystemD / Supervisor / launchd / God.rb / SysVinit
基于静态配置的过时服务启动系统即将消失。取而代之的是 Docker 守护进程,它是一个类似 init 的进程,可以监视正在运行的服务、重启失败的服务、存储退出代码和日志,最重要的是,它可以在任何机器上下载包含任何服务的容器,无论该机器的角色是什么。
Ubuntu_18.04.iso / AMI-W7FIS1T / apt-get 更新
和 Vagrant 一样,Docker 终于让我们告别下载早已过时的 DVD 安装镜像,告别各种云平台的控制面板,告别为它们永远无法提供最新的 Ubuntu 而苦恼。最重要的是,你可以在几分钟内启动包含所有所需内容的自定义镜像,将其收集到本地计算机上,然后下载到免费的 Docker Hub 云平台。安装后无需再执行 apt-get update ——你的镜像组装后即可立即使用。
RUBY_ENV、database.dev.yml、测试、暂存和备份
由于 Docker 允许您运行包含所有依赖项的容器,并创建一个与您配置完全匹配的逐位环境,因此您可以在几秒钟内直接在计算机上获取生产环境的精确副本。所有操作系统、所有数据库和缓存服务器、应用程序本身及其使用的库版本,所有这些都将在开发机器或测试机器上精确复制。如果您一直梦想着拥有一个备用生产服务器,以便在主服务器发生故障时随时投入使用 - docker-compose up,您将拥有两个彼此精确复制的备用服务器。从 Docker 1.10 版本开始,容器标识符使用其自身的 SHA256 签名来保证身份。
还要注意的是,像 Docker 这样强大的工具与12factor的方法完全一致,它允许创建具有许多优势的软件即服务。
SSH(原文如此!)、VPN、Capistrano、Jenkins-slave
要启动容器,您无需在服务器上获取 root 权限、摆弄密钥并配置部署系统。使用 Docker,部署看起来就像在家中构建和配置物理服务器,进一步进行全面测试,然后用一个命令将其神奇地移动到任意数量的数据中心。为此,只需在笔记本电脑上运行 Docker,Docker 本身就会通过 TLS 连接到服务器并启动一切。进入容器内部也更容易:docker exec -it %containername% bash,然后您手中就有一个调试控制台。您甚至可以像这样通过 docker 隧道驱动 rsync:rsync -e 'docker exec -i' --blocking-io -rv CONTAINER_NAME:/data.,主要要记住的是添加 --blocking-io。
无供应商锁定
就这样,他已经不在了。你想在几分钟内将整个应用程序迁移到另一个大陆,并希望将你的应用程序传播到全球吗?容器不在乎在哪里运行,它们通过虚拟网络连接,它们在任何地方都能看到和听到彼此,即使在实时调试时,也可以在开发机器上看到和听到彼此。
这是有关 Docker 这样一个强大工具的部分信息,在我们的下一篇文章中,您可以熟悉 Docker 的所有优点,了解 Dokku 是什么以及我们如何在实践中使用这些工具。
链接:https://dev.to/amoniacou/what-is-docker-why-is-it-important-and-necessary-for-developers-part-i-39e5