一般ユーザでの Docker 横付け (Sibling)
tl;dr
- 一般ユーザで Docker 横付け (Sibling) をする
- 意外と詰まった
- group を Host の docker group にする
Environment
- Ubuntu: 16.04
- Docker: 18.09.1
- docker-compose: 1.23.1
$ lsb_release -a No LSB modules are available. Distributor ID: Ubuntu Description: Ubuntu 16.04.5 LTS Release: 16.04 Codename: xenial $ docker --version Docker version 18.09.1, build 4c52b90 $ which docker /usr/bin/docker $ docker-compose -v docker-compose version 1.23.1, build b02f1306
やってみる
まず、root user, root group で実行してみる。
$ docker run -it --rm \ -v /usr/bin/docker:/usr/bin/docker \ -v /var/lib/docker:/var/lib/docker \ -v /var/run/docker.sock:/var/run/docker.sock \ ubuntu:18.04 bash # id uid=0(root) gid=0(root) groups=0(root) # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 5fdc5e064a46 ubuntu:18.04 "bash" About a minute ago Up About a minute cranky_proskuriakova # docker run --rm hello-world Hello from Docker!
コンテナの中から Host の docker を触ることができ、実行もできる。
次に、一般 user, 一般 group で実行してみる。
$ id uid=1000(ubuntu) gid=1000(ubuntu) groups=1000(ubuntu),0(root),4(adm),24(cdrom),27(sudo),30(dip),46(plugdev),110(lxd),115(lpadmin),116(sambashare),999(docker) $ docker run -it --rm \ -v /usr/bin/docker:/usr/bin/docker \ -v /var/lib/docker:/var/lib/docker \ -v /var/run/docker.sock:/var/run/docker.sock \ -u 1000:1000 \ ubuntu:18.04 bash # id uid=1000 gid=1000 groups=1000 # docker ps Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: dial unix /var/run/docker.sock: connect: permission denied # docker run --rm hello-world docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
怒られる。
# cat /etc/group | grep docker # ls -l /var/run/docker.sock srw-rw---- 1 root 999 0 Jul 21 05:32 /var/run/docker.sock
コンテナ内には docker group が存在していないが、mount された docker.sock
の permission 的に、root user もしくは docker group に所属していなければならない。
次に、一般 user, Host Docker group で実行してみる。
$ cat /etc/group | grep docker docker:x:999:ubuntu $ docker run -it --rm \ -v /usr/bin/docker:/usr/bin/docker \ -v /var/lib/docker:/var/lib/docker \ -v /var/run/docker.sock:/var/run/docker.sock \ -u 1000:999 \ ubuntu:18.04 bash # id uid=1000 gid=999 groups=999 # docker ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES a9e458b9c54d ubuntu:18.04 "bash" 23 seconds ago Up 22 seconds clever_tu # docker run --rm hello-world Hello from Docker!
出来た。
最後に、コンテナ内に GID=999 以外の docker group を作成し、一般 user, 一般 group で実行してみる。
$ cat << EOS > Dockerfile > FROM ubuntu:18.04 > RUN groupadd -g 9999 docker > EOS $ docker build -t docker-test . $ docker run -it --rm \ -v /usr/bin/docker:/usr/bin/docker \ -v /var/lib/docker:/var/lib/docker \ -v /var/run/docker.sock:/var/run/docker.sock \ -u 1000:9999 \ docker-test bash I have no name!@9ade8817d235:/$ id uid=1000 gid=9999(docker) groups=9999(docker) I have no name!@9ade8817d235:/$ cat /etc/group | grep docker docker:x:9999: # docker ps Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/json: dial unix /var/run/docker.sock: connect: permission denied # docker run --rm hello-world docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.39/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
実行できない。
# cat /etc/group | grep docker docker:x:9999: # ls -l /var/run/docker.sock srw-rw---- 1 root 999 0 Jul 21 05:32 /var/run/docker.sock
mount された socket のパーミッションは Host のものが引き継がれるため、コンテナ内の docker group に所属していても実行することが出来ない。
結論として
一般ユーザでの Docker 横付け (Sibling) をしたい場合は、Host の docker group で実行する。
docker-compose でやりたい場合は、下記の通り。
version: "3" services: app: image: ubuntu:18.04 volumes: - /usr/bin/docker:/usr/bin/docker - /var/lib/docker:/var/lib/docker - /var/run/docker.sock:/var/run/docker.sock user: ${UID:-0}:999