前言:为什么你的下一个项目一定要用Docker?
-
目标读者: 开发人员、运维新手、学生,以及所有听说过Docker但不知从何入手的人。
-
核心痛点:
-
"在我机器上能跑,为什么到你那就不行?"------环境不一致问题。
-
配置开发环境耗时费力,新人上手成本高。
-
依赖冲突、版本混乱。
-
-
Docker的承诺: "一次构建,到处运行"。通过容器化技术,将应用及其所有依赖打包在一个标准化的单元中。
第一部分:概念篇------理解"集装箱"革命
第一章:Docker到底是什么?
-
1.1 一个生动的比喻:集装箱
-
传统运输(裸机/虚拟机) vs 集装箱运输(Docker)。
-
镜像: 集装箱的蓝图。
-
容器: 运行中的集装箱实例。
-
仓库: 存放蓝图的仓库。
-
-
1.2 Docker与虚拟机的本质区别
-
架构图对比:虚拟机需要Guest OS,Docker直接利用主机内核。
-
核心优势:启动速度极快、资源消耗极低、性能接近原生。
-
第二章:安装Docker,迈出第一步
-
2.1 在Windows/macOS上安装Docker Desktop
- 简单步骤和安装后验证。
-
2.2 在Linux上安装Docker Engine
- 以Ubuntu为例的安装命令。
-
【实战操作1】:验证安装成功
bash
docker --version docker run hello-world- 解读
hello-world命令的输出,理解Docker的工作流程。
- 解读
第二部分:基础篇------驾驭核心三要素
第三章:镜像------应用的模板
-
3.1 获取镜像:
docker pull-
从Docker Hub拉取官方镜像(如Nginx, Redis, Python)。
-
【实战操作2】:
docker pull nginx:latest
-
-
3.2 管理镜像:
docker images,docker rmi- 查看本地镜像列表,删除无用镜像。
第四章:容器------运行的实例
-
4.1 核心生命周期命令
-
docker run:从镜像创建并启动容器。- 常用参数:
-d(后台运行)、-p(端口映射)、-v(数据卷)、--name(命名容器)。
- 常用参数:
-
docker ps:查看运行中的容器(加-a查看所有)。 -
docker stop/docker start:停止/启动容器。 -
docker rm:删除已停止的容器。
-
-
【实战操作3】:运行你的第一个Nginx服务器
bash
# 在后台运行nginx,并将主机的8080端口映射到容器的80端口 docker run -d -p 8080:80 --name my-nginx nginx- 打开浏览器访问
http://localhost:8080,看到Welcome to Nginx页面。
- 打开浏览器访问
第五章:Dockerfile------构建自定义镜像的配方
-
5.1 Dockerfile核心指令详解
-
FROM:指定基础镜像。 -
WORKDIR:设置工作目录。 -
COPY/ADD:复制文件到镜像。 -
RUN:执行命令(常用于安装依赖)。 -
EXPOSE:声明运行时容器提供的端口。 -
CMD/ENTRYPOINT:指定容器启动时运行的命令。
-
-
【实战代码4】:编写一个简单的Python应用Dockerfile
dockerfile
# 使用官方Python运行时作为父镜像 FROM python:3.9-slim # 设置工作目录为 /app WORKDIR /app # 将当前目录内容复制到容器的 /app 下 COPY . /app # 安装 requirements.txt 中指定的任何所需包 RUN pip install --no-cache-dir -r requirements.txt # 使端口 80 可供此容器外的环境使用 EXPOSE 80 # 在容器启动时运行 app.py CMD ["python", "app.py"] -
5.2 构建镜像:
docker build- 【实战操作5】:
docker build -t my-python-app .
- 【实战操作5】:
第三部分:实战篇------解决真实世界问题
第六章:数据持久化------让容器状态得以保留
-
6.1 问题: 容器内的数据在容器删除后会丢失。
-
6.2 解决方案:数据卷
-
绑定挂载: 将主机目录挂载到容器。
docker run -v /path/on/host:/path/in/container ...
-
命名卷: 由Docker管理的卷,更易备份和迁移。
-
docker volume create my-vol -
docker run -v my-vol:/path/in/container ...
-
-
-
【实战操作6】:为MySQL数据库配置数据卷
bash
docker run -d --name mysql-db \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -v mysql_data:/var/lib/mysql \ # 使用命名卷持久化数据 mysql:8.0
第七章:网络互联------让容器彼此对话
-
7.1 默认网络: 容器默认可以相互通过IP地址访问。
-
7.2 自定义网络: 更好的隔离和DNS解析(容器名即主机名)。
-
docker network create my-app-network -
docker run --network my-app-network --name my-app ...
-
-
【实战操作7】:创建一个Python应用连接Redis的微服务
bash
# 1. 创建网络 docker network create app-net # 2. 启动Redis容器,加入网络 docker run -d --name redis-server --network app-net redis # 3. 启动Python应用容器,加入同一网络 docker run -d --name python-app --network app-net -p 5000:5000 my-python-app- 在Python代码中,可以直接通过
redis-server这个主机名连接到Redis。
- 在Python代码中,可以直接通过
第八章:Docker Compose------一键启动多容器应用
-
8.1 为什么需要Compose? 简化多容器应用的管理和启动。
-
8.2 编写
docker-compose.yml文件-
version:指定版本。 -
services:定义各个服务(容器)。 -
networks/volumes:定义网络和数据卷。
-
-
【实战代码8】:将Web应用和数据库编排在一起
yaml
version: '3.8' services: web: build: . ports: - "5000:5000" depends_on: - redis networks: - app-net redis: image: "redis:alpine" networks: - app-net volumes: - redis-data:/data volumes: redis-data: networks: app-net: -
8.3 常用命令
-
docker-compose up -d:启动所有服务。 -
docker-compose down:停止并移除所有服务。 -
docker-compose logs:查看日志。
-
第四部分:项目实战篇------融会贯通
第九章:综合实战:容器化一个全栈应用
-
场景: 一个简单的Vue.js前端 + Flask后端 + MySQL数据库的全栈项目。
-
步骤:
-
后端容器化: 编写后端的Dockerfile并构建镜像。
-
前端容器化: 使用Nginx服务构建好的静态文件,编写Dockerfile。
-
数据库配置: 使用官方MySQL镜像,配置数据卷。
-
编写终极
docker-compose.yml: 将三个服务编排在一起,定义依赖关系和网络。 -
一键运行: 只需
docker-compose up -d,整个应用就在隔离的环境中运行起来。
-
第五部分:总结与进阶
第十章:最佳实践与小贴士
-
10.1 编写高效的Dockerfile
-
使用
.dockerignore文件。 -
利用构建缓存,合理安排指令顺序。
-
一个容器只运行一个进程。
-
-
10.2 日常使用技巧
-
docker exec -it <container> bash:进入正在运行的容器。 -
docker logs <container>:查看容器日志。 -
清理无用镜像和容器:
docker system prune。
-
第十一章:总结与后续学习路径
-
回顾Docker核心价值: 环境标准化、隔离、简化部署。
-
你已经能够: 构建镜像、运行容器、管理数据与网络、编排多服务应用。
-
下一步可以探索:
-
Docker Hub和镜像仓库: 分享你的镜像。
-
CI/CD: 在自动化流程中使用Docker。
-
云原生与Kubernetes: 学习如何在生产环境中管理和编排大量容器。
-
