发布于 2026-01-06 0 阅读
0

了解容器:Docker

了解容器:Docker

许多公司都在运行各种应用程序。但这些应用程序运行在哪里呢?答案是服务器。有些公司拥有自己的服务器,而有些公司则从大型服务提供商(例如云服务提供商)租用服务器。

最初,一台服务器只能运行一个应用程序。正如人们所料,这种方法存在一些问题。首先,这会增加单台服务器的负载,因为随着使用该应用程序的用户数量增加,负载也会增加。其次,由于只能运行一个应用程序,因此,要运行多个应用程序,公司就必须添加多台服务器,从而显著增加成本。

进入虚拟机的世界

虚拟机解决了这个问题。虚拟机的概念由 IBM 发明,最初是为了分时使用极其昂贵的大型机硬件。简单来说,虚拟机可以帮助我们在同一台服务器上运行多个应用程序。但虚拟机的问题在于它们需要自己的操作系统,而操作系统需要内存、CPU 等资源。假设我们想在自己的电脑上运行虚拟机,就必须进行双启动,也就是在硬盘的另一部分安装另一个操作系统(例如 Ubuntu)。其他缺点包括速度降低、需要专用存储空间、需要专用 CPU 和内存分配,以及需要为每个虚拟机安装依赖项管理程序。因此,虚拟机比“一个应用程序对应一台服务器”的方案要好,但仍然不够完美。

容器化或许是更好的解决方案?

如果我们能在同一操作系统上运行多个应用程序实例,那该有多棒?容器技术正是为此而生。Docker(由 Docker 公司开发)凭借 Linux 容器技术让容器技术流行起来。在 Docker 出现之前,像谷歌这样的大公司就已经以某种方式使用容器了。不仅如此,还有许多其他类似容器的方案,但它们并不普及(2015 年,一个名为开放容器倡议组织 (OCI) 的机构成立,其明确目标是围绕容器格式和运行时创建开放的行业标准)。

那么,什么是容器?

容器就像虚拟机,但不需要多个操作系统。

理解容器的类比是:

假设你已经搭建了一个网站。现在你想获得一些反馈,于是你把网站文件分享给了你的朋友。你肯定遇到过这种情况:你的朋友由于版本不兼容或其他类似原因无法运行网站。为了避免这种情况,你可以这样做:

图片描述

因此,您需要与朋友共享所有文件(例如,包括依赖项),以便他能够在自己的系统上运行该网站。

这就是所谓的容器。现在你的朋友可以在他的系统上运行你的网站,而不会出现任何错误!

虚拟机与容器:扩展

图片描述

在上图中,虚拟机与容器的对比中,可以看到一个名为“虚拟机管理程序”(hypervisor)的术语。虚拟机管理程序用于在宿主机操作系统上创建多个虚拟机,并管理这些虚拟机。这些虚拟机拥有各自的操作系统,每个操作系统都会分配一定数量的硬件、资源和 CPU。另一方面,容器中只有一个操作系统,以及一个容器引擎(容器引擎包含 Docker 架构部分中介绍的各个组件)。因此,您可以使用容器引擎在同一个操作系统上运行多个应用程序。容器有助于应用程序在隔离的环境中运行(也就是说,运行在容器中的应用程序无法感知容器外部发生的情况)。这反过来也确保了安全性。Docker(由 Docker 公司开发)是一个容器工具,可以帮助我们创建、管理和扩展容器。

接下来,如何将 Docker 安装到你的系统上?

只需按照以下步骤操作:

  • 访问https://docs.docker.com/ - 下载和安装部分 - 根据您的操作系统选择适用于 Mac/Windows/Linux 的 Docker Desktop。非常简单!

安装已完成,但要在系统上运行 Docker 需要哪些设置?

容器运行在宿主机操作系统(即宿主机内核)上。因此,当一个 Windows 应用程序被容器化后,它无法在基于 Linux 的内核上运行,反之亦然。基于 Windows 的容器需要 Windows 内核,基于 Linux 的容器也一样。Docker Desktop 可以以两种模式运行:1) 在 Windows 容器上运行;2) 在 Linux 容器上运行。

对于 Windows 系统,您需要安装 Docker Desktop 和适用于 Linux 的 Windows 子系统 (WSL)。

对于 Mac 系统,只需安装 Docker 桌面即可。

等等,等等,等等!首先,让我们从技术角度了解一下 Docker 是什么:Docker 架构

图片描述

Docker 由三部分组成:
a) Docker 运行时;b) Docker 引擎;c) 编排。
其架构如下:

图片描述

让我们逐一来看这些术语:

a) Docker 运行时:
它帮助我们启动和停止容器。它分为两种类型:
i) 底层运行时,称为 runC:
它与操作系统协同工作,帮助启动和停止容器;
ii) 高层运行时,称为 containerd:
- 它是 CNCF 项目
- 管理 runC 和容器 -
连接到互联网并将镜像拉取到容器中:
拉取镜像意味着将数据从互联网传输到容器。因此,containerd 有助于实现容器与互联网之间的交互。

b) Docker引擎:
用于与Docker交互。它使用Docker守护进程。
该守护进程与Docker运行时协同工作并执行命令。

图表说明:

例如:
Docker CLI 用于编写 Docker 命令。

在命令行界面 (CLI) 中:
Docker run ubuntu

CLI 通过 REST API 将此消息传递给 Docker 守护进程。守护进程与 Docker 运行时交互,并指示其在容器中运行 Ubuntu。

c) 编排:
示例:
假设一个应用程序有 100 个容器。所有容器都运行着该应用程序的版本 1。现在,该应用程序发布了新版本。因此,要更新这些容器,我们可以手动更新,也可以一次性更新所有容器。一次性更新是编排引擎的功能之一。例如 Docker Swarm 和 Kubernetes。

你将如何使用容器与朋友共享文件?

你需要的是一个 Docker 文件。

Docker 文件是一组指令。它包含运行应用程序所需的操作系统文件和依赖项。

运行 Dockerfile 时,我们会得到一个 Docker 镜像。运行该镜像后,我们会得到一个容器。当我们想要容器化一个应用程序时,首先需要编写一个 Dockerfile。该文件将被转换为一个镜像,该镜像可以与其他系统共享。镜像是不可变的。一旦构建完成,构成镜像的文件就不会改变。镜像可以存储在本地,也可以存储在远程位置,例如https://hub.docker.com/。一个镜像可以用于创建多个容器。镜像以层的形式构建。每一层都是一个不可变的文件,但它是文件和目录的集合。最后一层可以用于写入数据。每一层都有一个 ID,它是通过对层内容进行 SHA-256 哈希运算计算得出的。因此,如果层内容发生变化,SHA-256 哈希值也会随之改变。注意:docker 命令(即“docker images”)列出的镜像 ID 是哈希值的前 12 个字符。这些哈希值被称为“标签”。

以下是一些 Docker 命令的实际操作示例:

a)列出 Docker 镜像的哈希值:

$ docker images -q --no-trunc
sha256:3556258649b2ef23a41812be17377d32f568ed9f45150a26466d2ea26d926c32
sha256:9f38484d220fa527b1fb19747638497179500a1bed8bf0498eb788229229e6e1
sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e

Enter fullscreen mode Exit fullscreen mode

请注意上面给出的哈希值的前 12 个字符。

$ docker images
REPOSITORY   TAG     IMAGE ID        
ubuntu       18.04   3556258649b2   
centos       latest  9f38484d220f    
hello-world  latest  fce289e99eb9

Enter fullscreen mode Exit fullscreen mode

现在请注意上面的镜像 ID。哈希值的前 12 个字符等于镜像 ID。
需要注意的是:
两个容器可能共享相同的镜像。因此,当我们尝试运行新容器时,CLI 会显示它正在从已安装该镜像的容器中拉取镜像。这样可以避免重复下载相同的文件,从而加快运行速度。共享镜像通过镜像 ID 进行标识。

b) 从 Docker 镜像仓库拉取镜像:

$ docker images
REPOSITORY      TAG      IMAGE ID     CREATED      SIZE
$ docker pull ubuntu:18.04
18.04: Pulling from library/ubuntu
7413c47ba209: Pull complete
0fe7e7cbb2e8: Pull complete
1d425c982345: Pull complete
344da5c95cec: Pull complete
Digest:sha256:c303f19cfe9ee92badbbbd7567bc1ca47789f79303ddcef56f77687d4744cd7a
Status: Downloaded newer image for ubuntu:18.04
$ docker images
REPOSITORY     TAG        IMAGE ID          CREATED         SIZE
ubuntu         18.04      3556258649b2      9 days ago      64.2MB

Enter fullscreen mode Exit fullscreen mode

c)运行镜像以创建容器:

$ docker run -it ubuntu:18.04
root@4183618bcf17:/# ls
bin boot dev etc home lib lib64 media mnt opt proc root run sbin srv sys tmp usr var
root@4183618bcf17:/# exit
exit

Enter fullscreen mode Exit fullscreen mode

d) 创建您自己的 Docker 镜像:
创建一个名为“Dockerfile”的文件。
默认情况下,Docker 在构建时会查找“Dockerfile”文件。`$ docker build -t myimage:1.0 .`
在构建镜像期间,Dockerfile 文件中 RUN 部分中的命令将被执行。`$ docker run ImageID`
当您使用该镜像创建容器时,Dockerfile 文件中 CMD 部分中的命令将被执行。

Dockerfile 示例:

Dockerfile example:
FROM ubuntu
MAINTAINER Yash <yash@gmail.com>
RUN apt-get update
CMD [“echo”, “Hello World”]

Enter fullscreen mode Exit fullscreen mode

e) 一些基本的图像相关命令:

$ docker pull ubuntu:18.04 (18.04 is tag/version)
$ docker images (Lists Docker Images)
$ docker run image (creates a container out of an image)
$ docker rmi image (deletes a Docker Image if no container is using it)
$ docker rmi $(docker images -q) (deletes all Docker images)

Enter fullscreen mode Exit fullscreen mode

f) 列出容器:

$ docker ps -a
CONTAINER ID   IMAGE          COMMAND       CREATED         STATUS
4183618bcf17   ubuntu:18.04   “/bin/bash”   4 minutes ago   Exited

Enter fullscreen mode Exit fullscreen mode

Docker工作原理的简化解释:

图片描述

假设您 在 CLI(命令行界面)中输入
~ docker run hello-world : 这意味着您想在容器中运行镜像 hello world。

内部发生的情况是,这条消息会通过 REST API 传递给 Docker 守护进程。Docker 守护进程会检查你的系统中是否存在 Hello World 镜像。如果没有,它会从 Docker 镜像仓库下载 Hello World 镜像。Docker 镜像仓库是存储 Docker 镜像的地方。Docker Hub 是一个任何人都可以使用的公共镜像仓库。当你拉取一个镜像时,Docker 默认会在公共镜像仓库中查找该镜像,并将其保存到你本地系统的 DOCKER_HOST 上。你也可以将镜像存储在本地计算机上,或者将其推送到公共镜像仓库。

如果你的系统里有这些镜像文件,它就会直接运行它们。

Docker Hub

有趣的是:现在即使不安装,你也可以在电脑上运行 MongoDB/MySQL 等数据库。

直接运行容器!

结尾:

体验 Docker 的最佳方式莫过于亲自上手实践。本博客旨在普及容器技术。如需深入了解,建议访问 Docker 的GitHub博客

玩得开心!
欢迎在领英上与我联系。

文章来源:https://dev.to/yh010/understanding-containers-docker-54fj