Docker in Docker とは?
Docker in Docker とは?
- Docker コンテナ内に Docker 処理系そのものを収容
- 内側の Docker の中にコンテナを立ち上げると…
→外から見ると入れ子状になる
Docker in Docker の動作イメージ
ミニマムな構成
オフィシャルのイメージがあるのでそれを使う (タグの後ろに -dind
と付いている)
docker-compose.yaml
---
version: "3.7"
services:
docker:
image: docker:19.03-dind
privileged: true
ヤバいです、主にセキュリティー的な意味で。
privileged: true
(ヤバすぎるので抜粋再掲)
詳しい説明は省略しますが、 Linux 内に隔離された空間を作るには相当の特権が必要なようです。
おしまい
んなわけあるか!!
色々いじってみる
ミニマム構成の問題点
-
あんまりメリットが見えない
-
内側の Docker の通信路が TCP
→ docker build の時にコンテキストといって色々ファイルを Docker のデーモンに送りつけているのだが、その通信路と考えるといささか心もとない
メリットを出そう
隣接するコンテナからの指示で、内側の Docker にコンテナを建てられると便利そう。
docker-compose.yaml
---
version: "3.7"
services:
docker:
image: docker:19.03-dind
privileged: true
frontend:
image: docker:latest
depends_on:
- docker
通信路の改善 ~よし、ならば UNIX ドメインソケットだ~
/var/run/docker.sock
を隣接するコンテナと共有できれば… そういう時は volumes
を使いましょう。
docker-compose.yaml
---
version: "3.7"
services:
docker:
image: docker:19.03-dind
privileged: true
volumes:
- run:/run:rw # /var/run は /run へのシンボリックリンクなので… 以下同様
environment:
- DOCKER_TLS_CERTDIR=
frontend:
image: docker:latest
volumes:
- run:/run:rw
depends_on:
- docker
environment:
- DOCKER_HOST=unix:///var/run/docker.sock
volumes:
run:
# tmpfs-as-a-volume: https://stackoverflow.com/a/45759927
driver_opts:
type: tmpfs
device: tmpfs
o: size=1M,mode=0755,uid=0,gid=0