Docker outside of Dockerの/var/run/docker.sockの権限
Docker outside of Docker(DooD)
普段dockerを使う時はホスト側からコマンドでコンテナを起動して、終わったらコンテナを削除するという使い方をしている。
けれども、開発したアプリケーションをdockerコンテナで動作させて、そのコンテナから別のコンテナを起動する必要があったので、Docker outside of Docker(Dood)を利用した。
その時にdockerコンテナをrootで起動するとホスト側にファイルを書いたりするとroot権限でファイルが書き込まれて面倒なので、コンテナをroot以外のユーザーで起動するようにした。
そうするとDooDで利用する/var/run/docker.sockの書き込み権限がなくてコンテナが起動できずに少し焦ったので、備忘録として記録しておく。
ホストにファイルを書いたときのファイルの所有者
最初に以下のようなコマンドでコンテナを起動して、コンテナ内からホスト側にファイルを書き込むと当然root:rootでファイルが書かれる。
ログなら困らないかもしれないがデータファイルなどの場合、rootでファイルが出来ると面倒なので、コンテナをユーザー、グループを指定して起動する。
- ユーザー、グループ指定なし(ホストに書かれるファイルはrootが所有者)
docker run -it --rm \ --mount type=bind,source=/var/log/app,target=/var/log/app \ app-container
- ユーザー、グループ指定あり(ホストに書かれるファイルはapp-userが所有者)
docker run -it --rm \ --user app-user:app-user \ --mount type=bind,source=/var/log/app,target=/var/log/app \ app-container
DooDでコンテナを起動する
DooDでdockerを起動してコンテナ内からホスト側のdockerコマンドを利用する場合、/var/run/docker.sockに対する書き込み権限がコンテナ内のユーザーに必要となる。
単にdocker -userでユーザー、グループを指定して起動するとコンテナ内からホスト側のdockerコマンドが利用できなくなる。
- ユーザー、グループ指定なし(ホストに書かれるファイルはrootが所有者)
- コンテナ内からホスト側のdockerコマンドが利用できる
docker run -it --rm \ --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ app-container
- ユーザー、グループ指定あり(ホストに書かれるファイルはapp-userが所有者)
- コンテナ内からホスト側のdockerコマンドが利用できない(/var/run/docker.sockの書き込み権限がない)
docker run -it --rm \ --user app-user:app-user \ --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ app-container
DooDでユーザー名とグループ名を指定してもコンテナ内からホストのdockerコマンドを利用できるようにする
方法はいくつかある。
1. chmod 666 /var/run/docker.sock で全てのユーザーに対して書き込み権限を与える。
1. chwon app-user:docker /var/run/docker.sock でコンテナを起動するユーザーに対して書き込み権限を与える。
1. コンテナ起動時に app-userのuser id, dockerのgroup idを指定して起動する。
今の所これが一番良さそう。
docker run -it --rm \ --user $(id -u):$(getent group docker | cut -d: -f3) \ --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ docker:latest
DooDのテスト
- 権限がなくて失敗する
docker run -it --rm \ --user $(id -u):$(id -g) \ --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ docker:latest docker run hello-world
- 書き込み権限があるので成功する
docker run -it --rm \ --user $(id -u):$(getent group docker | cut -d: -f3)\ --mount type=bind,source=/var/run/docker.sock,target=/var/run/docker.sock \ docker:latest docker run hello-world