如何高效构建和管理 Docker 容器

DockerDockerBeginner
立即练习

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

简介

本全面的 Docker 教程为开发者和 IT 专业人员深入介绍了容器化技术。通过探索 Docker 的核心概念、架构和实际实施策略,学习者将获得在不同计算环境中打包、部署和管理应用程序的实用技能。

Docker 基础

什么是 Docker?

Docker 是一个强大的容器化平台,它彻底改变了应用程序的部署和开发方式。作为一项开源技术,Docker 使开发者能够在不同的计算环境中一致地打包、分发和运行应用程序。

Docker 的核心概念

容器与虚拟机

graph TD A[物理硬件] --> B[Docker 容器] A --> C[虚拟机] B --> D[轻量级] B --> E[共享操作系统内核] C --> F[重量级] C --> G[完整操作系统开销]
特性 Docker 容器 虚拟机
资源使用 轻量级 资源密集型
启动时间 秒级 分钟级
隔离级别 进程级 整个系统

Docker 架构

Docker 使用客户端 - 服务器架构,包含以下关键组件:

  • Docker 守护进程
  • Docker 客户端
  • Docker 镜像仓库
  • Docker 镜像
  • Docker 容器

基本的 Docker 命令

在 Ubuntu 22.04 上安装 Docker:

## 更新系统软件包
sudo apt update

## 安装 Docker 依赖项
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

## 设置 Docker 仓库
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 安装
sudo docker --version

运行你的第一个容器

## 拉取 Ubuntu 镜像
sudo docker pull ubuntu:latest

## 运行一个交互式容器
sudo docker run -it ubuntu:latest /bin/bash

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

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

镜像管理

## 搜索镜像
sudo docker search nginx

## 下载一个镜像
sudo docker pull nginx

## 列出本地镜像
sudo docker images

容器网络

Docker 网络类型

graph TD A[Docker 网络类型] --> B[桥接网络] A --> C[主机网络] A --> D[无网络] A --> E[覆盖网络]
网络类型 描述 使用场景
桥接 默认网络 隔离容器通信
主机 直接使用主机网络 对性能要求极高的应用程序
无网络 无网络访问权限 完全隔离的容器
覆盖 多主机网络 分布式容器系统

端口映射技术

基本端口映射

## 将容器端口 80 映射到主机端口 8080
sudo docker run -p 8080:80 nginx

## 映射多个端口
sudo docker run -p 8080:80 -p 3306:3306 myapp

网络管理命令

## 列出 Docker 网络
sudo docker network ls

## 创建自定义网络
sudo docker network create mynetwork

## 将容器连接到网络
sudo docker network connect mynetwork mycontainer

## 检查网络详细信息
sudo docker network inspect bridge

高级网络场景

## 创建自定义桥接网络
sudo docker network create --driver bridge isolated_network

## 在自定义网络中运行容器
sudo docker run -d --name web1 --network isolated_network nginx
sudo docker run -d --name web2 --network isolated_network httpd

网络隔离策略

## 禁用外部网络访问
sudo docker run --network none mycontainer

## 直接使用主机网络
sudo docker run --network host mycontainer

容器 DNS 解析

## 启用容器之间的自动 DNS
sudo docker run --name db-container mysql
sudo docker run --name app-container --link db-container:database myapp

高级 Docker 技术

容器资源管理

graph TD A[资源管理] --> B[CPU 限制] A --> C[内存约束] A --> D[存储配额]

资源分配示例

## 将容器限制为 1 个 CPU 核心和 512MB 内存
sudo docker run -it --cpus=1 --memory=512m ubuntu /bin/bash

## 设置内存和交换空间限制
sudo docker run -it --memory=1g --memory-swap=2g ubuntu /bin/bash

使用 Docker Compose 进行多容器部署

version: "3"
services:
  web:
    image: nginx
    ports:
      - "8080:80"
  database:
    image: postgres
    environment:
      POSTGRES_PASSWORD: mysecretpassword

安全最佳实践

安全技术 实施方法
非 root 容器 在 Dockerfile 中使用 USER 指令
只读文件系统 在卷挂载中添加 :ro 标志
限制容器能力 使用 --cap-drop 和 --cap-add

使用 Docker Swarm 进行容器编排

## 初始化 Swarm 集群
sudo docker swarm init

## 创建带有副本的服务
sudo docker service create --replicas 3 --name web nginx

## 动态扩展服务
sudo docker service scale web=5

高级网络配置

## 使用子网创建自定义网络
sudo docker network create \
  --driver bridge \
  --subnet 192.168.0.0/24 \
  --gateway 192.168.0.1 \
  custom_network

容器监控与日志记录

## 实时查看容器日志
sudo docker logs -f container_name

## 检查容器指标
sudo docker stats container_name

## 限制日志文件大小
sudo docker run --log-driver json-file \
  --log-opt max-size=10m \
  --log-opt max-file=3 \
  nginx

Dockerfile 优化技术

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

FROM openjdk:11-jre-slim
COPY --from=build /home/app/target/app.jar /app.jar
ENTRYPOINT ["java","-jar","/app.jar"]

总结

Docker 代表了一种变革性的软件部署方法,提供轻量级、可移植且高效的容器化解决方案。通过掌握 Docker 的基本概念、架构和命令行技术,开发者可以简化应用程序开发、提高系统一致性,并增强整体基础设施的可扩展性和性能。