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)
-
安装docker
由于我的yum源,有docker的安装文件,直接使用yum安装dockeryum install docker-ce -y
-
启动 docker
启动
systemctl start docker
开机自启
systemctl enable docker
查看docker的信息
docker info
-
pull centos7 镜像
docker pull centos:7
-
启动容器
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