文章目录
- 🐳 Docker 入门教程(十):镜像构建、提交、打标签与上传
- 一、镜像的构建方式
- 二、`docker commit` : 容器->镜像
- 三、`docker build` : dockerfile->镜像
- 四、上传镜像
- 五、拉取镜像
🐳 Docker 入门教程(十):镜像构建、提交、打标签与上传
一、镜像的构建方式
Docker 镜像(Image)是用于启动容器的只读模板,包含:
- 一个(或多个)层(layer),每层代表一次文件系统的更改
- 一个基础层(如
ubuntu、alpine),后续每层构建在其上 - 镜像不可变,不可写,所有更改都发生在容器可写层
镜像是构建时产物,容器是运行时产物。
镜像的构建方式对比
| 方式 | 命令 | 场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 手动保存容器 | docker commit | 快速实验保存 | 快速、方便 | 不可复现、不可维护 |
| 使用 Dockerfile | docker build | 正式开发构建 | 可版本管理、可审计、可重建 | 需要 Dockerfile 编写经验 |
二、docker commit : 容器->镜像
把运行中的容器,保存为一个新的镜像。
# 启动一个容器
docker run -it ubuntu# 安装 curl
apt update && apt install curl# 退出容器(Ctrl+D 或 exit)# 查看容器 ID
docker ps -a# 保存为镜像
docker commit <容器ID或名称> mycurl:v1
现在就可以用:
docker run -it mycurl:v1
- 这是一种“快照式”的构建方式
- 不包含构建记录(不知道这个 curl 是谁装的)
- 适合调试或交互式实验保存
三、docker build : dockerfile->镜像
这是推荐方式,通过写 Dockerfile 构建:
# Dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["python", "main.py"]
构建镜像:
docker build -t myapp:1.0 .
镜像就像是一层层构建的“增量文件系统”,build 命令每执行一个 Dockerfile 指令,就生成一层 layer。
四、上传镜像
步骤一:登录
docker login [registry-url]
默认是 Docker Hub,也可为私有仓库(如 Harbor)。
步骤二:准备上传标签
镜像命名格式:
[REGISTRY_HOST[:PORT]/]NAMESPACE/REPO[:TAG]
举例:
docker.io/library/nginx:latest
ghcr.io/myteam/myapp:1.2.3
harbor.company.com/devops/jenkins:custom
| 部分 | 示例 | 含义 |
|---|---|---|
| REGISTRY_HOST | docker.io | 默认为 Docker Hub |
| NAMESPACE | library、myuser | 用户名/组织名 |
| REPO | nginx、myapp | 仓库名 |
| TAG | :latest、:1.0 | 镜像版本标签(可省略,默认为 latest) |
镜像命名指令
docker tag myapp:1.0 myusername/myapp:1.0
步骤三:推送
docker push myusername/myapp:1.0
上传前会校验:
- 是否登录
- 镜像标签是否合法
- 是否有权限访问该仓库
五、拉取镜像
docker pull nginx
docker pull myregistry.com/team/app:stable
如果私有仓库地址没有配置信任,需要:
docker login myregistry.com
完整实践流程(一步步)
# 构建镜像
docker build -t myapp .# 查看镜像
docker images# 给镜像打 tag 准备上传
docker tag myapp myusername/myapp:1.0# 登录 Docker Hub(或私有仓库)
docker login# 推送
docker push myusername/myapp:1.0# 在另一台机器上拉取并运行
docker pull myusername/myapp:1.0
docker run -p 8000:8000 myusername/myapp:1.0