使用自定义 Dockerfile 构建 Docker 容器

DockerDockerBeginner
立即练习

💡 本教程由 AI 辅助翻译自英文原版。如需查看原文,您可以 切换至英文原版

简介

本教程将指导你完成使用 Dockerfile 创建自定义 Docker 镜像、部署和管理 Docker 应用程序的过程。你将学习从自定义 Dockerfile 构建 Docker 镜像的命令,从而简化你的容器化工作流程并更高效地部署应用程序。

Docker 容器简介

Docker 是一个广受欢迎的开源平台,它使开发者能够在容器化环境中构建、部署和运行应用程序。容器是轻量级、独立且可执行的软件包,其中包含运行应用程序所需的一切,包括代码、运行时环境、系统工具和库。

什么是 Docker?

Docker 是一种工具,旨在通过使用容器来简化创建、部署和运行应用程序的过程。容器允许开发者将应用程序及其所需的所有部件(如库和其他依赖项)打包在一起,并作为一个包进行交付。

Docker 容器的优点

  1. 可移植性:Docker 容器可以在任何环境中一致地运行,从开发者的本地机器到生产服务器,确保应用程序无论在何种底层基础设施上运行,其行为都是相同的。
  2. 可扩展性:Docker 使根据需要轻松扩展应用程序变得容易,通过添加或删除容器即可实现。
  3. 高效性:Docker 容器是轻量级的,并且共享主机操作系统,这使得它们比传统虚拟机更高效。
  4. 一致性:Docker 确保应用程序从开发到生产都以相同的方式运行,消除了“在我的机器上能运行”的问题。

Docker 架构

Docker 使用客户端 - 服务器架构,其中 Docker 客户端与 Docker 守护进程进行通信,Docker 守护进程负责构建、运行和分发 Docker 容器。

graph LD subgraph Docker 架构 client[Docker 客户端] daemon[Docker 守护进程] client -- API --> daemon daemon -- 镜像 --> registry[Docker 镜像仓库] end

Docker 容器与虚拟机对比

虽然容器和虚拟机(VM)都用于在隔离环境中运行应用程序,但它们存在一些关键区别:

特性 Docker 容器 虚拟机
隔离性 容器共享主机的操作系统内核,提供更轻量级的隔离。 虚拟机有自己完整的操作系统,提供更强的隔离。
资源使用 容器更高效,因为它们共享主机资源,无需运行完整的操作系统。 虚拟机需要更多资源,因为每个虚拟机都有自己的操作系统。
启动时间 容器可以在几秒钟内启动,因为它们无需启动完整的操作系统。 虚拟机可能需要几分钟才能启动,因为它们需要启动整个操作系统。

开始使用 Docker

要开始使用 Docker,你需要在系统上安装 Docker 引擎。你可以从 Docker 官方网站(https://www.docker.com/get-started)下载并安装 Docker。安装完成后,你就可以开始使用 Docker 来构建、部署和运行你的应用程序了。

创建自定义 Docker 镜像

创建自定义 Docker 镜像是基于现有基础镜像构建新镜像,然后添加你自己的自定义内容的过程,比如应用程序代码、依赖项和配置。

Dockerfile

Dockerfile 是一个文本文件,其中包含构建 Docker 镜像所需的所有指令。它指定了基础镜像、构建过程中要执行的步骤以及镜像的最终配置。

以下是一个 Dockerfile 示例:

## 使用官方 Ubuntu 22.04 基础镜像
FROM ubuntu:22.04

## 更新软件包索引并安装必要的软件包
RUN apt-get update && apt-get install -y \
  git \
  python3 \
  python3-pip \
  && rm -rf /var/lib/apt/lists/*

## 设置工作目录
WORKDIR /app

## 复制应用程序代码
COPY. /app

## 安装 Python 依赖项
RUN pip3 install --no-cache-dir -r requirements.txt

## 暴露应用程序将运行的端口
EXPOSE 8080

## 设置运行应用程序的命令
CMD ["python3", "app.py"]

构建自定义镜像

要使用 Dockerfile 构建自定义 Docker 镜像,请执行以下步骤:

  1. 在项目目录中创建一个 Dockerfile。

  2. 打开终端并导航到项目目录。

  3. 运行以下命令来构建镜像:

    docker build -t my-custom-image.

    此命令将使用 Dockerfile 中的指令构建一个名为“my-custom-image”的新 Docker 镜像。

将镜像推送到镜像仓库

构建自定义 Docker 镜像后,可以将其推送到 Docker 镜像仓库,如 Docker Hub 或私有镜像仓库,以便在其他系统上共享和部署。

  1. 登录到 Docker 镜像仓库:

    docker login
  2. 使用镜像仓库的 URL 和你的用户名标记镜像:

    docker tag my-custom-image username/my-custom-image:latest
  3. 将镜像推送到镜像仓库:

    docker push username/my-custom-image:latest

现在,你的自定义 Docker 镜像已在镜像仓库中可用,其他开发者可以拉取并使用它,或者将其部署到生产环境中。

部署和管理 Docker 应用程序

创建自定义 Docker 镜像后,就可以部署和管理基于 Docker 的应用程序了。本节将介绍部署和管理 Docker 应用程序所涉及的关键概念和步骤。

部署 Docker 容器

要部署 Docker 容器,可以使用 docker run 命令。该命令基于指定的镜像启动一个新容器,并允许你配置各种选项,如端口映射、环境变量和卷挂载。

以下是基于“my-custom-image”镜像运行容器的示例:

docker run -d -p 8080:8080 -e DB_HOST=192.168.1.100 -v /data:/app/data my-custom-image

此命令将:

  • 以分离模式运行容器(-d
  • 将容器的 8080 端口映射到主机的 8080 端口(-p 8080:8080
  • 设置环境变量 DB_HOST,其值为 192.168.1.100-e DB_HOST=192.168.1.100
  • 将主机目录 /data 挂载到容器的 /app/data 目录(-v /data:/app/data
  • 使用“my-custom-image”镜像启动容器

管理 Docker 容器

Docker 提供了几个命令来管理正在运行的容器:

  • docker ps:列出所有正在运行的容器
  • docker stop <容器ID>:停止正在运行的容器
  • docker start <容器ID>:启动已停止的容器
  • docker logs <容器ID>:查看容器的日志
  • docker exec -it <容器ID> /bin/bash:访问正在运行的容器的 shell

Docker Compose

Docker Compose 是一个工具,允许你定义和管理多容器 Docker 应用程序。它使用 YAML 文件为你的应用程序配置服务、网络和卷。

以下是一个 docker-compose.yml 文件示例:

version: "3"
services:
  web:
    build:.
    ports:
      - "8080:8080"
    environment:
      - DB_HOST=database
    depends_on:
      - database
  database:
    image: mysql:5.7
    environment:
      - MYSQL_DATABASE=myapp
      - MYSQL_ROOT_PASSWORD=secret
    volumes:
      - db-data:/var/lib/mysql

volumes:
  db-data:

此 Compose 文件定义了两个服务:一个 web 服务和一个数据库服务。web 服务从当前目录构建,而数据库服务使用官方 MySQL 5.7 镜像。这些服务通过网络连接,数据库服务的数据持久保存在一个命名卷中。

要部署此应用程序,可以在与 docker-compose.yml 文件相同的目录中运行 docker-compose up -d

扩展 Docker 应用程序

通过添加或删除容器,Docker 使扩展应用程序变得容易。可以使用 Docker Compose 来扩展服务:

docker-compose up -d --scale web=3

此命令将启动三个“web”服务实例。

监控和日志记录

Docker 提供了用于监控和记录容器的内置工具。可以使用 docker stats 命令查看实时资源使用情况,使用 docker logs 命令访问容器的日志。

此外,可以将 Docker 应用程序与外部监控和日志记录工具(如 Prometheus、Grafana 和 Elasticsearch)集成,以获得更高级的见解和功能。

总结

在本教程中,你已经学习了如何使用 Dockerfile 创建自定义 Docker 镜像、部署和管理 Docker 应用程序。你现在知道了从自定义 Dockerfile 构建 Docker 镜像的命令,这使你能够简化容器化过程并更有效地部署应用程序。