写给懒猫微服玩家的容器小书 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 上:

1
docker --version

如果看到 Docker 的版本信息,说明安装成功。

🧑‍💻 在 Linux(Ubuntu)上:

1
2
3
4
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker

🔐 建议将当前用户加入 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来使用懒猫的镜像仓库。

这个命令会做三件事:

  1. 自动从 Docker Hub 拉取一个 hello-world 镜像(如果本地没有)
  2. 基于镜像运行容器
  3. 容器运行后输出信息,然后自动退出

这是验证 Docker 是否正常运行的“点灯测试”。


🧱 小李的第一个真实容器:Flask Web 项目打包实战

老周笑着说:“现在,把你那个 Flask 管理系统也丢进 Docker 试试。”

小李在项目根目录下写了一个 Dockerfile:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 使用 Python 官方基础镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . /app

# 安装依赖
RUN pip install -r requirements.txt

# 设置启动命令
CMD ["python", "main.py"]

构建镜像:

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篇(一):《无法部署的诅咒》/

作者

Xu

发布于

2025-07-02

更新于

2025-07-01

许可协议

评论