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 ...
相关推荐
wait_luky8 小时前
chrony服务器
运维·服务器
飞翔沫沫情8 小时前
OpenEuler 发行版 二进制部署docker
docker·openeuler·容器引擎
我的golang之路果然有问题8 小时前
OpenTelemet 实习中了解到的部分
运维·服务器·opentelemetry
Cyber4K8 小时前
【Kubernetes专项】Docker 容器部署及基本用法
运维·docker·云原生·容器
techzhi9 小时前
Docker 多架构镜像构建方案实施指南
docker·架构
Controller-Inversion9 小时前
负载均衡与反向代理
运维·负载均衡
呉師傅9 小时前
国产麒麟系统卡启动项或图标如何解决
运维·网络·windows·计算机外设·电脑
deriva9 小时前
nginx如何将某域名/二级站点/代理到二级站点?以ChirpStack实战为例
运维·nginx
遇见火星9 小时前
Linux 运维:删除大日志文件时避免磁盘 IO 飙升,echo 空文件 vs truncate 命令对比实操
linux·运维·服务器