在现代软件开发领域,效率和一致性至关重要。开发人员和运维团队需要解决方案,帮助他们在不同环境中无缝管理、部署和运行应用程序。
容器和Docker是彻底改变软件构建、测试和部署方式的技术。
无论您是新手还是想要了解Docker基础知识,本文都将指导您了解必要的内容。
目录
什么是容器?
在深入了解Docker之前,让我们先了解容器。想象一下,你正在一个项目上工作,你的应用在你的笔记本电脑上完美运行。但是当你尝试在另一台机器上运行相同的应用时,却失败了。这往往是由于环境的差异造成的:不同的操作系统、安装的软件版本或配置。
容器通过将一个应用及其所有依赖项(如库、框架和配置文件)打包到一个单一的标准化单元中来解决这个问题。这确保应用无论部署在哪里,无论是在你的笔记本电脑、服务器还是云中,都能运行相同。
容器的关键特性:
-
轻量级:容器共享主机系统的内核,不像虚拟机(VMs)需要独立的操作系统实例,因此更快更高效。
-
可移植性: 一旦构建,容器可以在各种环境中持续运行。
-
隔离性: 容器在隔离的进程中运行,这意味着它们不会干扰在同一系统上运行的其他应用程序。
什么是Docker?
现在我们了解了容器,让我们谈谈Docker,这个平台使得容器成为主流。
Docker是一个开源工具,旨在简化创建、管理和部署容器的过程。自2013年推出以来,Docker因其易用性、社区支持和强大的工具生态系统迅速成为容器化的首选解决方案。
Docker中的关键概念
-
Docker镜像: 将Docker镜像视为容器的蓝图。它包含运行应用程序所需的所有内容,包括代码、库和系统依赖项。镜像是根据Dockerfile中编写的一组指令构建的。
-
Docker容器:容器是Docker映像的运行实例。当您创建并启动容器时,Docker会将映像启动到一个隔离的环境中,在这里您的应用程序可以运行。
-
Dockerfile:这是一个包含创建Docker映像所需步骤的文本文件。在这里,您可以定义容器的外观,包括基础映像、应用程序代码和任何附加依赖项。
-
Docker Hub:Docker Hub是一个公共注册表,开发人员可以在其中共享和访问预构建的映像。如果您正在使用常见的应用程序或技术堆栈,很有可能在Docker Hub上已经有可用的映像,从而节省您的时间。
-
Docker Compose:对于需要多个容器的应用(例如 Web 服务器和数据库),Docker Compose 允许您使用简单的 YAML 文件定义和管理多容器环境。
为什么选择 Docker?
Docker 之所以受欢迎,是因为它能解决开发者今天面临的多种挑战:
-
跨环境一致性:开发者可以”构建一次,到处运行”,确保同一个应用在不同环境中(从本地开发到生产)的运行方式一致。
-
速度:Docker 容器启动和停止速度快,非常适合测试和部署流程。
-
资源高效利用:由于容器更有效地共享主机系统资源而不是虚拟机,它们减少了开销,允许在部署中实现更高的密度。
-
应用程序的版本控制:Docker 允许您对代码以及代码运行的环境进行版本控制。这在回滚到先前版本或调试生产中的问题时特别有用。
Docker 架构
当您首次开始使用 Docker 时,您可能将其视为一个“只需工作”的盒子。虽然这对于入门来说很好,但深入了解 Docker 的架构将帮助您排除故障、优化性能,并就您的容器化策略做出明智的决策。
Docker 的架构旨在确保效率、灵活性和可扩展性。它由几个组件组成,这些组件共同创建、管理和运行容器。让我们仔细看看这些组件中的每一个。
Docker 架构:关键组件
Docker 的架构围绕一个客户端-服务器模型构建,包括以下组件
-
Docker 客户端
-
Docker 守护进程 (dockerd)
-
Docker 引擎
-
Docker 镜像
-
Docker 容器
-
Docker 注册表
1. Docker 客户端
Docker 客户端是用户与 Docker 交互的主要方式。它是一个命令行工具,使用 REST API 向 Docker 守护进程发送指令。命令如 docker build
、docker pull
和 docker run
是从 Docker 客户端执行的。
当您输入像 docker run nginx
这样的命令时,Docker 客户端会将其转换为 Docker 守护进程可以理解并执行的请求。实质上,Docker 客户端充当与 Docker 更复杂后端组件交互的前端。
2. Docker 守护进程 (dockerd)
Docker 守护进程,也称为 dockerd,是整个 Docker 操作的核心。它是一个后台进程,监听来自 Docker 客户端的请求,并管理 Docker 对象,如容器、镜像、网络和卷。
以下是 Docker 守护进程的职责
-
构建和运行容器:当客户端发送运行容器的命令时,守护进程拉取镜像,创建容器并启动它。
-
管理Docker资源:守护进程处理诸如网络配置和卷管理等任务。
- Docker守护程序在主机上运行,并使用REST API、Unix套接字或网络接口与Docker客户端通信。它还负责与容器运行时交互,容器运行时负责实际执行容器。
3. Docker引擎
Docker引擎是Docker的核心部分。它使整个平台工作,将客户端、守护进程和容器运行时结合在一起。Docker引擎可以在各种操作系统上运行,包括Linux、Windows和macOS。
有两个版本的Docker引擎
-
Docker CE(社区版):这是Docker的免费开源版本,广泛用于个人和小规模项目。
-
Docker EE(企业版):付费的企业级Docker版本提供了增强的安全性、支持和认证等额外功能。
Docker引擎通过集成构建、运行和管理容器所需的各种组件,简化了容器编排的复杂性。
4. Docker镜像
Docker镜像是一个只读模板,包含应用程序运行所需的一切内容——代码、库、依赖项和配置。镜像是容器的构建块。当您运行一个容器时,实质上是在一个Docker镜像之上创建一个可写层。
Docker镜像通常是从Dockerfile构建的,Dockerfile是包含如何构建镜像的指令的文本文件。例如,一个基本的Dockerfile可能从基础镜像(如nginx
或ubuntu
)开始,并包括复制文件、安装依赖项或设置环境变量的命令。
这是一个Dockerfile的简单示例
dockerfileCopy codeFROM nginx:latest
COPY ./html /usr/share/nginx/html
EXPOSE 80
在这个示例中,我们使用官方Nginx镜像作为基础,并将本地HTML文件复制到容器的Web目录中。
一旦镜像构建完成,它可以存储在Docker注册表中并与他人共享。
5. Docker容器
Docker容器是Docker镜像的运行实例。它轻量且与其他容器隔离,但与主机操作系统共享内核。每个容器都有自己的文件系统、内存、CPU分配和网络设置,这使其具有可移植性和可重现性。
容器可以被创建、启动、停止和销毁,甚至可以在重启之间保持持久化。因为容器基于镜像,它们确保应用程序无论在何处运行都会表现相同。
Docker 容器的几个关键特性:
-
隔离性: 容器彼此之间以及与主机隔离,但它们仍然共享相同的操作系统内核。
-
可移植性: 容器可以在任何地方运行,无论是在本地计算机、虚拟机还是云提供商。
6. Docker 注册表
Docker 注册表是存储和分发 Docker 镜像的集中地。最流行的注册表是 Docker Hub,它托管了数百万个公开可用的镜像。组织也可以建立私有注册表以安全地存储和分发自己的镜像。
Docker 注册表提供了几个关键功能:
-
镜像版本控制: 使用标签对镜像进行版本控制,便于管理应用程序的不同版本。
-
访问控制: 注册表可以是公开的或私有的,采用基于角色的访问控制来管理谁可以拉取或推送镜像。
-
分发: 可以从注册表中拉取镜像并部署到任何地方,这使得共享和重用容器化应用程序变得容易。
Docker的容器运行时:containerd
Docker架构中的一个重要发展是使用containerd。Docker曾经有自己的容器运行时,但现在使用containerd,这是一种遵循行业标准的容器运行时,也被Kubernetes等其他平台使用。
-
containerd负责
-
启动和停止容器
-
管理容器的存储和网络
-
从注册表中拉取容器镜像
-
通过将容器运行时与Docker的高级功能分离,Docker变得更加模块化,使其他工具能够使用containerd,而Docker则专注于面向用户的功能。
如何使用Docker创建一个简单的容器
拉取Linux镜像
首先从Docker Hub拉取alpine
镜像。 alpine
镜像是一个精简的Linux发行版,旨在轻量且快速。
运行以下命令:
docker pull alpine
这将把alpine
镜像下载到您的本地系统。
运行容器
使用alpine
镜像创建并启动一个容器。我们还将在容器内启动一个终端会话。
docker run -it alpine /bin/sh
以下是每个选项的含义:
-
docker run
:创建并启动一个新容器。 -
-it
:允许您与容器进行交互(交互模式 + 终端)。 -
alpine
:指定要使用的镜像。 -
/bin/sh
:指定在容器内运行的命令(在本例中是一个shell会话)。
探索容器
容器运行后,你将看到一个类似这样的shell提示符
/ #
这表示你正在Alpine Linux容器内。你现在可以运行Linux命令。例如:
检查当前目录:
pwd
列出目录中的文件:
ls
输出:一个最小的目录结构,因为Alpine是一个轻量级镜像。
你也可以安装一个包(Alpine使用apk
作为它的包管理器):
apk add curl
退出容器
当你完成探索时,输入exit
来关闭会话并停止容器
bashCopy codeexit
在容器停止后访问容器
如果你想在停止容器后再次访问容器,你可以使用这个命令来列出所有容器(包括已停止的):
docker ps -a
你将看到一个包含其ID和状态的容器列表,然后你可以启动已停止的容器:
docker start <container-id>
你可以使用这个命令附加到容器的shell:
docker exec -it <container-id> /bin/sh
如果你不再需要这个容器,你可以删除它
-
停止容器(如果仍在运行):
docker stop <container-id>
-
删除容器:
docker rm <容器ID>
关键Docker命令回顾
命令 | 描述 |
docker pull alpine |
下载Alpine Linux镜像。 |
docker run -it alpine /bin/sh |
创建并启动一个交互式容器。 |
docker ps -a |
列出所有容器(运行中和已停止)。 |
docker start <容器ID> |
启动已停止的容器。 |
docker exec -it <容器ID> |
附加到运行中的容器。 |
docker stop <容器ID> |
停止运行中的容器。 |
docker rm <容器ID> |
移除已停止的容器。 |
总结
现在您已经建立了基础知识,是时候将您的知识付诸实践了。开始尝试使用Docker,构建您的第一个容器,并探索其广阔的生态系统。
很快您就会明白为什么Docker已经成为现代DevOps和软件工程的基石。
您可以关注我
Source:
https://www.freecodecamp.org/news/an-introduction-to-docker-and-containers-for-beginners/