本地镜像
images
列出本地镜像信息
docker images
graph LR;
P(参数)
P-->I(REPOSITORY)-->I1(镜像仓库源)
P-->T(TAG)-->T1(镜像标签)
P-->D(IMAGE ID)-->D1(镜像ID)
P-->E(CREATED)-->E1(镜像创建时间)
P-->F(SIZE)-->F1(镜像大小)
tag
创建本地镜像别名(tag)
docker tag 镜像ID 仓库:(tag)
save
将docker镜像保存到归档文件
docker save 镜像名/ID -o 压缩包
- 示例, 将镜像self_image:v0.1保存为self.image.tar
load
从压缩包中解压镜像文件
docker load -i 压缩包
- 示例, 解压self.image.tar
docker load -i self.image.tar
rm
删除镜像
正常镜像
docker rmi 容器名/ID
- 示例, 删除镜像test
none镜像
docker rmi -f $(docker images | grep '<none>' | awk '{print $3}')
history
查看镜像构建过程
docker history (参数) 容器名/ID
graph LR;
P(参数)
P-->A("-H, --human")-->A1(可读格式显示镜像大小, 默认启用)
P-->B("--no-trunc")-->B1(显示完整信息)
P-->C("-q, --quiet")-->C1(仅显示镜像ID)
- 示例, 查看镜像gpp:v0.1
镜像仓库
pull
从远程docker仓库中拉取镜像
docker pull (--platform 平台) 镜像名(版本, 默认latest)
- 示例, 拉取X86 busybox镜像
docker pull busybox
- 示例, 拉取arm gcc:12镜像
docker pull --platform linux/arm64 arm64v8/gcc:12
push
将本地镜像推送到镜像仓库
Dockerfile
Dockfile文件用于构建docker镜像
from
from
是 Dockerfile 中第一个非注释指令, 用于指定构建所用基础镜像
from (--platform=镜像平台) 镜像名(:tag)
指定平台
- 指定ARM64 alpine镜像为原始镜像
from --platform=linux/arm64 alpine:latest
多阶段构建
多阶段构建允许在单Dockerfile中使用多个from, 并且可以使用 as 为构建阶段命名
from 镜像名1 as 阶段名1
...
from 镜像名2 as 阶段名2
支持变量
from指令支持由出现在首个from前任何 arg 指令声明变量
arg BASE_IMAGE_VERSION=latest
from ubuntu:${BASE_IMAGE_VERSION}
workdir
设置工作目录(working directory), 即后续指令执行时默认目录
若指定相对路径, 则该路径将相对于容器内根目录(/)或之前通过 WORKDIR 设置目录
workdir 路径
- 示例, 设置工作路径/app
from alpine
workdir /app
run touch main.txt && mkdir code
特点
(1) WORKDIR 指令可以在 Dockerfile 中出现多次, 每次都会更新当前工作目录
(2) 若指定目录不存在, 构建镜像时会自动创建
run
在镜像构建过程中执行命令
run 指令 (参数1, 参数2,...)
run
指令会在构建镜像时创建新层, 因此应尽量减少不必要使用, 缩减镜像大小
- 示例, 更新apt源
run apt udpate && \
apt upgrade -y
- 示例, 安装设置python
run apt-get update && \
apt-get install -y python3 python3-pip
# 设置环境变量并安装 python 依赖
run export PYTHONDONTWRITEBYTECODE=1 && \
pip3 install --no-cache-dir -r requirements.txt
copy
构建时将构建上下文目录中源路径文件/目录复制到镜像内目标路径
copy 源路径 目标路径
- 示例, 复制当前目录下所有文件到镜像工作路径
copy . .
从镜像中复制
copy --from=镜像名 镜像中文件路径 目标路径
- 示例, 从nginx镜像中复制nginx.conf
copy --from=nginx:latest /etc/nginx/nginx.conf /nginx.conf
add
用于将构建上下文中文件或目录添加到镜像文件系统中
add
不仅可以添加, 还可自动解压压缩文件(如 .tar、.gz、.bz2、.xz 等), 以及支持从URL下载
add 源路径(压缩文件/网络文件) 目标路径
添加文件
多文件
- 示例, 把 file1.txt 和 file2.txt 添加到/app下
add file1.txt file2.txt /app/
添加压缩文件
- 示例, 把 archive.tar.gz 文件添加到镜像中, 并自动解压到 /app下
add archive.tar.gz /app/
网络下载文件
- 示例, 从网络上下载文件, 添加到 /app下
add URL地址 /app/
cmd
指定容器启动时要运行命令及其参数
graph LR;
P(特点)
P-->A(只能使用一次)
A-->A1(Dockerfile中只能有一个cmd生效, 若有多个, 只有最后一个会被执行)
P-->B(可被覆盖)
B-->B1(docker run后面参数可以覆盖cmd中命令和参数)
P-->C(提供默认执行命令)
C-->C1(docker run启动且没有指定其他命令时, 会执行cmd中命令)
shell格式
cmd 命令 参数1 参数2...
- 示例, 执行python指令
cmd python3 manage.py runserver 0.0.0.0:8000
exec格式
cmd ["命令", "参数1", "参数2", ...]
- 示例, 执行python指令
cmd ["python3", "manage.py", "runserver 0.0.0.0: 8000"]
graph LR;
X(cmd与run区别)
X -->A(cmd)-->A1(docker run时执行)-->A2(只能在Dockerfile末尾使用一次)
X -->B(run)-->B1(docker build时执行)-->B2(可在Dockerfile中使用若干次)
构建镜像
docker build (-f Dockerfile文件) -t 目标镜像名(:tag) .
单阶段
单Dockerfile
设当前目录仅有单Dockerfile
docker build -t 目标镜像名(:tag) .
- 示例, 构建g++镜像
# Dockerfile
from alpine as builder
workdir /
run sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
apk update && \
apk add g++
docker build -t gpp:v1 .
多Dockerfile
设当前目录存在Dockerfile.dev, Dockerfile.master
可通过-f
参数指定Dockerfile
docker build -f Dockerfile名 -t 目标镜像名(:tag) .
多阶段
多阶段构建可使用多from
, 方便在构建过程中从不同镜像中提取特定数据, 减少最终镜像体积
连续构建
- 示例, 多阶段构建go程序
// app.go
package main
import "fmt"
func main(){
fmt.Printf("Hello World!");
}
# Dockerfile
# 第一阶段
from golang:1.9-alpine as builder
workdir /go/src/github.com/go/helloworld/
copy app.go .
run apk --no-cache add git && \
go get -d -v github.com/go-sql-driver/mysql && \
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o app .
# 第二阶段
from alpine:latest as prod
workdir /root/
# 从第一阶段中拷贝可执行文件
copy --from=builder /go/src/github.com/go/helloworld/app .
run apk --no-cache add ca-certificates
cmd ["./app"]
仅构建某阶段
docker build --target=阶段名 -t 目标镜像名(:tag) .
交叉构建
可在x86_64设备上构建arm架构镜像
配置QEMU
docker run --rm --privileged multiarch/qemu-user-static --reset -p yes
参数
- –rm
容器停止后自动删除
- –privileged
给予root权限, 容器运行时需要访问宿主机硬件或内核功能时设置
- multiarch/qemu-user-static
镜像名称, 该镜像包含QEMU用户模式模拟的用户空间二进制文件, 其允许在A架构宿主机上运行B构二进制文件
- –reset
重置之前为当前系统架构配置的QEMU用户模式二进制文件
- -p yes
通知qemu-user-static探测当前系统架构, 并自动配置适当QEMU用户模式二进制文件, yes参数确认操作
拉取镜像
docker pull --platform 平台名 镜像名
- 示例, 拉取ARM alpine镜像
docker run --platform linux/arm64 alpine uname -m
构建
docker build (--platform 架构) -t 镜像名(:tag) .
- 示例, 构建arm64平台镜像
# Dockerfile
from --platform=linux/arm64 alpine:latest
run sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories && \
apk update && apk add gcc
docker build --platform linux/arm64 -t alpine_gcc:arm64 .
查看
docker inspect --format '' 镜像名
- 示例, 查看上面构建alpine_gcc:arm64镜像