📜  使用 Docker 容器化

📅  最后修改于: 2021-10-19 06:01:25             🧑  作者: Mango

Docker是容器化平台,用于将您的应用程序及其所有依赖项以容器的形式打包在一起,以确保您的应用程序在任何开发、测试或生产环境中都能无缝运行。 Docker 是一种工具,旨在通过使用容器更轻松地创建、部署和运行应用程序。

Docker 是世界领先的软件容器平台。它由一家名为 Dotcloud, Inc 的公司于 2013 年推出,该公司后来更名为 Docker, Inc。它是用 Go 语言编写的。 Docker 推出仅 6 年时间,但社区已经从 VM 转向它。 Docker 旨在使开发人员和系统管理员都受益,使其成为许多 DevOps 工具链的一部分。开发人员可以编写代码而无需担心测试和生产环境。系统管理员无需担心基础设施,因为 Docker 可以轻松扩展和缩减系统数量。 Docker 在软件开发周期的部署阶段发挥作用。

容器化

容器化是基于操作系统的虚拟化,它在用户空间中创建多个虚拟单元,称为容器。容器共享相同的主机内核,但通过操作系统级别的私有命名空间和资源控制机制相互隔离。与管理程序相比,基于容器的虚拟化在虚拟化和隔离方面提供了不同级别的抽象。管理程序使用大量硬件,这导致虚拟化硬件和虚拟设备驱动程序的开销。在每个虚拟机实例中,一个完整的操作系统(例如 -Linux、Windows)运行在这个虚拟化硬件之上。
但相比之下,容器在操作系统层面实现了进程的隔离,从而避免了这种开销。这些容器运行在底层主机的相同共享操作系统内核之上,并且一个或多个进程可以在每个容器内运行。在容器中,您不必预先分配任何 RAM,它是在创建容器期间动态分配的,而在 VM 中,您需要先预先分配内存,然后再创建虚拟机。与虚拟机相比,容器化具有更好的资源利用率和较短的启动过程。它是虚拟化的下一个演变。

容器几乎可以在任何地方运行,非常容易开发和部署:在 Linux、Windows 和 Mac 操作系统上;在虚拟机或裸机上,在开发人员的机器上或在本地数据中心;当然,在公共云中。容器在操作系统级别虚拟化 CPU、内存、存储和网络资源,为开发人员提供与其他应用程序逻辑隔离的操作系统沙盒视图。 Docker 是最流行的开源容器格式,并且受 Google Cloud Platform 和 Google Kubernetes Engine 支持。

Docker 架构

Docker 架构由 Docker 客户端、运行在 Docker Host 上的 Docker Daemon 和 Docker Hub 存储库组成。 Docker 具有客户端-服务器架构,其中客户端使用 REST API、套接字 IO 和 TCP 的组合与运行在 Docker 主机上的 Docker 守护程序进行通信。如果我们必须构建 Docker 镜像,那么我们使用客户端向 Docker Daemon 执行构建命令,然后 Docker Daemon 根据给定的输入构建镜像并将其保存到 Docker 注册表中。如果您不想创建映像,则只需从客户端执行 pull 命令,然后 Docker Daemon 将从 Docker Hub 拉取映像,最后如果我们想运行该映像,则从客户端执行 run 命令,这将创建容器。

Docker 的组件

Docker 的主要组件包括 – Docker 客户端和服务器、Docker 镜像、Dockerfile、Docker 注册表和 Docker 容器。以下部分详细解释了这些组件:

  1. Docker 客户端和服务器——Docker 具有客户端-服务器架构。 Docker Daemon/Server 由所有容器组成。 Docker Daemon/Server 通过 CLI 或 REST API 接收来自 Docker 客户端的请求,并因此相应地处理请求。 Docker 客户端和守护进程可以存在于同一主机或不同主机上。

  1. Docker 镜像– Docker 镜像用于使用只读模板构建 docker 容器。每个图像的基础都是一个基础图像,例如。基础镜像,例如 – ubuntu14.04 LTS、Fedora 20。基础镜像也可以从头开始创建,然后可以通过修改将所需的应用程序添加到基础镜像中,因此创建新镜像的过程称为“提交更改” .
  2. Docker 文件– Dockerfile 是一个文本文件,其中包含有关如何构建 Docker 映像的一系列说明。此映像包含所有项目代码及其依赖项。同一个 Docker 镜像可用于旋转“n”个容器,每个容器都对底层镜像进行修改。最终的镜像可以上传到 Docker Hub 并在不同的协作者之间共享以进行测试和部署。您需要在 Docker 文件中使用的命令集包括 FROM、CMD、ENTRYPOINT、VOLUME、ENV 等等。
  3. Docker Registry – Docker Registry 是 Docker 镜像的存储组件。我们可以将图像存储在公共/私有存储库中,以便多个用户可以协作构建应用程序。 Docker Hub 是 Docker 自己的云存储库。 Docker Hub 被称为公共注册中心,每个人都可以在其中拉取可用镜像并推送自己的镜像,而无需从头开始创建镜像。
  4. Docker 容器——Docker 容器是 Docker 镜像的运行时实例。容器包含应用程序所需的整个工具包,因此应用程序可以以隔离的方式运行。例如-假设有一个带有 NGINX SERVER 的 Ubuntu 操作系统镜像,当这个镜像使用 docker run 命令运行时,那么一个容器将被创建并且 NGINX SERVER 将在 Ubuntu 操作系统上运行。

Docker 撰写

Docker Compose 是一个工具,我们可以使用它来创建多容器应用程序。它使配置和
运行由多个容器组成的应用程序。例如,假设您有一个需要 WordPress 和 MySQL 的应用程序,您可以创建一个文件,将这两个容器作为服务启动,而无需分别启动每个容器。我们在 YAML 文件中定义了一个多容器应用程序。使用 docker-compose up 命令,我们可以在前台启动应用程序。 Docker-compose 将在当前文件夹中查找 docker-compose.yaml 文件以启动应用程序。通过在 docker-compose up 命令中添加 -d 选项,我们可以在后台启动应用程序。为 WordPress 应用程序创建 docker-compose.yaml 文件:

#cat docker-compose.yaml
version: ’2’
services:
db:
image: mysql:5.7
volumes:db_data:/var/lib/mysql
restart: always
environment:
MYSQL_ROOT_PASSWORD: wordpress
MYSQL_DATABASE: wordpress
MYSQL_USER: wordpress
MYSQL_PASSWORD: wordpress
wordpress:
depends_on:
- db
image: wordpress:latest
ports:
- "8000:80"
restart: always
environment:
WORDPRESS_DB_HOST: db:3306

WORDPRESS_DB_PASSWORD: wordpress
volumes:
db_data:

在这个 docker-compose.yaml 文件中,我们有以下 WordPress 容器的端口部分,这意味着我们要将主机的 8000 端口映射到容器的 80 端口。这样主机就可以使用其 IP 和端口号访问应用程序。

码头工人网络

默认情况下,当我们创建和运行容器时,Docker 会自行为其分配一个 IP 地址。大多数时候,需要根据我们的需要创建和部署 Docker 网络。因此,Docker 让我们根据我们的要求设计网络。 Docker 网络分为三种类型——默认网络、用户定义网络和覆盖网络。

要获取 Docker 创建的所有默认网络的列表,我们运行如下所示的命令 –

Docker 中有三种类型的网络——

  1. 桥接网络:当创建一个不带 –network 参数的新 Docker 容器时,Docker 默认将容器与桥接网络连接。在桥接网络中,单个主机中的所有容器都可以通过它们的 IP 地址相互连接。当 Docker 主机的跨度为 1 时,即所有容器都运行在单个主机上时,会创建桥接网络。我们需要一个覆盖网络来创建一个跨度超过一个 Docker 主机的网络。
  2. 主机网络:当使用 –network=host 参数创建新的 Docker 容器时,它将容器推送到运行 Docker 守护程序的主机网络堆栈中。主机的所有接口都可以从分配给主机网络的容器访问。
  3. None network :当使用 –network=none 参数创建新的 Docker 容器时,它会将 Docker 容器放在自己的网络堆栈中。因此,在这个 none 网络中,没有为容器分配 IP 地址,因此它们无法相互通信。

我们可以将任何一个网络分配给 Docker 容器。 “docker run”命令的 –network 选项用于为容器分配特定网络。

$docker run --network ="network name"

要获取有关特定网络的详细信息,我们使用命令 –

$docker network inspect "network name"

Docker的优势——

由于 Docker 容器提供的好处,Docker 现在变得流行起来。 Docker 的主要优点是:

  1. 速度——与虚拟机相比,Docker 容器的速度非常快。构建容器所需的时间非常快,因为它们小巧轻便。由于容器很小,开发、测试和部署可以更快地完成。容器可以在构建完成后推送进行测试,然后从那里推送到生产环境。
  2. 可移植性——构建在 docker 容器中的应用程序非常便携。这些便携式应用程序可以作为单个元素轻松移动到任何地方,并且它们的性能也保持不变。
  3. 可扩展性——Docker 具有可以部署在多个物理服务器、数据服务器和云平台的能力。它也可以在每台 Linux 机器上运行。容器可以很容易地从云环境移动到本地主机,然后再从那里快速移动回云。
  4. 密度– Docker 使用更有效的资源,因为它不使用虚拟机管理程序。这就是与虚拟机相比,可以在单个主机上运行更多容器的原因。 Docker Containers 具有更高的性能,因为它们的高密度和没有资源的开销浪费。