第 8 节

手动创建Docker镜像

(嫌麻烦的话,直接去看各种docker容器部署的章节)(有别人给你创建好的,就别自己折腾啦)

DockerFile

指令说明示例
FROM指定基础镜像,是 Dockerfile 的起点FROM ubuntu:22.04
LABEL添加元数据(如作者、版本等)LABEL maintainer="you@example.com"
ENV设置环境变量ENV PORT=8080
ARG构建参数,只在构建期间可用ARG VERSION=1.0
RUN构建镜像时运行命令RUN apt-get update && apt-get install -y curl
COPY复制文件到镜像中COPY . /app
ADD类似 COPY,额外支持解压 .tar 文件或远程 URL(不推荐用于 URL)ADD archive.tar.gz /data/
WORKDIR设置工作目录WORKDIR /opt
CMD设置容器启动时默认命令(可被 docker run 覆盖)CMD "node", "index.js"
ENTRYPOINT设置容器启动时固定命令(通常用于 CLI 工具等)ENTRYPOINT "python3"
EXPOSE声明镜像内服务监听的端口(不会自动映射)EXPOSE 80
VOLUME声明数据卷挂载点VOLUME "/data"
USER设置后续命令执行的用户USER appuser
ONBUILD当镜像作为其他镜像基础镜像时触发的构建指令ONBUILD COPY . /src
SHELL更改默认 shell,比如将 sh -c 改为 bash -cSHELL "/bin/bash", "-c"
HEALTHCHECK定义容器运行时的健康检查命令`HEALTHCHECK CMD curl --fail http://localhost:8080
STOPSIGNAL容器停止时发送的信号STOPSIGNAL SIGKILL

自己创建容器

手动创建

https://github.com/tungchiahui/ros-docker


# DockerFile内容请看Github仓库中的DockerFile

在x86电脑上编译x86的:

docker build -t ros-melodic-cuda118-cudnn8-bionic:latest .

docker build -t ros-noetic-focal:latest .

docker build -t ros-humble-jammy:latest .

docker build -t ros-jazzy-noble:latest .

docker build -t ros-humble-opencv411-cuda128-cudnn970-jammy:latest .

docker build -t ros-jazzy-opencv411-cuda128-cudnn970-noble:latest .

镜像大小5GB(压缩后的大小详见DockerHub)

将 Docker 镜像推送到 Docker Hub 的步骤如下:

  1. 创建 Docker Hub 账户

如果你还没有 Docker Hub 账户,请前往 Docker Hub 注册一个免费账户。

  1. 登录 Docker Hub

在终端中使用以下命令登录到你的 Docker Hub 账户:

docker login

输入你的 Docker Hub 用户名和密码进行验证。

  1. 为你的镜像打标签

Docker Hub 使用 <用户名>/<镜像名>:<标签> 的格式来标识镜像。你需要为你的镜像打上标签,以便能够推送到 Docker Hub。使用以下命令:

docker tag ros-jazzy-noble:latest <你的用户>/ros-jazzy-noble:latest

例如,如果你的 Docker Hub 用户名是 tungchiahui,你应该执行:

docker tag ros-noetic-focal:latest tungchiahui/ros-noetic-focal:latest

docker tag ros-humble-jammy:latest tungchiahui/ros-humble-jammy:latest

docker tag ros-jazzy-noble:latest tungchiahui/ros-jazzy-noble:latest

docker tag ros-humble-opencv411-cuda128-cudnn970-jammy:latest tungchiahui/ros-humble-opencv411-cuda128-cudnn970-jammy:latest

docker tag ros-jazzy-opencv411-cuda128-cudnn970-noble:latest tungchiahui/ros-jazzy-opencv411-cuda128-cudnn970-noble:latest
  1. 推送镜像到 Docker Hub

使用以下命令将镜像推送到 Docker Hub:

docker push <你的用户>/ros-noetic-jazzy-noble:latest

例如:

docker push tungchiahui/ros-noetic-focal:latest

docker push tungchiahui/ros-humble-jammy:latest

docker push tungchiahui/ros-jazzy-noble:latest

docker push tungchiahui/ros-humble-opencv411-cuda128-cudnn970-jammy:latest

docker push tungchiahui/ros-jazzy-opencv411-cuda128-cudnn970-noble:latest

docker push tungchiahui/ros-noetic-focal-arm64:latest
  1. 验证推送成功

你可以通过访问 Docker Hub 的个人页面来验证你的镜像是否已成功推送。

注意事项

  • 确保你的镜像大小在 Docker Hub 的限制范围内(一般为 10GB)。
  • 如果你打算将镜像公开,可以设置为公共仓库;如果希望只有你自己可以访问,可以设置为私有仓库。

手动创建(跨平台多架构构建)

如果您想在 x86/x64 电脑上即为本机x86设备构建镜像,又想为树莓派、Jetson等ARM64 设备构建 Docker 镜像 ,需要使用 Docker 的跨平台构建功能 。以下是完整解决方案:


1. 启用 Docker 跨平台构建

在 x86 主机上模拟 ARM64 环境需要以下工具:

第一步:启用 buildx(只需执行一次)

docker buildx create --name multiarch_builder --use

这会创建并启用一个支持多架构构建的 builder,电脑重启后也依然存在,所以只用运行一次。

第二步:安装 QEMU 支持(一般新版 Docker Desktop 已自带,但是Linux必须要安装) 如果你用的是服务器或Linux发行版,确保有 qemu 模拟器:

docker run --rm --privileged multiarch/qemu-user-static --reset -p yes

电脑重启后,就会消失,所以需要你每次电脑重启后,在buildx命令前,运行一次该命令即可。

第三步:构建多架构镜像 用下面的命令构建 amd64 和 arm64:

docker buildx build --platform linux/amd64,linux/arm64 -t <你的镜像>:<> --push .

# 例子:
docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t tungchiahui/ros:noetic-focal \
 --push \
 .

docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t tungchiahui/ros:humble-jammy \
 --push \
 .

docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t tungchiahui/ros:jazzy-noble \
 --push \
 .

 docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t tungchiahui/opencv:411-cuda128-cudnn970-focal \
 --push \
 .

docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t tungchiahui/opencv:411-cuda128-cudnn971-jammy \
 --push \
 .

 docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t tungchiahui/opencv:411-cuda128-cudnn971-noble \
 --push \
 .

docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t tungchiahui/ros-opencv:noetic-411-cuda128-cudnn970-focal \
 --push \
 .

docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t tungchiahui/ros-opencv:humble-411-cuda128-cudnn970-jammy \
 --push \
 .

 docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t tungchiahui/ros-opencv:jazzy-411-cuda128-cudnn970-noble \
 --push \
 .

  docker buildx build \
--platform linux/amd64,linux/arm64 \
 -t sdutvincirobot/ros-opencv:humble-411-cuda128-cudnn970-jammy \
 --push \
 .

说明: --platform 指定多架构。 --push 是必须的,因为 buildx 的多平台构建默认是不能本地加载的(除非加 --load,但那只能支持单一架构)。

清除构建缓存


# 清理BuildKit构建缓存
docker builder prune -f