虚無ありき

うるせーーーしらねーーー

一般ユーザでの 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