忘机山人
> 一直想写一本容器小书,真好懒猫基本都做了容器化,所以把这部分分享出来。不同的是,懒猫微服中使用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暂无评论