Docker 入门实战:后端服务第一次容器化,我踩过的 4 个坑

举报
yd_265618206 发表于 2026/10/22 21:19:10 2026/10/22
【摘要】 刚开始做后端开发时,我最怕听到一句话:“这代码在我机器上明明能跑。”环境不一致,是新手期最常见的翻车现场。后来我把自己的一个小服务第一次装进 Docker,才算真正理解容器解决的是什么问题:不是把代码搬个家,而是把代码和它依赖的整个环境一起打包,谁拿到都能原样跑起来。这篇就把完整过程和我踩过的坑写下来,给同样在入门的朋友参考。 一、先把服务准备好示例是一个很小的 Python 服务,只有一个...

刚开始做后端开发时,我最怕听到一句话:“这代码在我机器上明明能跑。”环境不一致,是新手期最常见的翻车现场。后来我把自己的一个小服务第一次装进 Docker,才算真正理解容器解决的是什么问题:不是把代码搬个家,而是把代码和它依赖的整个环境一起打包,谁拿到都能原样跑起来。这篇就把完整过程和我踩过的坑写下来,给同样在入门的朋友参考。

一、先把服务准备好

示例是一个很小的 Python 服务,只有一个健康检查接口:

# app.py
from flask import Flask
app = Flask(__name__)

@app.route("/health")
def health():
    return {"status": "ok"}

if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8000)

依赖写进 requirements.txt,只有一行 flask。注意服务监听地址要写 0.0.0.0,只监听 127.0.0.1 的话,容器外是访问不到的,这是我踩的第 0 个坑,还没正式开始就先翻了一次车。

二、写 Dockerfile 并构建运行

FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY app.py .
EXPOSE 8000
CMD ["python", "app.py"]

然后构建并运行:

docker build -t my-backend:1.0 .
docker run -d -p 8000:8000 --name my-backend my-backend:1.0
curl http://localhost:8000/health

返回 {“status”: “ok”},容器化就完成了。整个过程不复杂,真正的坑都在细节里。

三、我踩过的 4 个坑

坑一:镜像大得离谱。 第一次我用了完整的 python:3.12 镜像,打出来 1GB 多。换成 slim 版本后,体积直接降到 200MB 以内。基础镜像能选小就选小,构建和拉取都会快很多。

坑二:改一行代码,依赖重装五分钟。 原因是 Dockerfile 里先 COPY 了全部代码再装依赖,代码一变,缓存就失效。把 requirements.txt 单独先 COPY、先安装,代码层排在后面,之后改业务代码时依赖层走缓存,构建只要几秒。

坑三:把配置写死在镜像里。 数据库地址、密钥这类东西绝不能写进代码再打进镜像,换个环境就要重新构建。正确做法是运行时用 -e 传环境变量,或者用 --env-file 管理,镜像只负责逻辑,配置交给运行环境。

坑四:容器一删,数据全没。 容器内的文件系统是临时的,日志、上传文件这类需要留存的数据,要挂载数据卷:docker run 时加 -v mydata:/app/data。想明白哪些数据要活得比容器久,是用 Docker 绕不开的一课。

四、写在最后

容器化的门槛其实不在命令多难,而在于把“环境也是交付物”这个观念立起来。先从一个小服务开始,跑通构建、运行、访问这条线,再回头收拾镜像体积、构建缓存、配置注入和数据卷这四个细节,一次完整的入门就完成了。后面无论是上 CI/CD,还是把服务部署到云服务器,都会顺很多。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。