
简单说Docker 就是给你的软件造一个“便携式打包箱”——里面装好代码、环境、依赖走到哪都能直接打开运行。想象一下你花了三天三夜终于写出了一个超棒的 Web 应用。你兴高采烈地把它发给朋友“快试试”结果朋友那边一运行报错“缺少某某依赖”。你检查半天发现他电脑上装的 Python 版本和你不一样数据库配置也不对。你只好手把手教他装这装那折腾一整天。这种痛苦每个程序员都经历过。Docker 就是来解决这个问题的。第一部分为什么会有 Docker一个关于“搬家”的故事1. 传统部署的噩梦在 Docker 出现之前部署一个 Web 应用就像搬家——你得把家具代码、水电煤气操作系统、数据库、各种依赖全部重新安装一遍。你用的是 Windows服务器是 Linux——完蛋很多命令不兼容你用的是 Python 3.9服务器只有 Python 2.7——代码直接崩溃你装了一个 Redis 缓存服务器上已经有个旧版本——冲突了每次部署都像在玩“俄罗斯轮盘赌”你不知道哪个环节会出问题。运维人员管服务器的人最怕听到的一句话就是“在我电脑上明明能跑啊”2. 虚拟机的笨重后来人们发明了虚拟机Virtual Machine简称 VM——相当于在房子里再盖一间小房子。你在自己的电脑上装一个虚拟机软件然后在里面装一个完整的操作系统再装你的应用。这能解决环境不一致的问题但代价太大了每个虚拟机都要装一个完整的操作系统Windows/Linux动辄几个 GB启动一个虚拟机要几分钟同时跑几个虚拟机你的电脑就会卡成 PPT3. Docker 的轻巧革命Docker 的想法很聪明共享宿主机的操作系统内核只打包你的应用和它需要的依赖。这就像搬家时只带行李箱而不是把整栋房子搬走。你的应用和它需要的“家具”依赖库、配置文件打包成一个“箱子”Docker 镜像到了新地方只要有个“地基”Docker 引擎就能直接打开箱子运行。Docker 镜像通常只有几百 MB比虚拟机小 10 倍启动只要几秒钟比虚拟机快 100 倍一台服务器可以轻松跑几十个 Docker 容器虚拟机只能跑几个第二部分实战——部署一个简单的 Web 应用假设你写了一个 Python 的 Web 应用功能很简单用户访问首页时显示“Hello, Docker!”。你用的是 Flask一个 Python 的 Web 框架。第一步你的代码长什么样my-web-app/ ├── app.py # 你的 Web 应用代码 ├── requirements.txt # 依赖列表 └── Dockerfile # Docker 的“食谱”app.py你的应用代码from flask import Flask app Flask(__name__) app.route(/) def hello(): return Hello, Docker!requirements.txt依赖清单flask2.3.0第二步写 Dockerfile——给 Docker 的“食谱”Dockerfile 就是一份做菜的食谱告诉 Docker 怎么一步步把你的应用打包成镜像。# 1. 选一个“基础锅底”——官方提供的 Python 环境 FROM python:3.9-slim # 2. 在容器里创建一个工作目录就像在厨房里划出一块操作台 WORKDIR /app # 3. 把依赖清单复制到容器里 COPY requirements.txt . # 4. 安装依赖就像按照食谱准备调料 RUN pip install --no-cache-dir -r requirements.txt # 5. 把你的代码复制进去 COPY app.py . # 6. 告诉 Docker这个应用会监听 5000 端口 EXPOSE 5000 # 7. 启动命令就像说“开火” CMD [python, app.py]每句话在做什么FROM选一个基础镜像。就像做菜前先选锅——你不可能从零开始造一个操作系统所以用官方提供的 Python 环境WORKDIR设置工作目录。就像在厨房里划出一块专门的操作台COPY把文件从你的电脑复制到镜像里RUN在构建镜像时执行命令。这里安装 Python 依赖EXPOSE声明容器会监听哪个端口。就像在门口贴个标签“我在这里提供服务”CMD容器启动后要执行的命令。就像按下“开始”按钮第三步构建镜像——把菜做好在终端命令行里进入你的项目目录运行docker build -t my-web-app .发生了什么Docker 读取当前目录下的 Dockerfile下载 Python 3.9 的基础镜像就像去超市买锅底按照食谱一步步执行复制文件、安装依赖最终生成一个叫my-web-app的镜像你可以用docker images查看所有镜像REPOSITORY TAG IMAGE ID CREATED SIZE my-web-app latest abc123def456 2 minutes ago 125MB125MB比装一个完整的操作系统小多了。第四步运行容器——开吃docker run -d -p 5000:5000 my-web-app参数解释-d后台运行detached mode。就像把菜放在保温箱里不用一直盯着-p 5000:5000端口映射。左边是你电脑的端口右边是容器里的端口。就像在墙上开个洞让外面的人能通过 5000 号门访问你的应用现在打开浏览器访问http://localhost:5000你会看到Hello, Docker!成功了你的 Web 应用已经通过 Docker 跑起来了。第五步分享给朋友——把菜打包带走docker save my-web-app -o my-web-app.tar或者上传到 Docker HubDocker 的“应用商店”docker tag my-web-app yourusername/my-web-app docker push yourusername/my-web-app朋友只需要docker pull yourusername/my-web-app docker run -d -p 5000:5000 yourusername/my-web-app就能直接运行你的应用完全不用担心环境问题。第三部分Docker 的核心概念用生活类比讲透1. 镜像Image vs 容器Container镜像就是“食谱”容器就是“做好的菜”。镜像Image只读的模板包含你的应用和所有依赖。你可以用同一个镜像启动无数个容器容器Container镜像的运行实例。每个容器相互隔离就像用同一个食谱做的菜可以放在不同的盘子里举个例子你有一个nginx:latest镜像Nginx 是一个 Web 服务器你可以用它启动 3 个容器一个跑你的博客一个跑你的 API一个跑你的管理后台每个容器都是独立的互不影响2. 仓库Registry——应用商店Docker Hub 就是 Docker 的“应用商店”。你可以从商店下载别人做好的镜像比如python:3.9、nginx:latest把自己做的镜像上传到商店分享给全世界常用命令docker pull nginx从商店下载 Nginx 镜像docker push my-app把自己的镜像上传到商店3. 端口映射——给容器开一扇门容器是一个隔离的环境外面的人访问不到里面的服务。端口映射就是在墙上开一扇门。你的电脑localhost:5000 → 门端口映射 → 容器内部端口 5000为什么需要因为容器里的应用监听的是容器内部的端口而你的浏览器访问的是你电脑的端口。端口映射把两者连接起来。4. 数据卷Volume——让数据持久化容器是临时的——你删掉容器里面的数据就没了。数据卷就像给容器配一个外接硬盘数据存在硬盘上容器删了数据还在。docker run -v /my/data:/app/data my-web-app解释/my/data你电脑上的文件夹/app/data容器里的文件夹两者同步你在容器里写数据会保存到你电脑上第四部分常见场景和最佳实践场景1开发环境 vs 生产环境开发环境你频繁修改代码不想每次都重新构建镜像用数据卷挂载代码目录docker run -v $(pwd):/app my-web-app这样你修改代码容器里会自动同步不用重新构建生产环境稳定第一代码不应该被随意修改把代码直接打包进镜像就像我们之前做的用docker-compose管理多个容器比如 Web 应用 数据库场景2多容器协作一个完整的 Web 应用通常需要Web 服务器Nginx应用代码Python/Node.js数据库MySQL/PostgreSQL缓存Redis用 Docker ComposeDocker 的“编排工具”可以一键启动所有服务version: 3 services: web: build: . ports: - 5000:5000 redis: image: redis:alpine然后运行docker-compose up两个容器就一起启动了还能互相通信。场景3调试容器有时候容器出问题了你需要进去看看docker exec -it container_id bash解释exec在运行的容器里执行命令-it交互模式interactive terminalbash启动一个 shell命令行进去之后你可以像操作普通 Linux 一样查看日志、检查文件。总结Docker 到底解决了什么问题问题Docker 的解法“在我电脑上能跑”环境完全打包到哪都一样部署环境不一致镜像包含所有依赖资源浪费共享宿主机内核轻量级启动慢秒级启动隔离性差每个容器独立运行一句话记住 Docker把你的应用和它需要的所有东西装进一个“便携箱”走到哪都能直接打开运行。现在你可以去试试把你自己写的 Web 应用用 Docker 打包了。从写一个 Dockerfile 开始构建镜像运行容器——整个过程不会超过 10 分钟。等你看到浏览器里出现“Hello, Docker!”的那一刻你会觉得原来部署可以这么简单。