一、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 ...