Docker 入门实践:从镜像、容器到 Dockerfile 的完整流程
一、为什么要用 Docker
在传统部署中,"在我机器上能跑"是常见的痛点:依赖版本不一致、环境差异、上线后行为不同。Docker 通过镜像把应用及其运行环境一起打包,实现"一次构建,处处运行",大幅降低环境不一致带来的排障成本。
二、三个核心概念
• 镜像(Image):只读模板,包含文件系统与应用依赖。
• 容器(Container):镜像的运行实例,拥有独立的进程与文件系统视图。
• 仓库(Registry):镜像的存储与分发中心,如 Docker Hub、华为云 SWR。
三者关系可以理解为:镜像相当于"类",容器相当于"对象",仓库则是镜像的托管平台。
三、动手:运行第一个容器
docker run --rm -p 8080:80 nginx:alpine
参数说明:
• `--rm`:容器退出后自动删除,避免残留。
• `-p 8080:80`:把宿主机 8080 端口映射到容器 80 端口。
• `nginx:alpine`:使用轻量的 alpine 版本镜像。
浏览器访问 http://localhost:8080 即可看到 Nginx 默认页。
四、用 Dockerfile 构建自己的镜像
下面是一个 Python Flask 应用的最小 Dockerfile:
FROM python:3.12-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
EXPOSE 5000
CMD ["python", "app.py"]
关键点:
1. 选择 `slim` 基础镜像,减少体积与攻击面。
2. 先 COPY 依赖清单再安装,利用层缓存加速重复构建。
3. 使用 `--no-cache-dir` 避免缓存进入镜像层。
构建并运行:
docker build -t my-flask:v1 .
docker run --rm -p 5000:5000 my-flask:v1
五、常见坑与建议
• 端口未映射:容器内服务应监听 0.0.0.0 而不是 127.0.0.1,否则外部无法访问。
• 镜像过大:优先使用 alpine/slim 基础镜像,合并 RUN 指令,清理临时文件。
• 数据持久化:数据库等有状态服务应使用 volume,不要把数据写进容器层。
• 日志:容器日志输出到 stdout/stderr,交给日志驱动统一收集。
六、小结
Docker 的价值不只是"打包",更是把环境、依赖与运行方式固化为可版本化的产物。掌握镜像、容器、Dockerfile 三件套,就能覆盖大多数日常开发与部署场景。下一步可以了解 Docker Compose 编排多容器应用,以及 Kubernetes 在生产环境中的调度能力。
- 点赞
- 收藏
- 关注作者
评论(0)