Docker容器化技术:从入门到生产环境部署指南

📅 2026/7/25 6:41:02
Docker容器化技术:从入门到生产环境部署指南
1. Docker 部署与常用命令概述Docker 作为当前最流行的容器化技术已经彻底改变了应用的打包、分发和运行方式。相比传统虚拟机Docker 容器更加轻量级启动速度更快资源占用更少使得一次构建处处运行的理念真正落地。我在实际生产环境中使用 Docker 已有五年多时间从最初的单容器部署到现在的 Kubernetes 集群管理积累了不少实战经验。对于刚接触 Docker 的开发者来说掌握核心部署流程和常用命令是入门的第一步。Docker 的核心优势在于它提供了一套标准化的环境封装方案开发者可以将应用及其所有依赖打包成一个镜像这个镜像在任何安装了 Docker 引擎的机器上都能以完全相同的方式运行彻底解决了在我机器上能跑的问题。2. Docker 环境部署详解2.1 系统要求与准备工作在开始安装 Docker 之前需要确保你的系统满足基本要求。对于 Linux 系统内核版本应在 3.10 以上推荐使用较新的发行版如 Ubuntu 20.04 LTS 或 CentOS 8。Windows 系统需要 Windows 10 专业版/企业版或 Windows Server 2016 及以上版本并开启 Hyper-V 功能。注意生产环境强烈建议使用 Linux 系统Windows 上的 Docker 主要用于开发和测试。对于 Linux 系统还需要进行一些前置配置# 更新软件包索引 sudo apt-get update # 安装必要的依赖包 sudo apt-get install -y apt-transport-https ca-certificates curl gnupg lsb-release2.2 Docker 引擎安装步骤不同操作系统的安装方式有所差异以下是主流系统的安装方法Ubuntu/Debian 系统# 添加 Docker 官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg # 设置稳定版仓库 echo deb [archamd64 signed-by/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable | sudo tee /etc/apt/sources.list.d/docker.list /dev/null # 安装 Docker 引擎 sudo apt-get update sudo apt-get install -y docker-ce docker-ce-cli containerd.io # 验证安装 sudo docker run hello-worldCentOS/RHEL 系统# 卸载旧版本 sudo yum remove docker docker-client docker-client-latest docker-common docker-latest docker-latest-logrotate docker-logrotate docker-engine # 安装必要工具 sudo yum install -y yum-utils # 设置仓库 sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo # 安装 Docker 引擎 sudo yum install -y docker-ce docker-ce-cli containerd.io # 启动 Docker sudo systemctl start docker sudo systemctl enable docker # 验证安装 sudo docker run hello-world2.3 安装后配置与优化安装完成后建议进行以下配置优化非 root 用户使用 Docker# 将当前用户加入 docker 组 sudo usermod -aG docker $USER # 需要重新登录使更改生效配置 Docker 镜像加速器国内用户必备# 创建或修改 /etc/docker/daemon.json sudo tee /etc/docker/daemon.json -EOF { registry-mirrors: [https://registry.docker-cn.com] } EOF # 重启 Docker 服务 sudo systemctl daemon-reload sudo systemctl restart docker日志文件大小限制# 修改 /etc/docker/daemon.json 添加以下内容 { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }3. Docker 核心概念解析3.1 镜像(Image)与容器(Container)Docker 镜像是一个只读模板包含了运行应用所需的所有内容代码、运行时环境、库、环境变量和配置文件。容器则是镜像的运行实例可以被启动、停止、删除等。两者的关系可以类比为镜像是类(Class)容器是对象(Object)3.2 仓库(Registry)Docker 仓库用于存储和分发 Docker 镜像。Docker Hub 是默认的公共仓库企业也可以搭建私有仓库。常用仓库类型公共仓库Docker Hub、Quay.io私有仓库Harbor、Nexus Repository3.3 Dockerfile 与构建上下文Dockerfile 是一个文本文件包含了一系列指令用于自动化构建 Docker 镜像。构建上下文是指 Dockerfile 所在目录及其子目录构建时这些文件会被发送到 Docker 守护进程。4. Docker 常用命令全解析4.1 镜像相关命令搜索镜像docker search nginx拉取镜像docker pull nginx:latest列出本地镜像docker images # 或 docker image ls删除镜像docker rmi nginx # 强制删除 docker rmi -f nginx查看镜像详情docker inspect nginx构建镜像docker build -t myapp:1.0 . # -t 指定镜像名称和标签 # . 表示当前目录为构建上下文4.2 容器相关命令运行容器docker run -d -p 8080:80 --name mynginx nginx # -d 后台运行 # -p 端口映射(主机端口:容器端口) # --name 指定容器名称列出运行中的容器docker ps # 列出所有容器(包括停止的) docker ps -a停止/启动/重启容器docker stop mynginx docker start mynginx docker restart mynginx进入运行中的容器docker exec -it mynginx bash # -i 保持STDIN打开 # -t 分配伪终端查看容器日志docker logs mynginx # 实时查看日志 docker logs -f mynginx删除容器docker rm mynginx # 强制删除运行中的容器 docker rm -f mynginx查看容器资源使用docker stats mynginx4.3 网络与存储管理列出网络docker network ls创建网络docker network create mynet连接容器到网络docker network connect mynet mynginx查看数据卷docker volume ls创建数据卷docker volume create myvol挂载数据卷docker run -d -v myvol:/data --name myapp nginx4.4 系统与维护命令查看 Docker 系统信息docker info清理无用资源# 删除所有停止的容器 docker container prune # 删除所有未被使用的镜像 docker image prune -a # 删除所有未被使用的网络 docker network prune # 删除所有未被使用的卷 docker volume prune # 一键清理所有无用资源 docker system prune -a查看 Docker 版本docker version5. Docker 实战技巧与常见问题5.1 容器化应用的调试技巧查看容器进程docker top mynginx复制文件到容器docker cp localfile.txt mynginx:/path/in/container从容器复制文件docker cp mynginx:/path/in/container/file.txt localfile.txt修改容器配置后提交为新镜像docker commit mynginx mynginx:modified5.2 常见问题与解决方案问题1端口冲突错误现象Error starting userland proxy: listen tcp 0.0.0.0:80: bind: address already in use解决方案更改主机端口docker run -p 8080:80 ...停止占用端口的服务使用netstat -tulnp | grep 80查找并终止占用进程问题2存储空间不足错误现象No space left on device解决方案清理无用镜像和容器docker system prune -a调整 Docker 存储驱配置增加磁盘空间或迁移 Docker 数据目录问题3容器启动后立即退出错误现象容器启动后状态变为 Exited排查步骤查看容器日志docker logs container_id检查容器启动命令是否正确确保容器内有前台进程运行问题4DNS 解析失败错误现象容器内无法解析域名解决方案指定 DNS 服务器docker run --dns 8.8.8.8 ...修改 Docker 守护进程配置/etc/docker/daemon.json中添加dns: [8.8.8.8, 8.8.4.4]5.3 性能优化建议合理使用 .dockerignore 文件避免将不必要的文件加入构建上下文可以显著加快构建速度。多阶段构建对于编译型语言应用使用多阶段构建可以减小最终镜像大小。# 第一阶段构建环境 FROM golang:1.16 AS builder WORKDIR /app COPY . . RUN go build -o myapp . # 第二阶段运行环境 FROM alpine:latest WORKDIR /app COPY --frombuilder /app/myapp . CMD [./myapp]合理设置资源限制docker run -d --memory512m --cpus1.5 myapp使用 volumes 而非容器内存储对于需要持久化的数据始终使用 volumes 或绑定挂载。6. Docker 进阶使用场景6.1 使用 Docker Compose 管理多容器应用Docker Compose 允许通过 YAML 文件定义和运行多容器应用。一个典型的docker-compose.yml示例version: 3 services: web: image: nginx:latest ports: - 8080:80 volumes: - ./html:/usr/share/nginx/html depends_on: - db db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example volumes: - db_data:/var/lib/mysql volumes: db_data:常用命令# 启动服务 docker-compose up -d # 停止服务 docker-compose down # 查看服务状态 docker-compose ps # 构建并启动 docker-compose up -d --build6.2 编写高效的 Dockerfile最佳实践使用官方镜像作为基础合理安排指令顺序变化频率低的指令放前面合并 RUN 指令减少镜像层使用特定标签而非 latest清理不必要的文件示例优化前后的 Dockerfile 对比优化前FROM ubuntu RUN apt-get update RUN apt-get install -y python RUN apt-get install -y python-pip RUN pip install flask COPY . /app WORKDIR /app CMD [python, app.py]优化后FROM python:3.9-slim WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY . . CMD [python, app.py]6.3 容器日志管理配置日志驱动{ log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }查看日志# 显示最后100行 docker logs --tail 100 mynginx # 显示特定时间后的日志 docker logs --since 2023-01-01T00:00:00 mynginx # 显示特定时间段的日志 docker logs --since 2023-01-01T00:00:00 --until 2023-01-02T00:00:00 mynginx日志驱动选项json-file (默认)syslogjournaldgelffluentd6.4 容器安全实践不使用 root 用户运行容器FROM alpine RUN adduser -D myuser USER myuser CMD [sh]定期更新基础镜像docker pull nginx:latest扫描镜像漏洞docker scan nginx限制容器能力docker run --cap-drop ALL --cap-add NET_BIND_SERVICE nginx设置只读文件系统docker run --read-only nginx7. Docker 生产环境部署建议7.1 容器编排选择对于生产环境单机 Docker 通常不足以满足需求需要考虑容器编排系统Kubernetes功能最强大适合大规模集群Docker SwarmDocker 原生简单易用Nomad轻量级适合简单场景7.2 监控与告警常用监控工具cAdvisor容器资源监控Prometheus Grafana指标收集与可视化ELK Stack日志收集与分析基础监控命令# 实时监控容器资源使用 docker stats # 查看容器详细信息 docker inspect mynginx # 查看容器进程 docker top mynginx7.3 备份与恢复策略镜像备份# 保存镜像为tar文件 docker save -o nginx.tar nginx:latest # 从tar文件加载镜像 docker load -i nginx.tar数据卷备份# 创建备份容器 docker run --rm --volumes-from mynginx -v $(pwd):/backup busybox tar cvf /backup/nginx-backup.tar /usr/share/nginx/html恢复数据卷docker run --rm --volumes-from mynginx -v $(pwd):/backup busybox tar xvf /backup/nginx-backup.tar -C /7.4 持续集成/持续部署(CI/CD)集成典型 CI/CD 流程代码提交触发构建Docker 构建新镜像推送镜像到仓库部署到测试环境运行测试部署到生产环境示例 GitLab CI 配置stages: - build - test - deploy build: stage: build script: - docker build -t myapp:$CI_COMMIT_SHA . - docker push myapp:$CI_COMMIT_SHA test: stage: test script: - docker run myapp:$CI_COMMIT_SHA npm test deploy: stage: deploy script: - kubectl set image deployment/myapp myappmyapp:$CI_COMMIT_SHA