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 ...
相关推荐
小p1 天前
docker学习: 2. 构建镜像Dockerfile
docker
小p2 天前
docker学习: 1. docker基本使用
docker
蝎子莱莱爱打怪2 天前
Centos7中一键安装K8s集群以及Rancher安装记录
运维·后端·kubernetes
崔小汤呀2 天前
Docker部署Nacos
docker·容器
缓解AI焦虑2 天前
Docker + K8s 部署大模型推理服务:资源划分与多实例调度
docker·容器
1candobetter3 天前
Docker Compose Build 与 Up 的区别:什么时候必须重建镜像
docker·容器·eureka
DianSan_ERP3 天前
电商API接口全链路监控:构建坚不可摧的线上运维防线
大数据·运维·网络·人工智能·git·servlet
シ風箏3 天前
MySQL【部署 04】Docker部署 MySQL8.0.32 版本(网盘镜像及启动命令分享)
数据库·mysql·docker
呉師傅3 天前
火狐浏览器报错配置文件缺失如何解决#操作技巧#
运维·网络·windows·电脑
不是二师兄的八戒3 天前
Linux服务器挂载OSS存储的完整实践指南
linux·运维·服务器