使用M芯片的Macbook 给群晖打包Docker image
最近做面食比较多,换算比例比较麻烦,所以用 AI 写了一个计算器来计算水量和酵母的量。
image-20250302223319661image-20250302223319661
打算部署的时候扔到群晖上去,但是我的 Mac 是 ARM 的架构,默认编译出来的 image 不能直接使用。
Dockerfile 如下:
# 使用 Python 3.12 作为基础镜像
FROM python:3.12-slim
# 设置工作目录
WORKDIR /app
# 安装系统依赖(如果需要)
RUN apt-get update && apt-get install -y --no-install-recommends
gcc
libc6-dev
&& rm -rf /var/lib/apt/lists/*
# 复制 requirements.txt 并安装 Python 依赖
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 设置环境变量
ENV FLASK_APP=app.py
ENV FLASK_ENV=production
# 确保脚本可执行
RUN chmod +x /app/start.sh
# 暴露端口
EXPOSE3002
# 启动应用
CMD ["./start.sh"]
start.sh 如下:
#!/bin/sh
exec gunicorn --bind 0.0.0.0:3002 --workers 4 app:app
这个时候就需要使用 buildx。
docker buildx build --platform linux/amd64 -t mian:latest --load .
然后在我的 Orbstack 上可以看到编译出来了 X86 架构的 images。
image-20250302223817541image-20250302223817541
使用docker save mian:latest > 1.tar 打包成 tar 文件,上传到群晖上
image-20250302224032812image-20250302224032812
启动 Docker:
docker run -d --name mian -p 3002:3002 --restart unless-stopped mian:latest
访问群晖的地址就可以成功访问了~
image-20250302223319661image-20250302223319661
总结:Docker 构建、导出和运行容器的完整流程解析
在开发和部署应用时,我们通常需要构建 Docker 镜像、导出镜像以便于分发,并最终运行容器提供服务。本文将详细解析以下三个常见的 Docker 命令,并介绍它们的作用及应用场景。
1. 构建 Docker 镜像
docker buildx build --platform linux/amd64 -t printer:latest --load .
命令解析
该命令用于 构建 Docker 镜像,并指定了适用于 linux/amd64 平台的架构。各个参数的含义如下:
•
docker buildx build:使用 Docker BuildKit 进行镜像构建,支持多架构构建。•
--platform linux/amd64:指定目标平台架构为linux/amd64(适用于 x86_64 处理器)。•
-t printer:latest:为构建的镜像命名为printer:latest,便于后续管理。•
--load:构建完成后直接加载到本地 Docker,而不是推送到远程仓库。•
.:表示使用当前目录作为构建上下文,Docker 将根据Dockerfile构建镜像。
应用场景
• 适用于本地环境构建和测试 Docker 镜像。
• 需要为特定平台(如
linux/amd64)构建镜像,以便部署到目标环境。• 结合
--load直接在本地使用构建好的镜像,而不推送到远程仓库。
2. 导出 Docker 镜像
docker save printer:latest > 1.tar
命令解析
该命令用于将 printer:latest 镜像导出为 .tar 文件,以便于传输或备份:
•
docker save printer:latest:将printer:latest镜像打包为可存储的.tar归档文件。•
> 1.tar:将导出的镜像数据写入1.tar文件。
应用场景
• 跨机器分发:如果目标服务器无法访问 Docker Hub 或私有镜像仓库,可以手动拷贝
.tar文件并加载。• 备份:在部署前保存镜像,确保可以回滚到之前的版本。
• 离线部署:在没有网络的环境下,可以通过
docker save和docker load在不同设备之间迁移镜像。
3. 运行 Docker 容器
docker run -d --name printer_container -p 8888:8000 -v /var/run/docker.sock:/var/run/docker.sock --restart unless-stopped printer:latest
命令解析
该命令用于 启动一个基于 printer:latest 镜像的容器:
•
docker run -d:以 后台模式 运行容器,保持运行状态。•
--name printer_container:指定容器名称为printer_container,便于管理和调试。•
-p 8888:8000:将 宿主机 8888 端口 映射到 容器的 8000 端口,使外部可以通过http://localhost:8888访问该应用。•
-v /var/run/docker.sock:/var/run/docker.sock:将 宿主机的 Dockersock文件 挂载到容器内部,允许容器与宿主机 Docker 交互,通常用于 容器管理 或 动态创建容器。•
--restart unless-stopped设置重启策略:
unless-stopped:Docker 进程或主机重启后,容器会自动重启,除非手动停止。•
printer:latest:指定使用printer:latest镜像来创建容器。
应用场景
• 持久化运行:确保容器在 Docker 进程或服务器重启后仍能自动启动。
• 端口映射:将应用服务暴露给外部访问,例如
http://192.168.1.X:8888。• 与宿主机 Docker 交互:挂载
docker.sock以便于容器内部管理 Docker 进程,例如 使用容器来构建和管理其他容器。
小提示
命令作用docker buildx build --platform linux/amd64 -t printer:latest --load .
构建 Docker 镜像,指定 linux/amd64 平台,并加载到本地
docker save printer:latest > 1.tar
将 printer:latest 镜像导出为 1.tar 文件,便于备份或分发
docker run -d --name mian -p 8888:8000 -v /var/run/docker.sock:/var/run/docker.sock --restart unless-stopped printer:latest
运行 printer:latest 容器,映射端口 8888:8000,挂载 docker.sock,并确保容器自动重启
通过这三个步骤,我们完成了 镜像的构建、导出和运行,为应用的容器化部署提供了完整的解决方案。
作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~
