Why Docker in Docker?

最适合的领域应该是持续集成领域,不断地在容器内部产生子容器,加速交付流程。

官方博客里提供的DinD 的解决方案

在遥远的年代,需要很多其他的东西来辅助生成一个 docker in docker 的例子,但如今一个 —privileged 的 flag 就搞定一切了。

当前版本正确的 DinD 方案,是这样启动一个 DinD 容器:

1
2
# 我们不能在任意容器里启动子docker,目前都需要dind镜像
docker run --privileged -d docker:dind

exec 进入这个容器:

1
docker exec -it agitated_curran /bin/sh

然后在容器里再跑一个容器:

1
docker run -it ubuntu /bin/bash

Docker in Docker 为什么难?

这有一篇博客《~jpetazzo/Using Docker-in-Docker for your CI or testing environment? Think twice.》,专门解释这个问题。总体看下来, DinD 有方便的地方,但也会让 Linux 安全机制和文件系统产生混乱。容器本身还是不能彻底地虚拟化操作系统,只是对系统资源的一个沙箱隔离,容器内的 OS 还是能够感知到自己是运行在容器之中,因此会与外部的容器产生一定的冲突。

因为某个特殊的 Unix domain 套接字在容器内是不可复用的。

以下步骤未完全成功

映射多端口启动 ubuntu 容器:

1
docker run --privileged=true -it -p 8080:8080 -p 80:80 -v /var/run/docker.sock:/var/run/docker.sock ubuntu /bin/bash

容器内再安装容器并启动:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
apt-get update

apt-get -y install sudo

sudo apt-get -y install \
apt-transport-https \
ca-certificates \
curl \
software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -

sudo add-apt-repository \
"deb [arch=amd64] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) \
stable"

sudo apt-get update

sudo apt-get -y install docker-ce

service docker start

docker run hello-world