无垠之码

深度剖析代码之道


docker命令小技巧

1.runlike工具


工作中总是难免遇到没有使用compose管理的容器服务,复杂的容器服务导出命令参数可能需要使用inspect子命令,分析json文件。runlike工具简化相关过程,直接使用runlike+容器名可以导出容器构建命令

pip install runlike
runlike posteio
docker run --name=posteio --hostname=mail.diyao.me --volume /data --env=TZ=Asia/Shanghai --env=DISABLE_CLAMAV=TRUE --network=host --restart=always --runtime=runc --detach=true analogic/poste.io

2.下一代构建引擎buildkit


buildkit是docker新一代镜像构建引擎,用来替代旧版docker build所使用的legacy builder,作为构建引擎的后端其前端使用docker的buildx插件进行调用与配置,实现现代化、多平台、安全可复现的容器镜像构建流程,同时buildx也支持分布式构建

sudo apt-get install docker-buildx-plugin

多平台方面,buildx支持构建以下类型镜像:

linux/arm64
linux/amd64
linux/amd64/v2
linux/riscv64
linux/ppc64le
linux/s390x
linux/386
linux/mips64le
linux/mips64
linux/arm/v7
linux/arm/v6

简单案例

使用buildx构建docker镜像,构建工作都在moby/buildkit镜像实例中进行,在容器中实际执行构建任务,包括拉取基础镜像、执行指令(如 RUN、COPY)、构建缓存、输出镜像等

# 创建buildx构建实例
# buildx-create命令的bootstrap参数,立即运行buildx实例,否则在构建时惰性运行实例
# buildx-create命令的driver参数,可以生产不同引擎的buildx实例
# 在后续的构建流程中,使用test实例

docker buildx create --name test --bootstrap   
docker buildx use test                         
docker buildx build --sbom=true --provenance=true --output=type=local,dest=build --platform=linux/amd64  -f Dockerfile .

# 多节点分布式构建
docker buildx create --name test --node test0 --driver docker-container ssh://root@192.168.5.46
docker buildx create --name test --node test1 --append --driver docker-container ssh://root@192.168.5.47

buildx支持多种构建引擎,下表列出引擎的相应使用场景

引擎 说明
docker 使用本地docker守护进程(默认,功能受限)
docker-container 使用moby/buildkit容器,更完整的buildKit支持
kubernetes 在k8s中运行构建节点
remote 使用远程buildKit节点

构建时的sbom指示生成,软件物料清单其中包含镜像中的软件包,文件的版本,hash值,来源信息,帮助分析镜像内容做依赖合规检查、发现已知漏洞等

provenance参数生成构建的可追溯信息,其中包含构建工具,输入来源,构建参数,构建者信息,构建时间,输入摘要,提供构建溯源能力,帮助安全团队验证镜像是否由可信源构建,是否被篡改过,是否可以重现

syft工具可读入镜像文件,生成sbom信息,配套grype开源工具可以读取sbom文件进行漏洞分析,利用cosign工具可以对构建的镜像进行签名,当然cosign也可以验证签名。你也可以使用docker内置的签名工具,十分简单,只需要export DOCKER_CONTENT_TRUST=1在docker push执行时可以自动签名

syft ubuntu:latest
cosign generate-key-pair
docker inspect --format '{{index .RepoDigests 0}}' ubuntu:latest
cosign sign --key ./cosign.key ubuntu@sha256:1e622c5f073b4f6bfad6632f2616c7f59ef256e96fe78bf6a595d1dc4376ac02

注意事项

1 使用buildx构建多平台镜像时,出现基础镜像拉取不下来,即使是修改docker的配置文件,修改docker源为国内源,还是会出现这个问题? 因为buildx的原理是先创建一个buildx的多平台镜像,在这个多平台镜像中构建所需的镜像,所以配置文件无法继承主机的docker配置

针对此问题可以使用以下几种方式规避

  • 配置驱动参数,使用代理访问docker镜像仓库
export PROXY=http://192.168.5.170:2080
export NOPROXY=127.0.0.1,localhost,/run/buildkit/buildkitd.sock 
docker buildx create --name test --driver-opt env.http_proxy=${PROXY} --driver-opt env.https_proxy=${PROXY}  --driver-opt '"env.no_proxy='${NOPROXY}'"'
docker buildx use test
docker buildx build .
  • 配置remote驱动,使用远程实例
# 远程主机运行buildkit实例,本地主机使用remote引擎连接实例
docker run -d -v 1234:1234 --name buildkitd --privileged moby/buildkit:latest --addr tcp://0.0.0.0:1235

export BUILDKIT_NO_CLIENT_TOKEN=1
docker buildx create --name test --driver remote tcp://103.79.76.198:1235 --use
docker buildx build .
  • 使用docker-container的ssh方式
export BUILDKIT_NO_CLIENT_TOKEN=1
docker buildx create --name test --driver docker-container ssh://root@103.79.76.198 --use
docker buildx build .

3.docker容器的异构运行


Docker本身不直接模拟不同架构的指令集,而是依赖QEMU用户态模拟和多平台镜像支持来实现异构运行,QEMU通过二进制动态翻译binfmt_misc模拟目标CPU指令集,如ARM on x86 多平台镜像:镜像需包含目标平台的镜像层,如arm64或amd64

sudo apt-get install qemu binfmt-support qemu-user-static
docker pull --platform linux/arm64 arm64v8/ubuntu
docker run --rm -it --platform linux/arm64 arm64v8/ubuntu:latest uname -m

4.Whaler导出镜像Dockerfile


Whaler(捕鲸船)是一个用Go编写的程序,旨在逆向Docker镜像,恢复创建该镜像的Dockerfile文件,搜索已添加的文件名,以查找潜在的敏感文件,以及显示一些其他信息,如开放的端口、运行用户和环境变量等

whaler -v -sV=1.36 klakegg/hugo:latest

Analyzing klakegg/hugo:latest
Docker Version: 
GraphDriver: overlay2
Environment Variables
|PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|HUGO_VERSION=0.111.3
|HUGO_BIND=0.0.0.0
|HUGO_DESTINATION=public
|HUGO_ENV=DEV
|HUGO_EDITION=standard
|HOME=/tmp

Open Ports
|1313

Image user
|User is root

Potential secrets:
unable to parse history from json file

5.参考文献

  1. https://github.com/P3GLEG/Whaler
  2. https://github.com/lavie/runlike
comments powered by Disqus