官方博客里提供的DinD 的解决方案
在遥远的年代,需要很多其他的东西来辅助生成一个 docker in docker 的例子,但如今一个 —privileged 的 flag 就搞定一切了。
当前版本正确的 DinD 方案,是这样启动一个 DinD 容器:
1
| 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.》,专门解释这个问题。总体看下来,有方便的地方,但也会让 Linux 安全机制和文件系统产生混乱。
因为某个特殊的 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
|