使用M芯片的Macbook 给群晖打包Docker image

2025-03-17 17:58:49 5点赞 2收藏 0评论

最近做面食比较多,换算比例比较麻烦,所以用 AI 写了一个计算器来计算水量和酵母的量。

image-20250302223319661image-20250302223319661

image-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

image-20250302223817541

使用docker save mian:latest > 1.tar 打包成 tar 文件,上传到群晖上

image-20250302224032812image-20250302224032812

image-20250302224032812

启动 Docker:

docker run -d --name mian -p 3002:3002 --restart unless-stopped mian:latest

访问群晖的地址就可以成功访问了~

image-20250302223319661image-20250302223319661

image-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:将 宿主机的 Docker sock 文件 挂载到容器内部,允许容器与宿主机 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,并确保容器自动重启

通过这三个步骤,我们完成了 镜像的构建、导出和运行,为应用的容器化部署提供了完整的解决方案。

作者声明本文无利益相关,欢迎值友理性交流,和谐讨论~

展开 收起
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

相关文章推荐

更多精彩文章
更多精彩文章
最新文章 热门文章
2
扫一下,分享更方便,购买更轻松