(ヽ´ω`) < 助けてほしいマン

わからないことを助けてほしいマンが書くブログ

(ヽ´ω`) < Dockerで--cap-addオプションを試す

(ヽ´ω`) < さて、

docker runコマンドに--privilegedオプションを渡すことで、コンテナに上位権限を渡せることは確認できた。が、Linux Capabilitiesに準拠しているという公式ドキュメントの記述とは裏腹に、--privilegedオプションでは、全ての権限を渡してしまう。

新しいバージョンのDockerでは--cap-add, --cap-dropオプションで、付与するLinux Capabilitiesを指定できるとの事だったので、実際に確かめてみる。

(ヽ´ω`) < Ubuntuよ、お前もか

2014/10/04時点でのCentOS7の公式リポジトリからダウンロード可能なDockerのバージョンは以下の通り。

[root@localhost ~]# docker --version
Docker version 0.11.1-dev, build 02d20af/0.11.1

このバージョンでは、--cap-addオプションを渡すと以下の様なエラーが出力される。

[root@localhost ~]# docker run -i -t --rm --cap-add=SYS_TIME centos:centos6 /bin/bash
flag provided but not defined: --cap-add

要するにこのバージョンでは--cap-addは未実装ですよ、と。

それならUbuntu辺りですかねー、とUbuntuで試してみたところ。

test@test-virtual-machine:~$ sudo docker.io run -i -t --cap-add=SYS_TIME centos:centos6 /bin/bash
flag provided but not defined: --cap-add

(ヽ´ω`) < …

test@test-virtual-machine:~$ sudo docker.io --version
Docker version 1.0.1, build 990021a

と、まぁ1.0.1でも未だ実装されておらず。

(ヽ´ω`) < 1.2.0をaptでいれる

ということで、UbuntuリポジトリではなくDockerのリポジトリを使う。設定は下記URLを参考に

Getting Docker Installed on Ubuntu 12.04 LTS – Composite Code

$ wget -qO- https://get.docker.io/gpg | sudo apt-key add -
$ sudo sh -c "echo deb http://get.docker.io/ubuntu docker main > /etc/apt/sources.list.d/docker.list"
$ sudo apt-get update
$ sudo apt-get install lxc-docker

Docker公式サイトからGPGキーをダウンロード&追加、sources.listにDockerのリポジトリを追加して、apt-get updateからのapt-get install

パッケージ名がlxc-dockerとなっているので注意。

インストール後、バージョンを確認。

test@test-virtual-machine:~$ sudo docker --version
Docker version 1.2.0, build fa7b24f

(ヽ´ω`) < よしよし

(ヽ´ω`) < 今度こそうまくいくはず

これで--cap-addオプションを試してみる。これで上手く行かなかったら、しばらくDockerは触らないようにしよう。

test@test-virtual-machine:~$ sudo docker run -i -t --cap-add=SYS_TIME --rm centos:centos6 /bin/bash

## システム時間の変更はOK
bash-4.1# date -s "2000/01/01 00:00:00"
Sat Jan  1 00:00:00 GMT 2000
bash-4.1# date
Sat Jan  1 00:00:02 GMT 2000

## ルーティングテーブルの変更はNET_ADMINがないのでNG
bash-4.1# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
0.0.0.0         172.17.42.1     0.0.0.0         UG    0      0        0 eth0
172.17.0.0      0.0.0.0         255.255.0.0     U     0      0        0 eth0
bash-4.1# route add -net 192.168.0.0/24 gw 172.17.254.254 eth0
SIOCADDRT: Operation not permitted
bash-4.1#

(ヽ´ω`) < よしよし

(ヽ´ω`) < ここまで調べてなんだけど

実運用でDockerを使う機会はまだまだきそうにないし、検証環境なら問答無用で--privilegedオプション付与でいいんですよね…