写给懒猫微服玩家的容器小书 Docker篇(一):《无法部署的诅咒》
一直想写一本容器小书,真好懒猫基本都做了容器化,所以把这部分分享出来。不同的是,懒猫微服中使用 pg-docker 来替代 docker 命令,使用 dockge 来执行 docker-compose。以下讲解以标准 docker 为主,这样子既学会了 docker 知识,也能够在懒猫微服上启动 Docker 服务。
《无法部署的诅咒》讲的是 Docker 的起源与作用、镜像与容器概念、安装入门
🏙️ 开篇:代码在电脑上运行良好,部署却频频翻车
小李是一名后端工程师,刚完成一个用 Flask 编写的内部管理系统。他信心满满地将代码提交,交给测试工程师老赵部署。
可没想到——
“报错了!你是不是少传文件了?”
“我这边 Python 是 3.6,怎么你这代码用了
match case
?”“你数据库呢?你 Redis 配了?环境变量在哪?”
这一刻,小李陷入了一个叫「部署地狱」的世界。
这个世界里,每一台服务器都是独一无二的“宠物”,需要手动配置、手动部署、手动踩坑,稍有不慎就会陷入版本冲突、依赖缺失、环境不一致的深渊。
小李心里想:有没有一种办法,能让我把代码和环境一起打包起来,无论在哪运行都能保持一致?
🌀 变故:神秘的程序员大叔与魔法容器
在公司茶水间,小李邂逅了一个带着黑框眼镜的大叔,大家都叫他老周。
老周是个技术老炮,在各种部署大灾难中杀出血路。他听完小李的吐槽后,轻轻地推了一份文档过来,只写了五个字母:
Docker
“这是个魔法容器,”老周说,“把你代码和环境都打包进去,哪怕放在火星,也能跑。”
“以后别再‘它在我电脑上可以跑’了,Docker 能让所有环境变得一致。”
小李的眼睛亮了。
🔧 技术讲解 Part 1:什么是 Docker?
Docker 是一个开源的容器化平台,它允许开发者将应用及其所有依赖打包成一个“容器”,保证在任何平台上都可以一致运行。
你可以把 Docker 想象成:
程序员的打包箱子:把你写的程序、环境、库、配置都放进去,打包成一个“镜像”;
程序员的快递服务:运行镜像就像打开快递,内容和你寄出时一模一样。
🚀 为什么要用 Docker?
- ✅ 跨平台运行:一次构建,到处运行(Run anywhere)
- ✅ 快速部署:秒级启动,适合 CI/CD
- ✅ 环境一致性:不再“你电脑能跑我电脑不行”
- ✅ 轻量隔离:不像虚拟机那么重,不需要整个操作系统
- ✅ 资源占用少:用起来更像一个进程,而不是一台虚拟机
☑️ 一句话总结:Docker 解决了“在我电脑上能跑”的问题。
🛠️ 技术讲解 Part 2:如何安装 Docker?
老周拍了拍小李的肩膀,说:“先装起来,动手最重要。”
🧑💻 在 Mac / Windows 上:
- 访问官网:https://www.docker.com/products/docker-desktop
- 下载并安装 Docker Desktop
- 安装后打开终端(Terminal),输入:
1 | docker --version |
如果看到 Docker 的版本信息,说明安装成功。
🧑💻 在 Linux(Ubuntu)上:
1 | sudo apt update |
🔐 建议将当前用户加入 docker 组,以免每次都要用 sudo:
1 | sudo usermod -aG docker $USER |
🧠 技术讲解 Part 3:Docker 的核心概念
概念 | 说明 |
---|---|
镜像(Image) | 应用和其依赖的静态快照模板(如:打包好的 Python 环境 + Flask 项目) |
容器(Container) | 镜像运行出来的实例,是真正“活着”的程序 |
Dockerfile | 编写镜像的“配方”,定义如何构建镜像 |
Docker Hub | 类似 GitHub 的公共镜像仓库,可上传/下载别人做好的镜像 |
docker 命令 |
Docker 的主命令工具,用于操作镜像、容器、网络、卷等 |
📌 镜像 vs 容器
- 镜像是“模具”,容器是“实物”
- 镜像不可变,容器是可运行的环境
- 一个镜像可以运行多个容器
🧪 技术实践:Hello Docker 世界
老周指导小李敲下第一行命令:
1 | docker run hello-world |
如果 docker run/pull 有问题,那么可以通过
lzc-cli appstore copy-image your-images
来使用懒猫的镜像仓库。
这个命令会做三件事:
- 自动从 Docker Hub 拉取一个
hello-world
镜像(如果本地没有) - 基于镜像运行容器
- 容器运行后输出信息,然后自动退出
这是验证 Docker 是否正常运行的“点灯测试”。
🧱 小李的第一个真实容器:Flask Web 项目打包实战
老周笑着说:“现在,把你那个 Flask 管理系统也丢进 Docker 试试。”
小李在项目根目录下写了一个 Dockerfile:
1 | # 使用 Python 官方基础镜像 |
构建镜像:
1 | docker build -t my-flask-app . |
启动容器:
1 | docker run -p 5000:5000 my-flask-app |
现在访问浏览器 http://localhost:5000
,你的项目上线了!
💡 小知识快闪
- Docker 容器内部不包含完整操作系统,只包含必要的运行库;
- Dockerfile 的每一行都是一层(Layer),构建时会缓存复用;
docker ps
查看运行中容器,docker images
查看已有镜像;- 可以通过
.dockerignore
文件忽略不想加入镜像的文件,比如.git
和日志。
⚔️ 章节尾声:打破部署诅咒
这次,小李把打好的镜像发给了测试老赵:
1 | docker run -p 5000:5000 my-flask-app |
老赵只运行了一行命令,项目便神奇地跑了起来。
“不改配置?不用装 Python?数据库也连上了?”
“你这是什么魔法!”
小李笑了笑,第一次感觉部署是件简单的事。
🧭 第一章总结知识点:
技术点 | 命令 |
---|---|
安装 Docker | Mac/Win 下载 Docker Desktop / Ubuntu 安装 docker.io |
查看版本 | docker --version |
运行测试容器 | docker run hello-world |
编写 Dockerfile | FROM / COPY / RUN / CMD |
构建镜像 | docker build -t name . |
运行容器 | docker run -p 宿主:容器 镜像名 |
写给懒猫微服玩家的容器小书 Docker篇(一):《无法部署的诅咒》
https://xu-hardy.github.io/写给懒猫微服玩家的容器小书-docker篇(一):《无法部署的诅咒》/