ローカルのDocker EngineであればDockerのコントロール・ソケットdocker.sock
をbindマウントするだけなので、下記のようにわりとシンプルなコマンドになります。
docker run -v /var/run/docker.sock:/var/run/docker.sock \
-it docker docker ps
しかし、この方法だとリモートのDocker Machineにあるコンテナでは期待通りに動作してくれません。それではどうするかというと、Docker Machineとやり取りするための環境(pemファイルも含める)をコンテナに渡す必要があります。
例えば下記の手順をふむと、dockercontrol
という名前のコンテナを作ってそのコンテナ上の/docker
というボリュームにその環境を保存することができます。
# 環境を設定します
$ eval $(docker-machine env host1)
# 環境を保存するためのコンテナを作ります
$ tar -C $DOCKER_CERT_PATH -cf- ca.pem cert.pem key.pem |
docker run --name dockercontrol -i -v /docker docker \
sh -c "tar -C /docker -xf-
echo export DOCKER_HOST=$DOCKER_HOST >>/docker/env
echo export DOCKER_TLS_VERIFY=1 >>/docker/env
echo export DOCKER_CERT_PATH=/docker >>/docker/env"
ちなみにこのdockercontrol
はdocker ps
を叩いてもでてきませんが、/docker
というボリュームを抱えたままExited(0)
で眠っています。これで/docker
の準備はできたので、次はこのボリュームをマウントしてコンテナを起動します。
# コンテナを起動します
$ docker run --rm --volumes-from dockercontrol -it docker
# 環境を読み込みます
/ # source /docker/env
# Dockerコマンドを使ってみます
/ # docker ps
これで何が嬉しいかというと、Docker Swarm上にイベントドリブンでオートスケールするシステムをフル・コンテナで実装できることです。
この便利なティップスはJérôme Petazzoniさんのブログ・ポストの受け売りなのですが、内容がとても勉強になるので是非彼のブログにも目を通してみてください。また、彼のポストがCC BY-NC-SA 4.0ライセンスで書かれているのでこのポストも同じくCC BY-NC-SA 4.0ライセンスとなります。
それと、彼のブログでも紹介されてるのですが、彼のGithubアカウントにはこのアイデアをシェルスクリプトにしたものがあります。