Edited at

KubernetesのDockerの中でDocker動かしたい

More than 1 year has passed since last update.

CIだったりバッチ処理だったりと、何かとDocker in Dockerって使いたい場面ありますよね?

そんな時はDockerデーモンと通信するUNIXドメインソケット(/var/run/docker.sock)をマウントしちゃえばいいよって話です。

たとえばjava8のDockerイメージの中でdockerコマンド使いたいよって場合、Dockerfileはこんな感じになります。

FROM openjdk:8-jre

ENV DOCKER_CLIENT_VERSION=1.12.3
ENV DOCKER_API_VERSION=1.24
RUN curl -fsSL https://get.docker.com/builds/Linux/x86_64/docker-${DOCKER_CLIENT_VERSION}.tgz \
| tar -xzC /usr/local/bin --strip=1 docker/docker

ADD bin/hoge /bin/hoge

EXPOSE 8080

CMD ["java", "-jar", "/bin/hoge"]

入れ子にされるimageにはDockerクライアントだけ入れます。


hoge-deployments.yaml

apiVersion: extensions/v1beta1

kind: Deployment
metadata:
name: hoge
spec:
replicas: 1
template:
metadata:
labels:
app: hoge
spec:
containers:
- image: fuga/hoge:latest
name: hoge
volumeMounts:
- mountPath: /var/run/docker.sock
name: docker-sock-volume
readOnly: true
volumes:
- name: docker-sock-volume
hostPath:
path: /var/run/docker.sock
type: File

これで無事dockerコマンドがDockerImageの中で使えるようになります。

これで快適DockerLife間違い無し。


参考

Dockerコンテナ内でdockerコマンドを使う(dockerクライアントバイナリだけインストール方法) - Qiita