こんにちは、マダラです。。
今回はdocker outside of docker の設定を行ったので、それを共有します!
そして、さらに、DooDの設定に成功したものの、アプリケーションからdockerコマンドを叩くにはもうひとクセあったのでそれの解消法を紹介します
誰かの参考になれば幸いです
それでは早速参りましょう
Docker outside of Dockerとは
まず、Docker outside of Docker とはなんぞやというところですが、私のブログ記事ではめんどくさいので細かくは紹介しません。
より詳しく書いている人たちがネット上にくさるほどと転がっているんでそちらをご参考ください。
まぁ一言でいうと、dockerコンテナ内部からdockerコマンドを操作できます。
似た技術にdocker in docker というのもありますが、それぞれ微妙に異なります
ホスト側のdockerコマンドを使うのか、dockerコンテナの中に独立したdocker をさらに構築するのかみたいな感じです
とにかくdocker コンテナからdockerコマンドを実行したい人々の参考になる記事です
docker outside of doceker の設定方法
まずはdocker コマンドを実行したコンテナの中にdocker-clientがいりますね
以下で入ります
curl -fsSL https://get.docker.com/builds/Linux/x86_64/docker-1.12.3.tgz \ | tar -xzC /usr/local/bin --strip=1 docker/docker
まずは簡単に以下で入れてもいいですし、DockerFileやDocker-composeで設定するなりはご自由にしてください
docker exec app名 bash -c "コマンド"
curlが入ってないイメージの場合は、curlもとってこないといけませんね
RUN apt-get update && apt-get install -y \
curl \
続いてdocker-compose の設定の一部ですがこんな感じです
php:
build: ./php
ports:
- '8088:80'
privileged: true
volumes:
- ./html:/var/www/html
- /var/run/docker.sock:/var/run/docker.sock
depends_on:
- mysql
コピペしたらタグがなくなったけどそのままでいいや、、、
めちゃくちゃ重要なのは- /var/run/docker.sock:/var/run/docker.sock
の部分です
ここで、ホストのdocker.sockを利用するのが、doodの要です
Docker Hostが動いているコンピュータ上のdockerコマンドは/var/run/docker.sockをつかって通信しているようなので、-v /var/run/docker.sock:/var/run/docker.sockを共有してやると、コンテナ内からHostと簡単に通信できるというわけでござる
あと地味にprivileged: true
も必要だという説があります。権限周りでコケるそうな
それでもだめな場合は、DocekrFileでdockerコンテナを実行したいコンテナの権限にrootをつけておきましょう
# デフォルトではPermission Errorが起こる
USER root
ざっくりまとめると、volumesでdocker.sockをマウント!
コンテナにdocker-clientをインストール!
なんか権限周りで起きたら、権限つけてやればdood完成です!!!!!!!
システムからdockerコマンドが実行できない、、、、、、、
doodがいざできるようになったところで、今度はアプリケーションからdockerコマンドを実行することができませんでした。。。とほほ
本来は利用されるコンテナでapiを公開して、使うのがあるべき公正なのはわかっております。
ただ内輪で使うアプリケーションですし、いろいろ初期の構成から変えるのもめんどくさかった、、
とにかく、phpアプリケーションからdockerコマンドを叩き、別コンテナの処理を実行させたい!!他のやり方はたくさんあるが、セキュリティ度外視で一番ラクな方法を突き進みたい!
そう思って調べ続けました笑
原因としては、rootユーザーではdoodでdockerコマンドを実行できるものの、アプリケーションではApacheのデフォルトユーザーである「www-data」ユーザーでdockerコマンドを実行しようとしている事がわかりました。
じゃあ、ユーザーを変えるなり、www-dataにdockerコマンドの権限を与えてやればいいですね!
しかし、docker公式のapacheを撮ってきていたため、そのユーザーをwww-dataから他のユーザーに変更するのは非常にめんどくさいという情報を耳にしました
めんどくさいことはやりたくない、、!
ということで、www-dataユーザーさんになんとかdockerコマンドを実行して貰う方法で検討します。。。
ホスト側にwww-dataユーザーを作成して権限を与える
やり方としては、ホスト側にもwww-dataユーザーを作って権限を与えると、ホスト上に乗っかているdockerコンテナの方でも権限がつくようです。
ホストのdocker.sockを使っているのでその影響ですかね。
全然詳しくないので、そのあたりは別の誰かに聞いていただきたいです笑
ただこの方法、ホスト側での設定が必要なんですね、、、
私のアプリケーションは内輪向け利用とは言いましたが、私自身の環境で実行するわけではないですし、他人のサーバの環境を汚していくのは嫌でした。
そういうことでこちらの方法も最終手段としては取っておくものの他の方法を模索しました。
www-dataユーザーにsudo実行してもらう
最終的な解決策としては、apacheのwww-dataユーザさんにsudoでdockerコマンドを実行して貰う方法です。」
この設定ならホスト側にwww-dataユーザーを付ける必要もなく、sudoでアプリケーションからdockerコマンドを実行することができるようになりました
設定方法としては、sudoをコンテナで利用できるようにしておきましょう
RUN apt-get update \
&& apt-get install -y sudo
続いて、www-dataにsudoできるように設定してあげます
echo "root:root" | chpasswd && \
echo "www-data:www-data" | chpasswd && \
echo "%www-data ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/www-data && \
chmod 0440 /etc/sudoers.d/www-data
これでオッケーです、DockerFileないし、docker-composeなど、立ち上げ時に適当に叩いてください
ざっくりまとめますと、
sudoをコンテナに入れる!www-dataにsudo実行できる設定を行う!
ということになります。
これでアプリケーションから、doodを利用して、dockerコンテナ内部から別のdockerコンテナを操作することが可能になりました。めでたしめでたし、、、
まとめ
セキュリティの観点など、色々問題のあるやり方なのは重々承知ですが、工数との兼ね合いや個人でdockerで遊んでみるなど、事情は人それぞれでしょう!
もし同じ状況で悩んでいる人の助けになれば幸いです!
最後に、私が参考にした方々の記事を残しておきます。。
よくわからなかったらこの人達を見て頑張ってください!!
ではでは