Docker 新手入门:把一个 Python 小服务装进容器并跑起来
很多新手第一次学 Docker 都会遇到一个尴尬:代码在自己电脑上能跑,换一台机器就跑不起来。原因往往不是代码写错了,而是运行环境不一样:Python 版本不同、依赖装没装、端口被占用、路径写死了。Docker 的思路很直接:把代码连同它需要的运行环境打包成一个可以重复运行的单元,走到哪里都按同一份说明启动。本文就用一个最小的 Python 服务,把这条链路完整走一遍。先讲清三个最容易混的概念。镜像可以理解为一份只读的模板,里面装着操作系统基础层、Python 解释器和你的代码;容器是镜像运行起来的实例,就像用同一张图纸盖出的房子,可以同时盖很多间,拆掉也不影响图纸;Dockerfile 则是写给 Docker 的施工说明,一行行告诉它从哪个基础镜像出发、把什么文件拷进去、最后启动什么命令。容器不是虚拟机,它和宿主机共享内核,所以启动更快、占用更少,但隔离性也要按实际需求评估,不要把它当成万能的安全边界。准备工作只有一步:先确认 Docker 能用。安装完成后运行 docker version 和 docker info,能看到客户端与服务端信息就说明服务正常;再跑 docker run hello-world,能打印欢迎信息就说明拉取镜像和启动容器都没问题。Linux 上如果提示权限不足,通常是因为当前用户不在 docker 组里,可以把用户加进组并重新登录,不要长期用 root 跑所有命令。接下来写一个最小服务,刻意只用 Python 标准库,避免一开始就被第三方依赖干扰。新建 app.py,用 http.server 的 BaseHTTPRequestHandler 定义一个处理器,收到 GET 请求就返回一行问候;再用 HTTPServer 绑定 0.0.0.0 的 8000 端口并一直运行。这里绑定 0.0.0.0 很关键,如果只绑定 127.0.0.1,容器外的请求就进不来。本地先用 python app.py 跑一次,浏览器或 curl 访问 8000 端口能看到问候,说明服务本身没问题,再交给 Docker。Dockerfile 只有五行,但每一行都值得读懂。FROM python:3.12-slim 表示以官方的轻量 Python 镜像为起点,slim 版本体积更小,适合入门;WORKDIR /app 是把容器里的工作目录定下来,后续路径就不容易写乱;COPY app.py . 是把本地的 app.py 拷进工作目录;EXPOSE 8000 只是声明这个容器会用 8000 端口,并不等于把端口发布到宿主机;CMD ["python", "app.py"] 是容器启动时执行的命令,写成这种列表形式更利于信号传递,容器停止时也更干净。构建与运行分两步。先在 app.py 所在目录执行 docker build -t hello-docker:1.0 .,注意最后的点代表当前目录就是构建上下文,漏掉它会报错;构建成功后用 docker images 能看到刚打好的镜像和标签。接着执行 docker run -d --name hello -p 8000:8000 hello-docker:1.0:-d 是后台运行,--name 是给容器起个好记的名字,-p 是端口映射,冒号左边是宿主机端口、右边是容器端口,顺序写反是最常见的新手坑。启动后用 docker ps 确认容器在运行,用 curl 访问宿主机的 8000 端口能看到问候,用 docker logs -f hello 可以实时看日志,排查问题先看日志几乎不会错。改代码之后不要在容器里随手改文件当作长期办法。正确流程是改本地 app.py,重新执行 docker build 打一个新镜像,再把旧容器停掉并删除,最后用新镜像重新运行:docker stop hello、docker rm hello,然后再 docker run 一次。这样做的好处是镜像始终是可复现的交付物,别人拿到同一个镜像和同一条运行命令,就能得到同样的服务;如果只改容器里的文件,容器一删改动就丢了,别人也无法复现。最后列几个入门排障清单,遇到问题先对号入座。端口被占用时,换一个宿主机端口映射,或者先停掉占用端口的旧容器;容器一启动就退出时,先看 docker logs,多数是启动命令写错、文件没拷进去或端口冲突;改了代码却看不到变化时,先确认是否重新构建并重新运行,旧镜像不会自动更新;本地能跑、容器里缺依赖时,说明依赖只装在了本地,应该把依赖写进 requirements.txt,并在 Dockerfile 里 COPY 并安装,而不是假设容器里什么都有。学完这一步,不必马上追多阶段构建、镜像扫描和编排。下一步可以把运行参数写进 docker-compose 文件,让启动命令可保存、可复读;再加一个 .dockerignore,把 .git 和 __pycache__ 这类不需要进镜像的东西排除掉。等你能独立完成这份练习:跑通 hello-world、改一句返回文案后重新构建、停掉删掉再跑一次,并能说清镜像、容器和 Dockerfile 的区别,Docker 入门就算真正过关了。
- 点赞
- 收藏
- 关注作者
评论(0)