docker in docker是什么?

顾名思义,docker in docker就是在docker容器中运行docker服务端。这种技术通常用于CI/CD流水线中,因为它可以提供一个干净的环境来运行构建和测试。例如,如果您正在使用Jenkins作为CI/CD工具,您可以使用DinD来运行构建和测试,而无需在Jenkins服务器上安装Docker。这样可以避免与Jenkins服务器上的其他应用程序发生冲突。
使用DinD时,需要注意的是,它会增加容器的复杂性,并且可能会导致性能下降。此外,由于容器内部运行的是另一个容器,因此可能会出现一些安全问题。
本篇中用DinD来完成对docker proxy功能的验证。

为什么docker要使用代理?

Docker使用代理的原因有很多,其中一些原因包括:

  • 访问公司私有化部署的镜像仓库,对网络环境有限制。
  • 对于一些公共仓库,下载速度很慢,通过代理实现加速上传与下载。

在本测试环境中,docker容器所在环境与目标docker 镜像仓库是网络隔离的,同时两个网络之间可以通过一个http proxy来进行通信。

如何配置proxy代理?

官方说明:https://docs.docker.com/config/daemon/systemd/#httphttps-proxy

  1. 运行dockerindocker
    1
    docker run -it --privileged --rm  --entrypoint="sh" docker:24.0.1-dind
  2. 设置proxy, 有两种方法进行配置(docker 23.0以版本)
  • 通过/etc/docker/daemon.json
    1
    2
    3
    4
    5
    6
    7
    {
    "proxies": {
    "http-proxy": "http://proxy.example.com:3128",
    "https-proxy": "https://proxy.example.com:3129",
    "no-proxy": "*.test.example.com,.example.org,127.0.0.0/8"
    }
    }
  • 设置代理环境变量
    1
    2
    / # export http_proxy=http://proxy.example.com:3128
    / # export https_proxy=https://proxy.example.com:3129
  1. 正常使用docker命令,docker pull/push 均会使用该proxy与镜像仓库交互
    1
    2
    3
    4
    / # dockerd &
    / # docker pull docker:24.01-dind
    / # docker tag docker:24.01-dind remote-repo.app/docker:24.01-dind
    / # docker push remote-repo.app/docker:24.01-dind