概要
Docker for WindowsでDocker outside of Dockerができないと勝手に思っていましたが、
以下の方法で普通に使えることがわかったので、ご紹介します
方法
一般的に有名な方法として以下の二つがあります
ずっとWindows環境では使えないと思っていましたが、どちらでも使えます
- docker in docker
- コンテナにホストのdocker.sockをマウントする(Docker outside of Docker)今回は
参考:
docker.sockのマウント
/var/run/docker.sock
をコンテナにマウントするが、Windows環境ではどうやら自動的にDocker Machineのパスとして判定してくれるようです
ホストのdocker.sockを共有しているので、コンテナ内で実行している各種操作はホストにも影響します
なので、ビルド専用ホストならそこまで問題ないと思いますが、外部公開しているようなホストでは取り扱い注意!!
サンプルとして以下のようにDockerをインスコするDockerfileを使用します
ホストのdocker.sockを使用するため、docker deamonは起動しない(クライアントのみ使用)
FROM ubuntu:latest
RUN apt-get update \
&& apt-get -y upgrade \
&& apt-get -y install docker.io
# build dockerfile
> docker build -t mydind ./
# run docker container
> docker run -v /var/run/docker.sock:/var/run/docker.sock -it mydind /bin/bash
コンテナ内でdockerコマンドを実行してみるとホストマシンのリソースを確認することができますし、操作もできます
root@xxxx> docker image ls
root@xxxx> docker container ls
docker-composeで使う時
docker-composeでは/var/run/docker.sock
のパス解決ができないため、以下の環境変数を追加する必要があります
# 一時利用
> $Env:COMPOSE_CONVERT_WINDOWS_PATHS=1
docker in docker
コンテナ起動時に--privileged
が必要になります
特権モードで実行するため、取り扱いご注意
> docker run --privileged -d docker:dind
前述のdocker.sockのようにホストが管理しているDockerリソースは見えませんし、操作することもできません
> docker info
> docker images