Docker镜像制作定制应用打包:从零开始
为什么需要自己制作Docker镜像
很多朋友在部署服务时直接拉取官方镜像,但遇到需要定制应用打包的场景(比如把自己写的小程序、特定配置文件加进镜像),就得亲手制作镜像了。
本文将带你从零开始,用最直接的步骤完成 Docker镜像制作定制应用打包,让你以后部署任何应用都能随心所欲。
前置准备:装好Docker并确认版本
先确保你的Linux服务器(本文以CentOS 7/Ubuntu 20.04为例)安装了Docker。
没装的话执行:
# CentOS
sudo yum install -y yum-utils
sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
sudo yum install -y docker-ce docker-ce-cli containerd.io
sudo systemctl start docker
sudo systemctl enable docker
# Ubuntu
sudo apt update
sudo apt install -y docker.io
sudo systemctl start docker
sudo systemctl enable docker
检查版本:docker --version,输出类似 Docker version 24.0.7 就可以了。
还要确认当前用户能执行docker命令(不加sudo),可以把用户加入docker组:sudo usermod -aG docker $USER,然后重新登录。
编写Dockerfile:定制应用的核心文件
在服务器上新建一个文件夹,作为打包工作目录。
比如我们要打包一个Python写的简单Web应用(Flask),文件结构如下:
myapp/
├── app.py # 你的应用代码
├── requirements.txt # 依赖列表
└── Dockerfile # 镜像定制说明书
Dockerfile 示例(一行一行解释):
# 使用官方Python3.9镜像作为基础
FROM python:3.9-slim
# 设置工作目录
WORKDIR /app
# 复制当前目录所有文件到容器内/app
COPY . /app
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 暴露端口(假设应用跑在5000端口)
EXPOSE 5000
# 容器启动时运行的命令
CMD ["python", "app.py"]
小提示:COPY . /app会复制整个目录,如果只想复制必要文件,可以写具体文件名。--no-cache-dir可以减少镜像体积。
执行打包:构建镜像并验证
在 myapp 目录下执行构建命令(注意最后的点):
docker build -t my-flask-app:v1 .
-t指定镜像名称和标签,名称最好用小写字母;- 末尾的
.代表Dockerfile所在的当前目录。
构建过程会逐条执行Dockerfile指令,看到 Successfully built 和 Successfully tagged 就表示镜像制作成功了。
查看生成的镜像:
docker images
你应该能看到 my-flask-app 镜像,大小为几百MB(基础镜像已经占了一部分)。
避坑指南:镜像制作中常见的报错
报错1:COPY failed: file not found
因为你漏了文件或者Dockerfile中的路径写错了。确保 COPY . /app 中的 . 对应的是你终端所在的目录,且目录里确实有 app.py 和 requirements.txt。
报错2:pip install 失败
如果是在公司内网,可能需要换国内源。在Dockerfile中修改 RUN 指令:
RUN pip install -i https://pypi.tuna.tsinghua.edu.cn/simple --no-cache-dir -r requirements.txt
报错3:docker build 执行很慢
请检查是否每次构建都重新下载依赖。可以把依赖复制步骤放到代码复制之前,利用Docker缓存机制:
COPY requirements.txt /app/
RUN pip install --no-cache-dir -r requirements.txt
COPY . /app/
这样只要 requirements.txt 没变,pip步骤就会使用缓存,大大加快构建速度。
效果验证:运行并测试定制镜像
用刚打好的镜像启动一个容器:
docker run -d -p 5000:5000 --name myapp-test my-flask-app:v1
-d后台运行;-p 5000:5000将宿主机的5000端口映射到容器内的5000端口。
检查容器运行状态:docker ps,如果看到 myapp-test 状态为 Up,说明启动正常。
然后访问 http://服务器IP:5000 看看应用是否返回正确页面。
你还可以进入容器内确认文件:
docker exec -it myapp-test /bin/bash
ls /app
所有文件都复制过来了,依赖也安装完毕。
至此,你已经完成了 Docker镜像制作定制应用打包 的全部流程。
以后需要修改应用代码,只需更新源码后重新构建一次镜像,就能得到最新版本。
如果你在制作镜像时遇到其他问题,建议优先检查Dockerfile中的路径和命令,或者把构建日志贴到网上搜索,通常几分钟就能找到答案。