Docker 入门问答:结论

2025-05-27

Docker入门

需要回答的问题:

结论

dockerlogo
Docker 是那些你经常听说但可能从未使用过的服务之一。我在大学期间从未使用过 Docker,实际上直到我开始研究 DevOps 领域才听说过它。了解如何使用 Docker 是成为现代开发团队一员的关键要素。我写这篇文章的目的是帮助读者了解 Docker 是什么,了解为什么当今的企业团队都在采用它,以及如何开始使用 Docker。

如果您已经知道如何使用 Docker,请考虑阅读我关于使用 Kubernetes 管理容器的帖子。

需要回答的问题:

  • Docker解决了什么问题?
  • 什么是容器?
  • 容器和虚拟机有什么区别?
  • 镜像和容器有什么区别?
  • Docker 如何帮助创建应用程序?

为什么选择 Docker?

Docker 的需求源于大规模使用服务器上的虚拟机。以大型企业为例。对于一家使用数百台服务器并为每个平台配备一个虚拟机集群的企业来说,维护这些服务器是一项全职工作。每台服务器都必须安装操作系统,需要不时进行升级和修补,并且还必须安装每台服务器所用应用程序的依赖项。

不难看出为什么这很快就会变得非常复杂。手动配置这些服务器不可行,因此许多公司会保留一个服务器列表,并通过编程进行更新。这种方法虽然可行,但服务器列表由团队成员共享,并且并非始终保持最新。有些服务器从未收到更新,因此可能会出现错误,影响系统性能。在数百台服务器的房间中查找一台故障服务器也可能是一场故障排除的噩梦。Docker 如何解决这个问题?

Docker 来救援!

与其在虚拟机上运行应用程序,不如将 Docker 镜像上传到服务器。如果镜像出现故障,只需上传一个新的即可。无需担心配置问题,因为镜像是原始配置的精确副本。这样,您也无需担心安装应用程序依赖项或操作系统补丁,因为它们已经在 Docker 镜像中配置好了。Docker 设置让您不再像宠物一样需要时刻监控和照料服务器,而是将其视为一种更短暂的存在;如果镜像出现故障,您可以直接替换它。您可能会问:“什么是镜像?为什么它比虚拟机更合适?” 随着我们深入讨论,这个术语将更加清晰易懂。

Docker 对开发者来说也很棒。这意味着不再需要担心“它在我的机器上能用”,因为所有开发者都使用 Docker 文件中维护的相同技术栈进行开发。

Docker 如何简化开发流程?

CI/CD:您可以在开发过程中(暂存、用户验收测试、生产)持续测试并将代码部署到不同的环境,而无需配置各种测试环境。

版本控制: Docker 也支持版本控制,因为您可以将不同版本的软件保存在存储库中,并在以后需要时检出它们。这样一来,在运行旧版本的应用程序时就无需更改软件版本。

前滚:当发现缺陷时,无需修补或更新应用程序。您只需使用新的映像即可。

图像和容器有什么区别?

Docker 镜像和容器密切相关,但它们又有区别。Docker 镜像是不可变的,这意味着它们无法被更改。我之前解释过,这些镜像可以上传到服务器,而不是直接在操作系统上运行应用程序。镜像包含应用程序运行所需的源代码、库、依赖项、工具和其他文件。使用 Docker 时,我们从一个基础镜像开始。由于镜像可能会变得非常大,因此镜像被设计成由多层镜像组成,以便在通过网络传输镜像时最大程度地减少数据发送量。

图像和容器

镜像的实例称为容器。容器是运行中的实例,具有顶层可写层,并运行实际的应用程序。删除容器时,可写层也会被删除,但底层镜像保持不变。主要要点是,您可以在同一个镜像上运行多个容器。思考镜像和容器的一个好方法是:镜像是制作蛋糕的配方,而容器是您烘焙的蛋糕。您可以使用配方制作资源允许的任意数量的蛋糕;使用镜像,您可以制作资源允许的任意数量的容器。

码头蛋糕

虚拟机和容器有什么区别?

考虑一下典型虚拟机群的布局:虚拟机通过虚拟机管理程序进行管理,虚拟机管理程序在安装在服务器硬件上的主机操作系统上运行。虚拟机管理程序将虚拟机用来运行其操作系统(客户操作系统)的硬件虚拟化。因此,服务器基本上有一个主机操作系统,而虚拟机本身也安装了一个完整的操作系统。
你好世界

容器的不同之处在于它没有客户操作系统 (Guest OS)。相反,容器实际上是对操作系统进行了虚拟化。在这个容器中,你可以构建任何你想要的东西。与虚拟机相比,使用容器的优势在于启动速度快,并且易于移植。

使用 Dockerfiles 构建镜像

可以看出,Docker 简化了安装和配置的麻烦。我们来看一个 Docker 命令示例:
sudo docker run docker/whalesay cowsay Hello-World!

图片

如您所见,该 Docker 镜像最初并不存在于本地,因此必须从 docker/whalesay 中拉取。您还可以看到该镜像由多个层级(例如 e190868d63f8、909cd34c6fd7 等)组成。要创建镜像,我们可以创建一个 Dockerfile。完成此文件后,我们将使用它docker build [OPTIONS] PATH | URL | -来创建我们的镜像。

您可以使用您常用的文本编辑器创建touch Dockerfile和编辑 Dockerfile。请注意,此文件创建时没有扩展名,这是有意为之。

在您的 Dockerfile 中,输入以下代码:
dockerfile

FROM 语句声明了新镜像将基于哪个镜像。在本示例项目中,我将使用 Ubuntu 镜像。但是,如果您想从头开始创建 Docker 镜像,只需编写 即可FROM scratch

LABEL 用于将元数据应用于 Docker 对象。在这种情况下,您可以使用 LABEL 指定 Docker 镜像的维护者。MAINTAINER 曾经被使用,但后来被弃用。

RUN 用于在镜像构建期间执行命令,而 CMD 仅在从镜像创建容器时执行。

在 Dockerfile 目录中,输入docker build .
dockerbuild

每个命令在第一次执行时都会被执行。Dockerfile 中的每个命令都会被缓存,因此如果您编辑该文件,只需为编辑的命令进行构建即可。编辑 Dockerfile 的 echo 命令后,我们还需要为 Docker 镜像命名并添加“latest”标签。
docker build -t helloworld:latest .
建造

要运行镜像,首先通过运行 找到镜像名称docker images 请注意,您可以通过镜像 ID 或名称和标签来运行 Docker 镜像。如果您仅按名称运行,Docker 将自动按“latest”标签运行。
docker镜像

docker run helloworld:latestdocker run 4d6c8eea04c9
在这种情况下产生相同的输出。

就这样!你已经创建了你的第一个 Docker 镜像。你可以在https://hub.docker.com上找到其他镜像,并在https://docs.docker.com/上找到文档。

额外加分!

如果您想分享您的 Docker 镜像,我建议您将新创建的 Docker 镜像推送到 DockerHub。首先,在https://hub.docker.com创建一个 DockerHub 帐户。

使用 CLI 登录到您的 DockerHub 帐户:
docker login

您还可以使用以下方式从 CLI 注销:
docker logout

此外,您可以通过先标记来推送新创建的 docker 镜像。
docker tag <image> helloworld:latest <DOCKER_HUB_USERNAME>/dockerhub:myfirstimagepush

接下来,推送 docker 镜像:
docker push <DOCKER_HUB_USERNAME>/dockerhub:myfirstimagepush
您应该收到一个 SHA-256 哈希值,表明推送成功。
dockerpush

如果您认为您已准备好使用 Kubernetes 管理您的 Docker 容器,请阅读我关于Kubernetes 的文章,然后阅读有关OpenShift(业界最安全、最全面的企业级容器平台)的文章!

结论

我希望这篇文章能帮助那些觉得自己还没准备好学习 Docker 的人。很多时候,做一件事情最难的部分就是开始。如果这篇文章对你有帮助,或者我遗漏了什么,请告诉我!

附言:
我目前正在寻找 DevOps 方面的工作!如果您认识招聘入门级 DevOps 工程师的人,请将我的简历发给他们,我的简历可以在https://smcgown.comhttps://www.linkedin.com/in/steven-mcgown/找到。

谢谢你!

文章来源:https://dev.to/stevenmcgown/docker-for-dummies-2bff
PREV
使用 Tauri 和 Yew 在 Rust 中创建桌面应用程序
NEXT
Build Angular Like An Architect (Part 1) @angular-devkit/architect is stable! GREAT SCOTT! ~14% reduction in bundle size