Docker 开发者入门

2025-06-10

Docker 开发者入门

本文最初发表于ITNEXT

Docker简介

在当今的 IT 世界中,我们大多数人肯定都听过或遇到过这样的问题:代码在开发环境中运行良好,但在测试或生产环境中却不行。因此,运维团队面临着一个非常头疼的问题:如何在不停机或不影响最终用户的情况下,维护系统处于正常状态。这变成了 Dev 和 Ops 之间的一场“蛇与梯子”游戏,并造成了许多混乱,最终导致发布效率低下、停机和信任问题。当开发人员的代码在一台机器上运行良好,但在另一台机器上却不行时,开发人员需要花费大量时间来查找导致此问题的确切错误。Docker
就是解决这个难题的工具,使用 Docker,我们可以将代码及其所有配置和依赖项打包在一起,以便它能够在任何环境中无缝运行,无论是开发、运维还是测试环境。

为什么选择 Docker?

Docker 改变了应用程序的构建和交付方式,彻底革新了容器化的世界。借助 Docker,软件部署变得轻松许多,您无需担心缺少系统配置、底层基础架构或任何先决条件。Docker 使我们能够创建、部署和管理轻量级的独立软件包,其中包含运行应用程序所需的一切。具体来说,它包含代码、库、运行时、系统设置和依赖项。每个这样的软件包都称为容器。每个容器都部署有自己的 CPU、网络资源、内存以及所有资源,而无需依赖任何单独的外部内核和操作系统。

想象一下,你有数千个测试用例连接到数据库运行,并且它们都按顺序执行。你认为这需要多长时间?但是使用 Docker,通过容器化方法,所有这些测试用例可以在同一主机上同时并行运行,这将非常快速地完成。

使用 Docker 的好处

  • 实现一致的环境
  • 易于使用和维护
  • 高效利用系统资源
  • 提高软件交付率
  • 提高运营效率
  • 提高开发人员的工作效率
  • Docker 架构

替代文本
图片来源:Docker

Docker 采用客户端-服务器架构。Docker 客户端负责与 Docker 守护进程通信,而守护进程负责构建、运行和分发 Docker 容器等繁重工作。Docker 客户端和 Docker 守护进程可以运行在同一系统上,或者换句话说,您可以将 Docker 客户端连接到远程 Docker 守护进程。Docker 客户端和守护进程使用 REST API 通过 UNIX 套接字或网络接口进行通信。

Docker系统中的主要组件

Docker 镜像

Docker 镜像由多层只读文件系统构成,这些文件系统被称为 Docker 文件,它们只是包含一组预先编写好的命令的文本文件。Docker
文件中写入的每条文本或给出的每条指令都会创建一个层,并将其放置在另一层之上,形成 Docker 镜像,用于将来创建 Docker 容器。Docker
创建了 hub.docker.com,供用户存储他们创建的 Docker 镜像,它就像一个 Docker 镜像的存储区域,也可以存储在本地镜像仓库中。

Docker容器

容器是一个独立的应用程序,它由一个或多个镜像构建而成,并充当一个完整的软件包系统,其中包含应用程序运行所需的所有库和依赖项。Docker 容器本身不包含操作系统,而是使用主机操作系统来实现功能,因此它是一个更便携、更高效、更轻量级的系统,并保证软件可以在任何环境中运行。

Docker 引擎

它是 Docker 系统的核心,是一个安装在主机上的应用程序,遵循客户端-服务器架构。Docker
引擎主要包含 3 个组件:

  1. 服务器是名为 dockerd 的 docker 守护进程。用于创建和管理 docker 镜像、容器、网络等。

  2. Rest API 指示 docker daemon 做什么。

  3. 命令行界面(CLI)是用于输入docker命令的客户端。

Docker 客户端

Docker 客户端是 Docker 系统中的关键组件,用户使用它与 Docker 进行交互,它提供了一个命令行界面 (CLI)。当我们运行 docker 命令时,客户端会将这些命令发送到守护进程 dockerd,以执行应用程序的构建、运行和停止操作。

Docker 注册表

这是存储 Docker 镜像的地方。Docker Hub 和 Docker Cloud 是公共镜像仓库,任何人都可以访问。当然,您也可以选择拥有自己的私有镜像仓库。Docker 默认配置为在 Docker Hub 上查找镜像。您也可以使用 Artifactory Docker Registry 来提高安全性并优化构建。

让我们深入了解 Docker 的实用性

安装Docker的步骤:

下面是 Docker 提供的 Docker 安装链接,我们有清晰的文档可用于安装 Docker。https
://docs.docker.com/engine/install/ubuntu/
安装 Docker 后,检查 Docker 的版本
替代文本

一些基本的 Docker 命令

  • docker ps:提供机器上活动容器的列表替代文本

在输出中我们可以看到它显示了有关容器的一些详细信息

容器 ID:每个容器都将分配一个唯一的 ID
图像:每个图像都附加一个标签
命令:每个图像都将分配一个唯一的 ID
创建:显示创建时的详细信息
状态:显示容器是否处于活动状态的详细信息 端口
:公开端口
名称:docker 为创建的容器分配随机名称

  • docker ps -a
    为您提供完整的容器列表,包括已停止或崩溃的容器
    替代文本

  • docker images
    为您提供系统中存在的图像列表
    替代文本

  • docker run ARGUMENT IMAGE-NAME
    它将使用镜像名称创建一个容器
    替代文本

这里的参数 -itd 表示
i — 交互式
t — 连接到终端
d — 分离模式

我们可以根据需要以分离模式(-itd)或根模式(-td)运行容器。

  • docker stop CONTAINER-ID/NAME
    停止容器
    替代文本

  • docker rm CONTAINER-ID/NAME
    删除容器
    替代文本

  • docker rmi IMAGE-ID
    删除 docker 镜像
    替代文本

  • docker exec -it 容器名称 /bin/bash/
    获取容器shell权限

通过此命令我们可以在容器内运行所需的代码。
替代文本

容器中的卷

容器本质上是动态的,它们移动很多,今天一个容器可能在服务器 A 上,明天它可能在服务器 B 上,因此它们将根据需要进行混洗、重新定位,
卷充当数据仓库或附加到容器外部的数据存储。

举个例子,在数据目录 (data) 中,我们有 data1 和 data2 文件,它们是应用程序需要处理的关联数据的一部分。 但我们不希望这些数据真正存储在容器中,而是希望它们被挂载,因此实际的读写操作将发生在 data1 和 data2 中,它们看起来就像是容器的一部分。因此,这些挂载的数据被称为卷 (Volume)。
替代文本

替代文本

替代文本

现在我们对创建、删除和启动容器有了基本的了解,接下来我们将了解如何创建自己的镜像。

在我们的服务器上,我们需要通过运行以下命令来安装 Apache2:
sudo apt-get update
sudo apt-get install apache2

创建 Dockerfiles

创建一个目录作为示例代码,在其中创建 Dockerfile 和 index.html 文件
替代文本

替代文本

每个 dockerfile 都以 FROM 命令开头,该命令指示基础映像来自何处,这里我们指示使用 httpd 作为基础映像,然后我们要添加一个文件 index.html,它将作为我们的源,而我们的目的地将是 /usr/local/apache2/htdocs/index.html,当我们运行此文件时,docker 将创建一个临时容器,并从中创建一个映像,一旦创建了映像,我们就可以使用此映像从中创建一个容器。

  • docker build . -t first-image:
    此命令将构建一个镜像,其中 first-mage 是镜像的名称

  • docker run -itd — name first-container -p 8090:80 first-image:
    此命令将构建容器,其中 first-container 是映射到端口 80 的容器名称,
    我们可以看到输出:http://server_IP:port

结论

Docker 容器比虚拟机更胜一筹,因为它们能确保应用程序无错误运行。容器化为软件驱动型企业的数字化转型铺平了道路。Docker 容器可以与您选择的任何框架和语言兼容,只要社区中已有相应的镜像即可。许多 CI/CD 工具,例如 Jenkins、CircleCI、TravisCI 等,现已全面支持并与 Docker 集成,这使得在各个环境之间传播更改变得轻而易举。Docker 使应用程序的部署变得非常容易,而且由于容器轻量级,它有助于实现规模化和自动化。

有很多免费资源可以让你学习 Docker。
下面列出一些:

鏂囩珷鏉ユ簮锛�https://dev.to/pavanbelagatti/getting-started-with-docker-for-developers-3apo
PREV
Kubernetes GitOps:初学者指南及实践教程
NEXT
Docker、开发人员的最佳实践以及下一步是什么?