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

一直想写一本容器小书,真好懒猫基本都做了容器化,所以把这部分分享出来。不同的是,懒猫微服中使用 pg-docker 来替代 docker 命令,使用 dockge 来执行 docker-compose。以下讲解以标准 docker 为主,这样子既学会了 docker 知识,也能够在懒猫微服上启动 Docker 服务。

《无法部署的诅咒》讲的是 Docker 的起源与作用、镜像与容器概念、安装入门

🏙️ 开篇:代码在电脑上运行良好,部署却频频翻车

小李是一名后端工程师,刚完成一个用 Flask 编写的内部管理系统。他信心满满地将代码提交,交给测试工程师老赵部署。

可没想到——

“报错了!你是不是少传文件了?”

“我这边 Python 是 3.6,怎么你这代码用了 match case?”

“你数据库呢?你 Redis 配了?环境变量在哪?”

这一刻,小李陷入了一个叫「部署地狱」的世界。

这个世界里,每一台服务器都是独一无二的“宠物”,需要手动配置、手动部署、手动踩坑,稍有不慎就会陷入版本冲突、依赖缺失、环境不一致的深渊。

小李心里想:有没有一种办法,能让我把代码和环境一起打包起来,无论在哪运行都能保持一致?

阅读更多

写给懒猫微服玩家的容器小书 Docker篇(二):《镜像旅馆的秘密》

一直想写一本容器小书,真好懒猫基本都做了容器化,所以把这部分分享出来。不同的是,懒猫微服中使用 pg-docker 来替代 docker 命令,使用 dockge 来执行 docker-compose。以下讲解以标准 docker 为主,这样子既学会了 docker 知识,也能够在懒猫微服上启动 Docker 服务。

《镜像旅馆的秘密》讲的是 Docker 镜像的原理、分层结构、生命周期、Docker Hub 上传与下载、常见镜像命令详解

🏰 开篇:进入镜像旅馆

自从小李用 Docker 成功打包并运行了自己的 Flask 项目,他的开发效率飞快提高。

某天,老周带他来到一座巨大的数字建筑——Docker 镜像旅馆

“这是你所有镜像的家,”老周说,“也是全球程序员共享旅程资源的中转站。”

镜像旅馆里,层层叠叠地存放着成千上万个镜像,就像一栋模块化的高楼大厦。


🧱 镜像的本质:一层一层搭起来的文件系统

老周告诉小李:

“镜像(Image)其实是一个只读的分层文件系统。你写的每一条 Dockerfile 指令,都会构成一层 Layer。”

比如这个简单的 Dockerfile:

1
2
3
4
5
FROM python:3.11-slim
WORKDIR /app
COPY . /app
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
阅读更多

写给懒猫微服玩家的容器小书 Docker篇(三):《容器部落生活》

《容器部落生活》讲的是 容器生命周期管理,包括容器的启动、停止、查看、交互、日志、后台运行、重启策略等操作

一直想写一本容器小书,真好懒猫基本都做了容器化,所以把这部分分享出来。不同的是,懒猫微服中使用 pg-docker 来替代 docker 命令,使用 dockge 来执行 docker-compose。以下讲解以标准 docker 为主,这样子既学会了 docker 知识,也能够在懒猫微服上启动 Docker 服务。

镜像旅馆的旅途告一段落,小李的下一站是容器部落

老周牵着他走过一条闪烁着数字光芒的通道,一排排运行中的应用像帐篷一样排列着。有人在调试日志,有人在重启服务,还有人用 bash 正在某个容器里“打补丁”。

老周说:

“镜像只是静态的模板,容器才是它们的生命。容器是镜像运行出来的真实世界。”


🧠 技术基础:容器 vs 镜像

项目 镜像(Image) 容器(Container)
类比 模板、配方 实际的运行实例
特性 只读 可读写
作用 用来创建容器 实际运行中的程序环境
状态 不运行 可运行、停止、销毁

阅读更多

写给懒猫微服玩家的容器小书 Docker篇(四):《数据之岛与持久化卷》

一直想写一本容器小书,真好懒猫基本都做了容器化,所以把这部分分享出来。不同的是,懒猫微服中使用 pg-docker 来替代 docker 命令,使用 dockge 来执行 docker-compose。以下讲解以标准 docker 为主,这样子既学会了 docker 知识,也能够在懒猫微服上启动 Docker 服务。

《数据之岛与持久化卷》讲的是 Docker Volume 持久化数据方案、挂载宿主机目录、多个容器共享数据、自动创建卷、数据备份与恢复等

🏝️ 开篇:数据会随浪消失

有一天,小李运行了一个容器,里面的 Flask 项目能正常写入用户信息到 SQLite 数据库。可当容器一停止,再启动——所有数据消失了!

老周说:“你的数据,被潮水带走了。”

“Docker 容器默认的文件系统是临时的,只要容器删除,数据也就没了。想让数据真正存活,就要登上‘数据之岛’。”


🧠 基础概念:数据卷(Volume)

Docker 提供了三种数据持久化方案:

方案 用法 场景
Volume Docker 管理的专属数据区 最推荐、安全、可多容器共享
Bind Mount 映射宿主机目录 更灵活,适合本地调试
tmpfs 临时存储在内存 适合敏感数据,重启即丢弃

本章重点讲解:Volume(数据卷)Bind Mount(绑定挂载)


阅读更多

写给懒猫微服玩家的容器小书Docker篇(五):《多容器交响曲:Docker Compose 上场》

一直想写一本容器小书,真好懒猫基本都做了容器化,所以把这部分分享出来。不同的是,懒猫微服中使用 pg-docker 来替代 docker 命令,使用 dockge 来执行 docker-compose。以下讲解以标准 docker 为主,这样子既学会了 docker 知识,也能够在懒猫微服上启动 Docker 服务。

《多容器交响曲:Docker Compose 上场》讲的是使用 Docker Compose 统一编排多容器服务,理解 YAML 配置结构、服务依赖、网络、挂载、构建策略、变量管理、Compose vs K8s 初探等


🎼 开篇:服务之间的管弦乐团

随着项目日益复杂,小李的服务已经不再是一个容器就能承载的了。

前端、后端、数据库、缓存、日志系统……像一个交响乐团,需要统一调度、和谐配合。

老周递给他一个新的工具:“Docker Compose——它是你的指挥棒。”


🎻 第一节:什么是 Docker Compose?

老周解释:

“Docker Compose 是 Docker 的多容器编排工具,用一份 docker-compose.yml 文件,就能同时启动、停止、构建多个服务。”

Compose 帮你解决:

  • 多个服务启动顺序
  • 多容器共享网络
  • 统一管理环境变量
  • 配置简洁、开发者友好
  • 跨平台部署一致

阅读更多

我用Amazon Q写了一个Docker客户端,并上架了懒猫微服商店

https://appstore.lazycat.cloud/#/shop/detail/xu.deploy.containly

自从被种草了 Amazon Q,我陆陆续续写了不少小软件,其中这个 Docker 客户端是一个典型的例子,比较符合自己平时使用的习惯,也分享给一些朋友和 NAS 爱好者来用。

image-20250606190108571

故事还要用上次折腾黑群晖说起,本意想把 NAS 和打印机共享二合一的,所以把闲着的软路由做了改装。顺便使用 Docker 跑一些服务,有老本行的 ES 集群,也有自己写的一些工具类型的服务。

阅读更多

懒猫微服进阶心得(一):M芯片移植懒猫应用构建Docker镜像的常见问题排查及解决方案

本文是使用 Apple silicon 的 MacOS 移植到懒猫商店的踩坑记录,希望能够给大家带来帮助

Apple silicon 很好,在这年几乎带起来 ARM 的生态。但这也拉开了 ARM 和 X86 之战,用户在两大生态中穿梭,只能增加自己应用的兼容性。就比如说用来打包的 Docker image,尽管编程语言和操作系统都在底层屏蔽了硬件架构,但是容器还得用相同架构的。

这是之前移植开源项目时候忘记打包不同架构的 image 而直接推送到懒猫镜像仓库导致的问题。MacOS 默认打包了 ARMv8 架构的镜像,在 X86 上也无法运行。

1
2
pg-docker run -p 5000:5500 registry.lazycat.cloud/u04123229/you/doudizhu-scorer:d1d9085174c0bf8c
WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v4) and no specific platform was requested
阅读更多

懒猫微服进阶心得(二):一台机器跑三套 Docker?深入解析懒猫容器的共存机制(上)

本文仅代表个人视角对懒猫 Docker 的拆解分析,内容为基于现象的倒推推测,不代表懒猫官方实现方式。

拿到任何 NAS 的第一件事是开启 SSH 功能,第二步就是用 Docker 启动容器。

懒猫微服这个 docker 还不太一样,一个有三个 Docker:

docker : 运行系统组件

pg-docker: 普通的 docker,让我们拿来玩

lzc-docker:运行懒猫商店的 docker

三套 Docker 引擎初探

我们先来看看这三套 docker 引擎跑了些什么,从 ps 看起:

阅读更多

懒猫微服进阶心得(三):一台机器跑三套 Docker?深入解析懒猫容器的共存机制(下)

在上一期里,我们剖析了懒猫微服原生的三套 Docker 共存方案,这次我们来看看怎么在懒猫微服上启动新的 dev-docker 引擎,既能拓展使用,但又不与现有环境相互污染。

核心思路

  1. 独立 daemon.json 指定专属数据目录 / Socket
  2. 一个包装脚本 dev-docker 让你照常敲 docker 命令
  3. 需要时随时启用,不用时一条命令即卸载

目录规划

我目前是在 root 目录下新建了一个 dev 目录,新的容器所有数据都在这个目录下。

1
2
3
4
5
6
.
├── dev/
│ ├── data/ # 镜像层、容器元数据
│ ├── exec/ # 运行时文件
│ └── daemon.json
└── dev-docker # 包装脚本,照样敲 `docker`
阅读更多

懒猫微服进阶心得(六):以纸砚双拼为例,快速移植纯前端项目到懒猫微服

之前移植了一款颜值极高的纸砚双拼,想着纯前端类的软件应该都是一样的操作,所以把操作记录下来,方便以后复习查看,也相当于一个教程吧。

image-20250531195827292

对于这种场景来说,前端项目开发完成后,我们将构建好的静态页面部署到服务器上。借助 Docker 和 Nginx,可以实现一套轻量、快速、可移植的部署方式,特别适合懒猫微服这种容器化的环境,也很适合日常调试测试使用。

下面将手把手教你如何打包一个 Vue 或 React 项目,并通过 Docker + Nginx 构建一个可复用的前端部署容器镜像,然后就可以把这个部署到懒猫微服删,当然也适用于各种 Linux + Docker 环境。


1 · 准备目录结构

纸砚双拼是 Vue 的项目,所以直接执行这个命令打包

1
2
npm i
npm run build

打包完成后,项目根目录下会生成一个 dist/ 文件夹,里面包含:

  • index.html
  • 静态 JS、CSS 资源
  • 图片等其他引用资源

基本所有前端工程化的流程都是部署这个 dist/静态目录。

阅读更多