Docker 镜像创建和管理以及 buildx 交叉编译

一、Docker 容器简介

容器技术的出现,使得应用的发布不再需要依赖于操作系统,从应用构建打包到部署保持完全一致,让应用的 CICD 发布更加的高效稳定,容器不需要像虚拟机一样需要包含一个完整的操作系统所需要的内容,而是只需要当前应用能够正常运行的 最小的环境,使得容器应用更加的轻量化,并且于部署机器上的环境相互隔离,从而保证了应用发布运行的稳定性。

本质上,容器是一种在操作系统之上更高级别的虚拟化

二、镜像构建

假设有如下目录结构的项目:

复制代码
.
├── README.md
├── api
│   ├── README.md
│   ├── DockerFile
│   ... project codes...
├── web
│   ├── README.md
│   ├── DockerFile
│   ... project codes...
...

其中 web/ 是我们前端项目代码,api/ 是我们的后端项目代码,每个项目都有一个对应的 DockerFile,用于编写项目镜像构建的步骤。

以前端项目为例,根据项目的 node.js 版本要求,在 Docker Hub 上找到对应的镜像,含了基本的 node.js 环境,作为构建的基础镜像,并按照前端项目的编译步骤,编写构建过程:

shell 复制代码
FROM node:22-alpine3.21 AS base
# ...
shell 复制代码
docker build -t your-image-name:your-tag-1.0 .

其中:

  • -t:用于指定构建之后的镜像名称(标签可选),格式为 name:tag@digest
  • .:指定构建的项目目录,为当前目录

命令将默认使用项目目录下面的 DockerFile 进行构建,也可以通过 -f 参数手动指定:

shell 复制代码
docker build -t your-image-name:your-tag-1.0 -f DockerFileCustom . 

构建执行完成之后,查看本地镜像可以看到最上方的镜像即为刚刚构建的最新镜像:

shell 复制代码
docker image ls | head -2

三、镜像管理

1. 查看

可以通过下面的命令列出本地镜像:

shell 复制代码
docker images
# 或新的命令方式
docker image ls

以上命令默认输出的镜像列表,包含以下信息:

  • REPOSITORY:镜像名称
  • TAG:标签
  • IMAGE ID:镜像的 id,唯一标识,可以使用此 ID 或者完整的镜像名操作指定镜像
  • CREATED:创建时间
  • SIZE:镜像大小

若你需要格式化输出,可以使用 --format 选项,通过 {``{.列名}} 的参数模板来引用上面的信息:

shell 复制代码
docker image ls --format "标签:{{.Tag}}"

以上命令将会输出当前所有本地镜像的标签信息。

如果你希望查看线上的 Docker Hub 上的镜像,可以使用 search 命令:

shell 复制代码
# 模糊搜索镜像
docker search nginx

# 限制回显数量
docker search nginx --limit 10

2. 删除和清理

删除单个镜像:

shell 复制代码
docker rmi <ID>
# 或
docker image rm <ID>

删除所有未引用的镜像(即没有与任何一个当前运行的容器相关):

shell 复制代码
docker image prune -a # -f 选项强制删除

3. 标签

通过 tag 命令打标签:

shell 复制代码
docker tag <ID> my-image:tag-1.0.0

4. 推送

shell 复制代码
# 首先,需要将待推送镜像打上目标 hub 的地址前缀
docker tag your-image:latest 192.168.2.144/your-image:latest
# 推送镜像
docker push 192.168.2.144/your-image:latest

推送成功之后,登录 hub 管理界面,可以看到推送的镜像。

5. 制品管理

四、buildx 交叉编译

很多时候,根据用户需求,容器往往需要运行在不同架构的系统上(例如,大部分企业经过信创改造的服务器运行的是 Kylin 的操作系统,arm64/v8 架构),这个时候就会出现需要在某个架构的系统上将项目代码构建为另外一个系统架构上运行的镜像,也就是跨平台的镜像。

docker 提供了一种交叉编译的方式,使用 buildx 工具来解决这个问题。

1. 安装并启用 buildx

shell 复制代码
docker buildx version

启用:

shell 复制代码
docker buildx create --name multiarch-builder --platform linux/amd64,linux/arm64/v8 --use

2. 交叉编译

使用 docker buildx build 进行构建:

shell 复制代码
docker buildx build --platform linux/arm64/v8 -t your-image-name:arm64-1.0.0 --load .

其中:

  • --platform:指定要编译的目标平台
  • --load:让 docker 在构建完成之后自动加载,相当于构建完之后执行了 docker load -i ...
相关推荐
你好,帅哥11 分钟前
openssl ,msys2 ,交叉编译
linux·运维·服务器
计算机安禾21 分钟前
【Linux从入门到精通】第36篇:DNS服务探秘——自己搭建一个内网DNS
linux·运维·servlet
Web极客码1 小时前
2026年Linux VPS安全加固清单:SSH、防火墙与审计就绪配置
运维·服务器·数据库
星恒讯工业路由器2 小时前
配网自动化多网融合应用解决方案
运维·自动化
智慧物业老杨2 小时前
智慧物业收费系统的数智化落地实践:从人工硬扛到自动化闭环
运维·自动化
techdashen2 小时前
Cloudflare 为何抛弃 NGINX,用 Rust 自研了一个代理
运维·nginx·rust
南城猿2 小时前
保姆级 Ubuntu 部署 禅道
linux·运维·ubuntu
珠海西格电力3 小时前
零碳园区产业园管理系统的全场景源网荷储氢协同调度功能是如何实现的
大数据·运维·人工智能·物联网·能源
木雷坞3 小时前
K8s GPU 推理服务 ImagePullBackOff 排查与预热
云原生·容器·kubernetes·gpu算力
wj3055853783 小时前
CC-Switch 在 WSL Ubuntu 中安装记录
linux·运维·ubuntu