Docker in docker 实现

Docker in docker

文章目录

在docker容器内运行docker一般是不被倡导的。但有些场景和业务上,需要在容器内使用docker对组件进行编译构建,不同的组件所需的依赖有不一致,不同自建相互之间的依赖很可能相互干扰(比如需要同一个组件的不同版本),因此docker-in-docker的解决方案被提出来了, 一般被用于CI或集成测试。

原理

通过将主机上的docker.sock挂载至容器内,实现共享主机的docker.sock,使得在容器内可以使用宿主机上的docker daemon;在容器中使用的docker pull push build image run 实际上使用的是宿主机的docker daemon;
通过将主机上的docker命令脚本挂载至容器,实现共享docker服务。

实现(centos7)

  1. 安装docker
    由于我的yum源,有docker的安装文件,直接使用yum安装docker

    yum install docker-ce -y

  2. 启动 docker

    启动

    systemctl start docker

    开机自启

    systemctl enable docker

    查看docker的信息

    docker info

  3. pull centos7 镜像

    docker pull centos:7

  4. 启动容器

    docker run -it --name docker-daemon --hostname daemon-test --network=host -v /var/run/docker.sock:/var/run/docker.sock -v /usr/bin/docker:/usr/bin/docker -e DOCKER_HOST=“unix:///var/run/docker.sock” centos:7 /bin/bash

–network: 指定容器的网络, 启动容器默认使用bridge网络,这里直接使用主机的网络
-e:设置环境变量,这里直接指定使用docker.sock访问docker daemon
-v: 挂载文件,直接将主机的docker.sock挂载至容器内,共享docker daemon;挂载docker命令脚本至容器内,共享docker服务

查看容器内的docker信息

[root@daemon-test /]# docker version
Client: Docker Engine - Community
 Version:           19.03.1
 API version:       1.40
 Go version:        go1.12.5
 Git commit:        74b1e89
 Built:             Thu Jul 25 21:21:07 2019
 OS/Arch:           linux/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.1
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.5
  Git commit:       74b1e89
  Built:            Thu Jul 25 21:19:36 2019
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.2.6
  GitCommit:        894b81a4b802e4eb2a91d1ce216b8817763c29fb
 runc:
  Version:          1.0.0-rc8
  GitCommit:        425e105d5a03fabd737a126ad93d62a9eeede87f
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

常见问题

1. Cannot connect to the daemon

a. 检查 docker 运行状态

docker info

如果docker服务未启动的话, 尝试重启docker服务

b. 重启docker服务(centos)

systemctl restart docker

如果还不能启动docker的话, 按提示输入systemctl status docker.service或者journalctl -xe查看具体情况

c. 查看失败日志

systemctl status docker.service
#or
journalctl -xe

参考

  1. How to detect a docker daemon port
  2. 使用docker in docker
  3. 使用Docker-in-Docker 来运行 CI
  4. hub.docker.com
  5. docs.docker.com
  6. github.com
  7. docs.docker.com:sdk
  8. docs.docker.com:sdk-example

猜你喜欢

转载自blog.csdn.net/shuux666/article/details/124168941