DevOps - Docker

我们看到,DevOps 和 Docker 在当今的软件开发和部署中非常重要。它们有助于简化流程并改善团队合作。在本章中,我们将介绍 Docker 的基本思想。我们还将检查其架构以及它在 DevOps 生命周期中的工作方式。

首先,我们将学习如何在 DevOps 环境中设置 Docker。然后,我们将管理映像和容器。之后,我们将查看网络设置。最后,我们将了解如何将 Docker 与 CI/CD 管道连接起来。这将帮助我们更有效地交付软件。

了解 Docker 架构

在 Docker 架构中,我们有许多重要的部分协同工作以帮助我们使用容器化。

Docker 架构的关键组件如下所示 −

  • Docker 守护进程 (dockerd) − 这是负责 Docker 容器、镜像、网络和卷的主要服务。它监听 API 请求并管理容器任务。
  • Docker 客户端 (docker) − 这是我们用来与 Docker 守护进程通信的命令行工具。我们运行 docker run、docker build 和 docker ps 等命令
  • Docker 镜像 −这些是我们用来创建容器的只读模板。我们从 Dockerfile 构建它们。Dockerfile 告诉我们如何制作镜像。
  • Docker 容器 − 这些是 Docker 镜像的运行版本。它们让我们可以在单独的空间中运行应用程序。我们使用命令 docker run 从镜像创建它们。
  • Docker 注册表 − 这是一个存储和共享 Docker 镜像的地方,就像 Docker Hub 一样。它允许我们推送和拉取图像。

在 DevOps 环境中设置 Docker

为了在 DevOps 工作中很好地使用 Docker,我们可以按照这些简单的步骤进行安装和设置。

步骤 1. 安装 Docker

对于 Ubuntu:使用以下命令在 Ubuntu 上安装 Docker −

sudo apt update
sudo apt install apt-transport-https ca-certificates curl software-properties-common
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 update
sudo apt install docker-ce

适用于 Windows / Mac −我们可以从官方网站下载 Docker Desktop 应用程序。

第 2 步。启动 Docker 服务

我们需要使用这些命令启动 Docker 服务 −

sudo systemctl start docker
sudo systemctl enable docker

第 3 步。将用户添加到 Docker 组

为了不使用 sudo 执行 Docker 命令,我们可以将用户添加到 Docker 组 −

sudo usermod -aG docker $USER

不要忘记注销然后重新登录以进行更改工作。

第 4 步。验证安装

我们可以使用这些命令检查 Docker 是否正常工作 −

docker --version
docker run hello-world

第 5 步。配置 Docker Daemon

我们可以编辑 /etc/docker/daemon.json 文件进行一些自定义设置 −

{
  "storage-driver": "overlay2",
  "log-level": "error"
}

之后,我们需要重新启动 Docker 服务 −

sudo systemctl restart docker

现在我们已经准备好 Docker,我们可以开始容器化我们的应用程序并将它们添加到我们的 CI/CD 管道中。

Docker 镜像和容器:最佳实践

如果遵循一些最佳实践,我们可以在 DevOps 环境中很好地使用 Docker 镜像和容器。

Docker 镜像

最小化镜像大小 − 我们应该使用像 alpine 这样的小型基础镜像。这有助于使我们的镜像更小,下载速度更快。

层管理 − 我们可以在一个 RUN 语句中组合命令。这将帮助我们减少层数。例如−

RUN apt-get update && apt-get install -y \
    package1 \
    package2 \
    && rm -rf /var/lib/apt/lists/*

使用 .dockerignore − 就像 .gitignore 一样,我们可以列出要从构建上下文中排除的文件。这也有助于缩小我们的镜像大小。

标记 − 让我们对标记使用语义版本控制。例如,我们可以使用 myapp:1.0.0。我们应该小心使用最新版本。

Docker 容器

资源限制 − 我们需要设置 CPU 和内存的限制。这有助于阻止我们的容器使用过多的资源 −

docker run --memory="256m" --cpus="1.0" myapp

环境变量 − 我们可以使用环境变量进行配置。这样,我们就不会在代码中硬编码敏感信息。

定期更新 − 我们应该保持镜像更新。这有助于修复漏洞。我们需要定期扫描镜像以查找安全问题。

通过遵循这些做法,我们可以提高 Docker 镜像和容器的性能、安全性和维护性。

Docker 网络:概念和配置

我们可以使用 Docker 网络让我们的容器相互通信并与外部系统通信。了解不同的网络模式对于管理好我们的容器非常重要。Docker 为我们提供了几种网络选项 −

桥接网络

这是我们容器的默认网络。它允许容器在同一主机上相互通信

docker network create my_bridge_network
docker run -d --name container1 --network my_bridge_network nginx
docker run -d --name container2 --network my_bridge_network nginx

主机网络

主机网络跳过 Docker 网络堆栈。它将容器直接连接到主机网络。

docker run --network host nginx

覆盖网络

覆盖网络允许不同 Docker 主机上的容器进行通信。当我们使用 Swarm 模式时,它很有用。

docker network create -d overlay my_overlay_network

Macvlan 网络

这使我们的容器拥有自己的 MAC 地址。它们看起来像网络上的真实设备。

docker network create -d macvlan \
  --subnet=192.168.1.0/24 \
  --gateway=192.168.1.1 \
  -o parent=eth0 my_macvlan_network

当我们理解了这些想法和设置后,我们可以在 DevOps 环境中更好地管理 Docker 容器。

使用 Docker Compose 管理 Docker 容器

我们使用 Docker Compose 来帮助管理多容器 Docker 应用程序。它使仅使用一个 YAML 文件定义和运行这些应用程序变得容易。这样,编排变得更简单。

主要功能

  • 服务定义 − 我们在 docker-compose.yml 文件中定义服务、网络和卷。
  • 环境配置 − 我们可以轻松管理容器的环境变量。
  • 扩展 − 我们可以使用简单的命令来扩展或缩小服务。

docker-compose.yml 的基本结构 −

version: '3.8'
services:
  web:
    image: nginx:latest
    ports:
      - "8080:80"
  db:
    image: mysql:5.7
    environment:
      MYSQL_ROOT_PASSWORD: example

常用命令

启动服务 −

docker-compose up

停止服务 −

docker-compose down

扩展服务 −

docker-compose up --scale web=3

使用 Docker Compose 可帮助我们简化应用程序的开发和部署。它使管理多容器设置的依赖项和配置更加容易。

与 Docker 的 CI / CD 集成

通过将 Docker 添加到我们的持续集成和持续部署 (CI/CD) 管道中,我们可以更好地进行开发。 Docker 帮助我们创建一致的构建并使应用程序的部署更加容易。

以下是关键组件 −

Dockerfile − 此文件告诉我们如何构建 Docker 映像。

FROM node:14

WORKDIR /app

COPY package*.json ./

RUN npm install

COPY . .

CMD ["npm", "start"]

CI / CD 工具 − 我们可以将 Jenkins、GitLab CI、CircleCI 和 GitHub Actions 等流行工具与 Docker 结合使用。

管道示例

构建 − 我们从 Dockerfile 创建 Docker 映像。

docker build -t myapp:latest

测试 − 我们在容器内运行测试。

docker run --rm myapp:latest npm test

部署 −我们将镜像推送到注册表并将其部署到生产环境中。

docker push myapp:latest

结论

在本章中,我们了解了 DevOps 框架中 Docker 的基础知识。我们讨论了它的结构以及如何设置它。我们还分享了使用镜像和容器的最佳方法。

网络设置是我们讨论的另一个主题。最后,我们讨论了使用 Docker Compose 管理 Docker。我们还展示了如何将 Docker 添加到 CI/CD 管道中。