如何构建和部署 Docker 容器

DockerBeginner
立即练习

简介

本教程将指导你完成使用 Dockerfile 构建高效 Docker 镜像的过程。你将学习如何理解 Docker 镜像和 Dockerfile,为提高性能优化 Dockerfile 层,管理 Docker 镜像缓存以实现更快的构建,以及利用多阶段构建来创建优化的镜像。在本教程结束时,你将掌握创建精简、高效且易于维护的 Docker 镜像的知识。

Docker 基础

什么是 Docker?

Docker 是一项强大的容器化技术,它彻底改变了软件部署和开发方式。它使开发者能够将应用及其所有依赖项打包成称为容器的标准化单元,确保在不同的计算环境中具有一致的性能。

容器化的核心概念

容器化允许应用在隔离的环境中运行,具有以下几个关键优势:

概念 描述
隔离性 容器独立运行,互不干扰
可移植性 应用可以在不同系统上一致地部署
高效性 与传统虚拟机相比更轻量级

Docker 架构

graph TD A[Docker 客户端] --> B[Docker 守护进程] B --> C[容器运行时] B --> D[镜像仓库] C --> E[容器]

在 Ubuntu 22.04 上安装

## 更新软件包索引
sudo apt update

## 安装依赖项
sudo apt install apt-transport-https ca-certificates curl software-properties-common

## 添加 Docker 的官方 GPG 密钥
curl -fsSL | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg

## 设置稳定仓库
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg]  $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null

## 安装 Docker 引擎
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io

验证 Docker 安装

## 检查 Docker 版本
docker --version

## 测试 Docker 安装
sudo docker run hello-world

关键的 Docker 组件

  1. Docker 客户端:用于与 Docker 交互的命令行界面
  2. Docker 守护进程:管理容器和镜像的后台服务
  3. Docker 镜像:用于创建容器的只读模板
  4. Docker 容器:Docker 镜像的可运行实例

基本的 Docker 命令

## 列出正在运行的容器
docker ps

## 列出所有容器
docker ps -a

## 拉取镜像
docker pull ubuntu

## 运行容器
docker run -it ubuntu /bin/bash

Docker 镜像制作

理解 Docker 镜像

Docker 镜像是只读模板,是创建容器的基础。它们包含运行应用所需的一切,包括代码、运行时环境、库和系统工具。

Dockerfile 基础

Dockerfile 是一个文本文件,包含构建 Docker 镜像的指令。每条指令都会在镜像中创建一个新层。

graph TD A[Dockerfile] --> B[基础镜像] A --> C[复制应用文件] A --> D[安装依赖项] A --> E[配置环境] A --> F[定义启动命令]

一个 Python 应用的示例 Dockerfile

## 使用官方 Python 运行时作为基础镜像
FROM python:3.9-slim

## 设置容器内的工作目录
WORKDIR /app

## 复制需求文件
COPY requirements.txt.

## 安装所需的包
RUN pip install --no-cache-dir -r requirements.txt

## 复制应用代码
COPY..

## 指定端口号
EXPOSE 5000

## 定义运行应用的命令
CMD ["python", "app.py"]

镜像构建策略

策略 描述 使用场景
单阶段构建 简单直接的构建方式 小型、不复杂的应用
多阶段构建 优化镜像大小和安全性 具有构建依赖项的复杂应用

多阶段构建示例

## 阶段 1:构建阶段
FROM maven:3.8.1-openjdk-11 AS build
WORKDIR /app
COPY pom.xml.
COPY src./src
RUN mvn package

## 阶段 2:运行时阶段
FROM openjdk:11-jre-slim
WORKDIR /app
COPY --from=build /app/target/myapp.jar.
EXPOSE 8080
CMD ["java", "-jar", "myapp.jar"]

构建和管理 Docker 镜像

## 构建镜像
docker build -t myapp:v1.

## 列出本地镜像
docker images

## 删除镜像
docker rmi myapp:v1

## 标记镜像
docker tag myapp:v1 myregistry/myapp:latest

镜像优化技巧

  1. 使用最小化的基础镜像
  2. 减少层数
  3. 利用构建缓存
  4. 删除不必要的文件
  5. 使用.dockerignore 文件

Docker 镜像层

graph TD A[基础镜像层] --> B[依赖项安装层] B --> C[应用代码层] C --> D[配置层] D --> E[入口点层]

容器管理

容器生命周期管理

Docker 容器具有复杂的生命周期,包含多个状态和管理策略。了解这些状态对于有效的容器编排至关重要。

graph LR A[已创建] --> B[正在运行] B --> C[已暂停] B --> D[已停止] D --> E[已删除]

基本容器操作

操作 命令 描述
启动 docker start <容器> 重启已停止的容器
停止 docker stop <容器> 优雅地停止正在运行的容器
重启 docker restart <容器> 停止并启动容器
删除 docker rm <容器> 删除容器

高级容器管理

## 在分离模式下运行容器
docker run -d --name webserver nginx

## 检查容器详细信息
docker inspect webserver

## 查看容器日志
docker logs webserver

## 在正在运行的容器内执行命令
docker exec -it webserver /bin/bash

资源管理与限制

## 限制 CPU 和内存
docker run -d \
  --cpus="1.5" \
  --memory="512m" \
  --name limited-container \
  nginx

容器网络

graph TD A[主机网络] --> B[桥接网络] B --> C[自定义网络] C --> D[覆盖网络]

网络配置示例

## 创建自定义网络
docker network create myapp-network

## 在自定义网络中运行容器
docker run -d --network=myapp-network --name db postgres
docker run -d --network=myapp-network --name webapp nginx

扩展容器

## 使用 Docker Compose 进行扩展
version: '3'
services:
webapp:
image: nginx
deploy:
replicas: 5

性能监控

## 实时容器统计信息
docker stats

## 列出正在运行的容器及其资源使用情况
docker ps -q | xargs docker stats --no-stream

容器备份与迁移

## 将容器导出为 tar 存档
docker export 容器名称 > 容器.tar

## 从存档中导入容器
docker import 容器.tar 新镜像名称

总结

在本全面的教程中,你已经学习了如何使用 Dockerfile 构建高效的 Docker 镜像。你探索了 Docker 镜像和 Dockerfile 的基础知识,并发现了优化 Dockerfile 层、管理 Docker 镜像缓存以及利用多阶段构建的技术。通过遵循这些最佳实践,你可以创建更小、构建速度更快且更易于维护的 Docker 镜像,最终改进基于 Docker 的应用程序开发和部署工作流程。