Docker 简介 - Docker 系列第 1 部分
什么是 Docker
虚拟容器的许多理念可以与其物理对应物的历史用途联系起来。传统上,容器使我们能够在一个整体(例如运输船、仓库等)中隔离、存储和运输不同类型的物品。在计算领域,容器化使我们能够在单个主机上分离和运行多个虚拟操作系统。Docker 提供的功能使创建和与这些虚拟系统交互变得简单。
容器化与虚拟机
熟悉虚拟机的读者可能会注意到,容器似乎扮演着类似的角色——没错!然而,容器有一个关键优势,在大多数情况下是更好的选择。虚拟机使用名为“虚拟机管理程序”的软件模拟整个虚拟操作系统(包括虚拟内核)。而 Docker 使用后台进程(守护进程),它能够仅使用主机操作系统的内核来模拟容器的操作系统。这显著减少了启动时间、CPU 内存需求和计算速度,可以为用户节省大量成本(尤其是在使用云服务提供商时)。
Docker 的优势和用例
Docker 是目前最流行的容器系统,由于其丰富的功能和生态系统,使用 Docker 有很多好处。以下列出了 Docker 的一些最显著的功能,后续文章会更详细地介绍这些功能:
- 在开发软件时,很难确保开发人员计算机上的环境和依赖项与远程服务器上的相同。可以将软件加载到容器中并运送到服务器,以确保其行为与本地计算机上的行为相同。
- Docker 容器提供了多种相互交互的方式,允许形成容器网络。
- Docker 已形成一个庞大的社区。您可以使用其他用户的容器蓝图(通常称为“Docker 镜像”)快速设置新的 Docker 容器。借助 DockerHub,许多数据库、监控工具和其他复杂软件都可以立即初始化。
- 许多工具和云提供商都提供 Docker 集成,因为它是行业标准。
安装 Docker
您可以从 Docker Hub 安装适用于 Windows 和 Mac 的安装程序。如果您使用的是 Linux 系统,则需要使用命令行。以下是在 Ubuntu 上安装 Docker 的方法:
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
sudo apt-get update
sudo apt-get install -y docker-ce
sudo service docker start
sudo docker run hello-world
上述代码将安装 Docker 并启动守护进程。Docker 启动并运行后,它会尝试在你的机器上运行一个“hello-world”容器。如果 Docker 在你的电脑上找不到同名的“镜像”,它会尝试从 DockerHub 下载。如果一切顺利,你应该会看到一个“hello world”的提示符。
Docker 镜像到底是什么?
Docker 镜像可以被认为是 Docker 容器的蓝图——每个 Docker 容器都是使用 Docker 镜像构建的。想象一下你第一次启动电脑时,你首先做了哪些步骤?你可能安装了一些需要的软件,并进行了一些配置。你可以用类似的方式理解 Docker 镜像,它本质上是 Docker 构建容器时将执行的步骤的汇总列表。这些步骤定义在 Dockerfile 中——我将在本系列的下一篇讨论如何创建它们。
什么是 DockerHub?
Docker 拥有众多用户,其中许多用户通过名为 DockerHub 的服务公开发布了他们的 Docker 镜像。大多数软件都以 Docker 镜像的形式提供,您可以在几秒钟内下载并运行,无需安装或自定义镜像。DockerHub 上的镜像有版本控制,这意味着您可以选择最适合您技术栈的镜像。实际上,许多公司会为其软件创建官方 Docker 镜像并发布,从而在一定程度上确保您的容器能够按预期运行。由于 DockerHub 提供了所有这些功能,我建议您始终检查要安装的某些软件的镜像是否已存在。
DockerHub 还允许您上传自己的 Docker 镜像。这有几个好处——您可以创建可能对更多用户有用的镜像来帮助社区,或者您可以将应用程序容器上传为私有镜像,然后使用 Docker 客户端直接将其下载到远程服务器。
使用标签进行图像版本控制
Docker 为容器镜像提供了版本控制系统,称为“标签”。在 DockerHub 上,你会看到每个镜像的标签列表,你可以使用这些标签来选择要构建的镜像版本。这些标签通常与容器中运行的软件版本相关,但也可以包含特定的设置或配置。例如,许多供应商会为基于 Alpine Linux 的容器镜像发布标签, Alpine Linux是一个专为在容器中运行而设计的超轻量级 Linux 发行版。
环境变量
与任何操作系统一样,Docker 容器可以拥有环境变量,这些变量有助于定义系统上安装的组件的行为。DockerHub 上的镜像通常包含一系列带有描述的环境变量,这些变量在容器构建后设置,允许用户自定义软件。
什么构成了好的形象?
- 如果 Docker 镜像是“官方”镜像,则可以假定它符合高质量标准
- 镜像仅安装了执行其预期任务所需的必要组件,不会造成不必要的开销
- 它允许用户使用描述性环境变量来配置容器
- 它提供了广泛的标签,允许用户选择可能与其技术栈更好地兼容的旧版本软件
- 确保 Docker 镜像被很多人使用,通常通过特定镜像的下载次数和星级来表示
- 有一些工具(例如 Anchore)可以帮助您分析图像并帮助检测配置中的任何安全漏洞
拉取镜像
在这个例子中,我将使用官方的 MySQL 镜像。执行以下代码后,我看到 docker 开始下载(或“拉取”)MySQL 镜像:
docker pull mysql:8
您可能想知道为什么我在镜像名称中添加了“:8”。如前所述,镜像可以带有标签,通常代表该镜像的不同版本。使用此语法,我的意思是我想要拉取与标签“8”相关的镜像版本,在本例中,这意味着我将获取运行 MySQL 版本 8 的容器的镜像。默认情况下,如果您未指定标签,您将获取最新上传的镜像(也可以通过将“latest”设置为标签来获取)。我通常会为我的 Docker 镜像指定一个标签,这样当我遇到问题时,我就能始终知道应该参考哪个版本——当然,这只是个人偏好。
构建并运行容器
拉取镜像后,docker 会存储镜像以供将来使用。如果要将镜像用于容器,则需要构建并启动容器。注意:如果您执行命令尝试基于本地不存在的镜像运行容器,docker 会自动从 hub 下载该镜像。
docker run --name mysql-container -e MYSQL_ROOT_PASSWORD=password -d mysql:8
上述命令将构建并运行一个名为“mysql-container”的容器。我们的 MySQL 镜像包含多个可指定的参数,这些参数特定于该镜像。通常,您可以在 DockerHub 上查看特定镜像可用的参数(或“环境变量”)。检查官方 MySQL 镜像的变量时,我们发现 MYSQL_ROOT_PASSWORD 变量实际上是必需的。我们希望在通过命令行运行容器时,对每个要定义的变量重复使用模式 -e MY_ENVIRONMENT_VARIABLE=myvalue。
输入上一个命令后,我们要确认我们的新容器已经使用我们定义的镜像构建。输入以下命令:
docker ps
docker stop mysql-container
第一个命令会列出所有正在运行的容器。第二个命令会停止一个容器,容器的名称由我们传入的参数指定,在本例中为“mysql-container”。希望第一个命令能够显示我们的容器确实正在运行!在下一个教程中,我们将深入探讨各种可用的 Docker 命令。
鏂囩珷鏉ユ簮锛�https://dev.to/marcbeaujean/introduction-to-docker-docker-series-part-1-12g5