Docker 1.10のUser Namespacesを試してみたので、手順を書いておこうと思います。
この機能を有効にすると、共有マシンでも安心して一般ユーザーにDockerを使ってもらうことができるようです。
設定
Step 0. (手近にDocker 1.10以降のマシンがある方はこのステップをスキップしてください。)僕はboot2dockerでMac OS X上のVirtualBoxでテストしているので、まずはテスト用のDocker Machineを作って、そのマシンにログインします。(例:test1):
docker-machine create --driver virtualbox test1
docker-machine ssh test1
Step 1. dockremap
というユーザーを作ります(*パスワードは任意)。
sudo adduser dockremap
Step 2. subuidとsubgidを準備します。
sudo sh -c 'echo dockremap:500000:65536 > /etc/subuid'
sudo sh -c 'echo dockremap:500000:65536 > /etc/subgid'
Step 3. /etc/init.d/docker
を開いて/usr/local/bin/docker daemon
の隣に--userns-remap=default
を付け足します。下記のような感じになります。
sudo vi /etc/init.d/docker
:
:
/usr/local/bin/docker daemon --userns-remap=default -D -g "$DOCKER_DIR" -H unix:// $DOCKER_HOST $EXTRA_ARGS >> "$DOCKER_LOGFILE" 2>&1 &
:
:
Step 4. Dockerをリスタートします。
sudo /etc/init.d/docker restart
設定がうまく行っていれば、ホスト上の/etc
をコンテナにマウントしてもオーナーがnobody nogroup
になっていてファイルを編集・削除することができません。
下記の参考例では、ホストの/etcをコンテナの/root/etcにマウントして試してみます。
参考例
Step 1. コンテナを作ります。
docker run --rm -v /etc:/root/etc -it ubuntu
Step 2. /root/etcのオーナーがnobody nogroupになっていることを確認します。
root@d5802c5e670a:/# ls -la /root/etc
total 180
drwxr-xr-x 11 nobody nogroup 1100 Mar 21 23:31 .
drwx------ 3 root root 4096 Mar 21 23:50 ..
lrwxrwxrwx 1 nobody nogroup 19 Mar 21 23:07 acpi -> /usr/local/etc/acpi
-rw-r--r-- 1 nobody nogroup 48 Mar 10 22:09 boot2docker
drwxr-xr-x 2 nobody nogroup 60 Mar 21 23:07 default
:
:
Step 3. 試しにtestというファイルを作ってみます(が作れません)。
root@d5802c5e670a:/# touch /root/etc/test
touch: cannot touch '/root/etc/test': Permission denied
Step 4. 試しにhostnameというファイルを削除してみます(が削除できません)。
root@d5802c5e670a:/# rm /root/etc/hostname
rm: cannot remove '/root/etc/hostname': Permission denied
こんな感じです。この機能のマイナスな点は、つまりVolumeが使えなくなるという意味でもあります。一長一短ではありますが、セキュリティの向上という点では飛躍的な進歩ですね。