1. Docker 初体验五分钟跑通第一个容器刚接触 Docker 的新手最需要的就是快速获得正反馈。我们先抛开复杂概念用最简步骤感受容器技术的魔力。打开终端执行以下命令docker run hello-world这个经典示例会触发一系列自动化操作Docker 首先检查本地是否存在 hello-world 镜像如果没有就从默认的 Docker Hub 拉取接着创建容器并执行其中的程序最终输出 Hello from Docker! 的欢迎信息。整个过程完全隔离在容器环境中不会影响宿主机的任何配置。注意首次运行若出现权限错误需要在命令前加sudo或以非 root 用户加入 docker 用户组具体配置见第3章成功运行后可以尝试更有趣的交互式容器docker run -it ubuntu bash这里的-it参数组合表示开启交互终端你会进入一个全新的 Ubuntu 系统环境。可以自由执行ls、apt update等命令所有改动都只存在于当前容器生命周期内。按CtrlD退出后这个临时系统就会消失——这就是容器轻量化的最佳体现。2. 核心概念三重奏镜像、容器与仓库2.1 镜像容器的基因蓝图镜像好比是容器的安装包包含运行所需的所有依赖和配置。通过docker images查看本地镜像列表你会注意到几个关键字段REPOSITORY镜像来源如 ubuntu、nginxTAG版本标识默认 latest 表示最新版IMAGE ID唯一哈希值用于精确指定镜像SIZE占用空间显示容器化带来的轻量化优势实际操作中我们经常需要拉取特定版本的镜像docker pull nginx:1.21-alpine这个命令获取的是经过 Alpine Linux 优化的 Nginx 1.21 版本体积不足官方版本的1/3非常适合生产环境使用。2.2 容器镜像的运行实例通过docker ps -a可以看到所有容器包括已停止的其状态流转如下图所示创建容器 → 运行中 → 暂停 → 停止 → 删除几个常用生命周期命令# 启动/停止容器 docker start/stop [CONTAINER_ID] # 进入运行中的容器推荐exec方式 docker exec -it [CONTAINER_ID] bash # 删除停止的容器 docker rm [CONTAINER_ID]经验生产环境慎用--rm参数虽然它能自动清理停止的容器但会丢失排错所需的运行日志。2.3 仓库镜像的AppStoreDocker Hub 是最著名的公共仓库但国内访问速度较慢。建议配置镜像加速器// /etc/docker/daemon.json { registry-mirrors: [ https://hub-mirror.c.163.com, https://mirror.baidubce.com ] }企业级场景需要搭建私有仓库Harbor 是目前最成熟的开源方案提供漏洞扫描、权限管理等进阶功能。3. 环境配置全攻略3.1 主流系统安装指南Windows/macOS官方 Docker Desktop 提供一体化解决方案务必开启 WSL2 后端Windows或 VirtioFS 加速macOSLinux 发行版# Ubuntu示例 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # 验证安装 sudo docker run hello-world避坑提示CentOS 8 默认使用 podman 替代 docker如需原生 Docker 需额外配置3.2 权限优化方案默认需要 sudo 执行 docker 命令存在安全隐患建议将用户加入 docker 组sudo usermod -aG docker $USER newgrp docker # 立即生效无需重启验证权限docker ps # 不报错即配置成功4. Dockerfile 深度实践4.1 编写高效构建脚本一个优化的 Python 应用 Dockerfile 示例# 阶段1构建环境 FROM python:3.9-slim as builder WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt # 阶段2运行环境 FROM python:3.9-slim WORKDIR /app # 从builder阶段复制已安装的包 COPY --frombuilder /root/.local /root/.local COPY . . # 确保脚本可执行且路径正确 ENV PATH/root/.local/bin:$PATH CMD [python, main.py]这个多阶段构建方案能显著减小最终镜像体积关键优化点包括使用 slim 版本基础镜像分离构建和运行环境精准控制文件复制范围4.2 构建缓存妙用docker build命令会逐层缓存合理排序指令可加速构建# 错误示例变动频繁的指令在前 COPY . . RUN apt-get update apt-get install -y python3 # 正确示例将变动少的指令前置 RUN apt-get update apt-get install -y python3 COPY . .通过--no-cache参数可强制全新构建docker build --no-cache -t myapp .5. 实战项目部署Web应用5.1 单容器部署方案以 Flask 应用为例的完整流程准备应用代码和 Dockerfile构建镜像docker build -t flask-demo .运行容器并映射端口docker run -d -p 5000:5000 --name myflask flask-demo访问 http://localhost:5000 验证5.2 多容器编排方案当应用需要数据库等服务时推荐使用 docker-compose.ymlversion: 3 services: web: build: . ports: - 5000:5000 depends_on: - redis redis: image: redis:alpine volumes: - redis_data:/data volumes: redis_data:启动命令docker-compose up -d这种声明式配置能自动处理网络联通、依赖启动顺序等问题。6. 数据持久化策略6.1 三种挂载方式对比类型宿主位置生命周期适用场景匿名卷/var/lib/docker/volumes随容器删除临时数据命名卷/var/lib/docker/volumes独立于容器数据库文件绑定挂载用户指定路径完全由用户控制开发环境代码同步6.2 数据库实战示例MySQL 容器推荐使用命名卷持久化docker run -d \ --name mysql8 \ -v mysql_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDsecret \ mysql:8.0查看卷信息docker volume inspect mysql_data7. 网络配置精要7.1 默认网络模式# 查看所有网络 docker network ls # 创建自定义网络 docker network create mynet7.2 容器互联方案在自定义网络中启动的容器会自动相互发现docker run -d --net mynet --name web nginx docker run -it --net mynet alpine ping web这种基于DNS的服务发现极大简化了微服务架构的部署复杂度。8. 生产环境最佳实践8.1 资源限制配置防止单个容器耗尽系统资源docker run -d \ --memory512m \ --cpus1.5 \ --pids-limit100 \ nginx8.2 日志管理方案推荐采用 json-file 日志驱动并配置轮转// /etc/docker/daemon.json { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }查看日志docker logs --tail 100 -f [CONTAINER_ID]9. 常见问题排雷指南9.1 镜像下载失败典型报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled解决方案检查镜像加速器配置尝试更换DNS如8.8.8.8使用代理需符合企业网络政策9.2 端口冲突处理当出现Bind for 0.0.0.0:80 failed: port is already allocated时# 查找占用进程 sudo lsof -i :80 # 或者停止冲突容器 docker stop $(docker ps -q --filter publish80)10. 学习路径推荐根据角色定制学习重点开发人员进阶路线掌握 Dockerfile 优化技巧学习多阶段构建实践 CI/CD 集成了解 BuildKit 高级特性运维人员深造方向集群管理工具Swarm/K8s监控方案PrometheusGranfa安全扫描Trivy/Clair日志收集ELK/Fluentd我个人的经验是Docker 就像编程语言一样20%的核心功能能满足80%的日常需求。建议先熟练掌握本教程涉及的基础操作再根据实际工作需要深入特定领域。遇到问题时善用--help参数和官方文档往往比盲目搜索更高效。
Docker入门指南:从容器基础到实战部署
1. Docker 初体验五分钟跑通第一个容器刚接触 Docker 的新手最需要的就是快速获得正反馈。我们先抛开复杂概念用最简步骤感受容器技术的魔力。打开终端执行以下命令docker run hello-world这个经典示例会触发一系列自动化操作Docker 首先检查本地是否存在 hello-world 镜像如果没有就从默认的 Docker Hub 拉取接着创建容器并执行其中的程序最终输出 Hello from Docker! 的欢迎信息。整个过程完全隔离在容器环境中不会影响宿主机的任何配置。注意首次运行若出现权限错误需要在命令前加sudo或以非 root 用户加入 docker 用户组具体配置见第3章成功运行后可以尝试更有趣的交互式容器docker run -it ubuntu bash这里的-it参数组合表示开启交互终端你会进入一个全新的 Ubuntu 系统环境。可以自由执行ls、apt update等命令所有改动都只存在于当前容器生命周期内。按CtrlD退出后这个临时系统就会消失——这就是容器轻量化的最佳体现。2. 核心概念三重奏镜像、容器与仓库2.1 镜像容器的基因蓝图镜像好比是容器的安装包包含运行所需的所有依赖和配置。通过docker images查看本地镜像列表你会注意到几个关键字段REPOSITORY镜像来源如 ubuntu、nginxTAG版本标识默认 latest 表示最新版IMAGE ID唯一哈希值用于精确指定镜像SIZE占用空间显示容器化带来的轻量化优势实际操作中我们经常需要拉取特定版本的镜像docker pull nginx:1.21-alpine这个命令获取的是经过 Alpine Linux 优化的 Nginx 1.21 版本体积不足官方版本的1/3非常适合生产环境使用。2.2 容器镜像的运行实例通过docker ps -a可以看到所有容器包括已停止的其状态流转如下图所示创建容器 → 运行中 → 暂停 → 停止 → 删除几个常用生命周期命令# 启动/停止容器 docker start/stop [CONTAINER_ID] # 进入运行中的容器推荐exec方式 docker exec -it [CONTAINER_ID] bash # 删除停止的容器 docker rm [CONTAINER_ID]经验生产环境慎用--rm参数虽然它能自动清理停止的容器但会丢失排错所需的运行日志。2.3 仓库镜像的AppStoreDocker Hub 是最著名的公共仓库但国内访问速度较慢。建议配置镜像加速器// /etc/docker/daemon.json { registry-mirrors: [ https://hub-mirror.c.163.com, https://mirror.baidubce.com ] }企业级场景需要搭建私有仓库Harbor 是目前最成熟的开源方案提供漏洞扫描、权限管理等进阶功能。3. 环境配置全攻略3.1 主流系统安装指南Windows/macOS官方 Docker Desktop 提供一体化解决方案务必开启 WSL2 后端Windows或 VirtioFS 加速macOSLinux 发行版# Ubuntu示例 sudo apt-get update sudo apt-get install docker-ce docker-ce-cli containerd.io # 验证安装 sudo docker run hello-world避坑提示CentOS 8 默认使用 podman 替代 docker如需原生 Docker 需额外配置3.2 权限优化方案默认需要 sudo 执行 docker 命令存在安全隐患建议将用户加入 docker 组sudo usermod -aG docker $USER newgrp docker # 立即生效无需重启验证权限docker ps # 不报错即配置成功4. Dockerfile 深度实践4.1 编写高效构建脚本一个优化的 Python 应用 Dockerfile 示例# 阶段1构建环境 FROM python:3.9-slim as builder WORKDIR /app COPY requirements.txt . RUN pip install --user -r requirements.txt # 阶段2运行环境 FROM python:3.9-slim WORKDIR /app # 从builder阶段复制已安装的包 COPY --frombuilder /root/.local /root/.local COPY . . # 确保脚本可执行且路径正确 ENV PATH/root/.local/bin:$PATH CMD [python, main.py]这个多阶段构建方案能显著减小最终镜像体积关键优化点包括使用 slim 版本基础镜像分离构建和运行环境精准控制文件复制范围4.2 构建缓存妙用docker build命令会逐层缓存合理排序指令可加速构建# 错误示例变动频繁的指令在前 COPY . . RUN apt-get update apt-get install -y python3 # 正确示例将变动少的指令前置 RUN apt-get update apt-get install -y python3 COPY . .通过--no-cache参数可强制全新构建docker build --no-cache -t myapp .5. 实战项目部署Web应用5.1 单容器部署方案以 Flask 应用为例的完整流程准备应用代码和 Dockerfile构建镜像docker build -t flask-demo .运行容器并映射端口docker run -d -p 5000:5000 --name myflask flask-demo访问 http://localhost:5000 验证5.2 多容器编排方案当应用需要数据库等服务时推荐使用 docker-compose.ymlversion: 3 services: web: build: . ports: - 5000:5000 depends_on: - redis redis: image: redis:alpine volumes: - redis_data:/data volumes: redis_data:启动命令docker-compose up -d这种声明式配置能自动处理网络联通、依赖启动顺序等问题。6. 数据持久化策略6.1 三种挂载方式对比类型宿主位置生命周期适用场景匿名卷/var/lib/docker/volumes随容器删除临时数据命名卷/var/lib/docker/volumes独立于容器数据库文件绑定挂载用户指定路径完全由用户控制开发环境代码同步6.2 数据库实战示例MySQL 容器推荐使用命名卷持久化docker run -d \ --name mysql8 \ -v mysql_data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORDsecret \ mysql:8.0查看卷信息docker volume inspect mysql_data7. 网络配置精要7.1 默认网络模式# 查看所有网络 docker network ls # 创建自定义网络 docker network create mynet7.2 容器互联方案在自定义网络中启动的容器会自动相互发现docker run -d --net mynet --name web nginx docker run -it --net mynet alpine ping web这种基于DNS的服务发现极大简化了微服务架构的部署复杂度。8. 生产环境最佳实践8.1 资源限制配置防止单个容器耗尽系统资源docker run -d \ --memory512m \ --cpus1.5 \ --pids-limit100 \ nginx8.2 日志管理方案推荐采用 json-file 日志驱动并配置轮转// /etc/docker/daemon.json { log-driver: json-file, log-opts: { max-size: 10m, max-file: 3 } }查看日志docker logs --tail 100 -f [CONTAINER_ID]9. 常见问题排雷指南9.1 镜像下载失败典型报错Error response from daemon: Get https://registry-1.docker.io/v2/: net/http: request canceled解决方案检查镜像加速器配置尝试更换DNS如8.8.8.8使用代理需符合企业网络政策9.2 端口冲突处理当出现Bind for 0.0.0.0:80 failed: port is already allocated时# 查找占用进程 sudo lsof -i :80 # 或者停止冲突容器 docker stop $(docker ps -q --filter publish80)10. 学习路径推荐根据角色定制学习重点开发人员进阶路线掌握 Dockerfile 优化技巧学习多阶段构建实践 CI/CD 集成了解 BuildKit 高级特性运维人员深造方向集群管理工具Swarm/K8s监控方案PrometheusGranfa安全扫描Trivy/Clair日志收集ELK/Fluentd我个人的经验是Docker 就像编程语言一样20%的核心功能能满足80%的日常需求。建议先熟练掌握本教程涉及的基础操作再根据实际工作需要深入特定领域。遇到问题时善用--help参数和官方文档往往比盲目搜索更高效。