Docker
docker-swarm

リモートのコンテナからDockerコマンドを使えるようにする

More than 3 years have passed since last update.

ローカルの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"

ちなみにこのdockercontroldocker 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アカウントにはこのアイデアをシェルスクリプトにしたものがあります。