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 ...
相关推荐
skywalk81635 小时前
尝试在openi启智社区的dcu环境安装ollama最新版0.15.2(失败)
linux·运维·服务器·ollama
MMME~6 小时前
Ansible模块速查指南:高效定位与实战技巧
大数据·运维·数据库
zhengfei6116 小时前
AutoPentestX – Linux 自动化渗透测试和漏洞报告工具
linux·运维·自动化
我材不敲代码6 小时前
在Linux系统上安装MySQL
linux·运维·服务器
Free Tester6 小时前
基于已有容器生成Dockerfile
docker
obboda6 小时前
CICD 部署与使用
运维
yuezhilangniao6 小时前
阿里云服务器Alibaba Cloud Linux 3 安装Python3.11简明指南
linux·运维·python3.11
程序 代码狂人6 小时前
CentOS7初始化配置操作
linux·运维·开发语言·php
lcx_defender6 小时前
【Docker】Docker部署运行nacos
运维·docker·容器
历程里程碑6 小时前
Linux15 进程二
linux·运维·服务器·开发语言·数据结构·c++·笔记