写给懒猫微服玩家的容器小书 Docker篇(一):《无法部署的诅咒》

忘机山人

发布于383天前
博客图片修整中,看不了可以先搜索公众号“忘机山人”看。
> 一直想写一本容器小书,真好懒猫基本都做了容器化,所以把这部分分享出来。不同的是,懒猫微服中使用pg-docker来替代docker命令,使用dockge来执行docker-compose。以下讲解以标准docker为主,这样子既学会了docker知识,也能够在懒猫微服上启动Docker服务。





https://appstore.lazycat.cloud/#/shop/detail/in.zhaoj.dockerregistry




# 《无法部署的诅咒》讲的是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](https://www.docker.com/products/docker-desktop)
* 下载并安装 Docker Desktop
* 安装后打开终端(Terminal),输入:

```bash
docker --version
```

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

#### 🧑‍💻 在 Linux(Ubuntu)上:

```bash
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
```

🔐 *建议将当前用户加入 docker 组,以免每次都要用 sudo:*

```bash
sudo usermod -aG docker $USER
```

---

### 🧠 技术讲解 Part 3:Docker 的核心概念

| 概念            | 说明                                         |
| ------------- | ------------------------------------------ |
| 镜像(Image)     | 应用和其依赖的静态快照模板(如:打包好的 Python 环境 + Flask 项目) |
| 容器(Container) | 镜像运行出来的实例,是真正“活着”的程序                       |
| Dockerfile    | 编写镜像的“配方”,定义如何构建镜像                         |
| Docker Hub    | 类似 GitHub 的公共镜像仓库,可上传/下载别人做好的镜像            |
| `docker` 命令   | Docker 的主命令工具,用于操作镜像、容器、网络、卷等              |

#### 📌 镜像 vs 容器

* 镜像是“模具”,容器是“实物”
* 镜像不可变,容器是可运行的环境
* 一个镜像可以运行多个容器

---

### 🧪 技术实践:Hello Docker 世界

老周指导小李敲下第一行命令:

```bash
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:

```dockerfile
# 使用 Python 官方基础镜像
FROM python:3.11-slim

# 设置工作目录
WORKDIR /app

# 复制项目文件
COPY . /app

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

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

#### 构建镜像:

```bash
docker build -t my-flask-app .
```

#### 启动容器:

```bash
docker run -p 5000:5000 my-flask-app
```

现在访问浏览器 `http://localhost:5000`,你的项目上线了!

---

### 💡 小知识快闪

* Docker 容器内部不包含完整操作系统,只包含必要的运行库;
* Dockerfile 的每一行都是一层(Layer),构建时会缓存复用;
* `docker ps` 查看运行中容器,`docker images` 查看已有镜像;
* 可以通过 `.dockerignore` 文件忽略不想加入镜像的文件,比如 `.git` 和日志。

---

### ⚔️ 章节尾声:打破部署诅咒

这次,小李把打好的镜像发给了测试老赵:

```bash
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 宿主:容器 镜像名`                         |

评论

0

暂无评论

说点什么呢~
收藏
1
0
0