docker in docker使用介绍

在我们工作场景中,可能需要在容器内使用docker。例如在k8s中,想借助deployment的弹性扩缩容能力来测试harbor的推送镜像性能,此时就需要在容器内进行镜像构造,然后推送。
docker提供了一些相关的镜像给我们进行此类操作,下面做一个简单介绍。

docker:dind

该镜像包含docker client和docker damon。使用方式如下:

docker run -tid --name dind --privileged docker:dind
docker exec -ti dind sh -c "docker ps -a"
首先需要启动dockerd,且要正常使用dockerd,需要指定容器为特权容器--privileged

docker:latest

该镜像只包含docker客户端,需要单独挂载宿主机的daemon。
docker run -tid -v /var/run/docker.sock:/var/run/docker.sock docker:latest sh -c "docker ps -a"

在deployment中使用时,可以起两个容器,一个容器起dockerd,另一个容器挂载dockerd的socket,作为客户端使用。好处是client镜像可以执行一些自定义命令,如果都在dockerd容器执行,需要先启动dockerd,执行其他命令可能存在问题。

docker:git

包含了git命令的docker:latest镜像。

自定义镜像

上述镜像镜像中的shell命令行只支持sh,而我需要使用到bash。因此自行制作了一个包含docker client的镜像。使用的基础镜像为ubuntu:14.04。

docker run -tid --name dind docker:latest sh -c "sleep 10000"
docker run -tid --name ubuntu ubuntu:14.04 bash
docker cp dind:/usr/local/bin/docker .
docker cp docker ubuntu:/bin
docker commit ubuntu mydockerclient:v1

然后使用自己制作的镜像来起容器,并可以使用bash。
docker run -tid -v /var/run/docker.sock:/var/run/docker.sock mydockerclient:v1 bash -c "docker ps -a"

kaniko

kaniko是谷歌提供的在k8s中构建镜像并推送到镜像仓库的镜像。在本地也可以直接使用。

  1. 首先需要创建一个config.json来告诉kaniko需要推送到的镜像仓库的用户名密码。
    先对用户名密码进行base64编码。
    echo -n username:password | base64
    然后将编码信息写入config.json。下面的registry-domain和base64code分别替换为仓库域名和前面的到的编码后的用户名密码。
cat > config.json <<-EOF
{
    "auths": {
        "https://registry-domain": {
            "auth": "base64code"
        }
    }
}
EOF
  1. 启动容器构建镜像并推送镜像
    首先在当前目录创建Dockerfile。
    echo FROM ubuntu:14.04 > Dockerfile
    然后启动容器构建镜像
docker run  -tid \
  -v `pwd`/config.json:/kaniko/.docker/config.json \
  -v `pwd`:/workspace \
  gcr.io/kaniko-project/executor:latest \
  --context /workspace \
  --dockerfile Dockerfile \
  --destination=xxx/yyy/zzzz:v1

关于在k8s中使用kaniko,可以参考:https://segmentfault.com/a/1190000039713484

sysbox runtime

正常docker使用的runtime是runc,使用sysbox runtime可以不需要privileged权限在容器内运行systemd,docker,k8s等服务。参考此处来安装runtime。
docker run --runtime=sysbox-runc --name sysbox-dind -d docker:dind
然后就能在容器内使用Dockerfile构建镜像了。

参考

https://devopscube.com/run-docker-in-docker

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容