Help us understand the problem. What is going on with this article?

DockerにRootlessモードが入ったぞ!という話

概要

DockerのデーモンをLinux上で実行するためには、通常はroot権限を渡す必要がありましたが、Docker Meetup TokyoのオーガナイザーをやっているNTTの須田さんによるこちらのコミットによって、Dockerをroot権限なしに実行できるようになりました。

より詳しくは、Dockerのエンジニアリングブログを御覧ください。

試してみた

Rootless dockerのインストール

  • 試した環境
    • Ubuntu 18.04
$ curl -sSL https://get.docker.com/rootless | sh
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 54.0M  100 54.0M    0     0  9624k      0  0:00:05  0:00:05 --:--:-- 11.9M
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 13.3M  100 13.3M    0     0  5584k      0  0:00:02  0:00:02 --:--:-- 5582k
# systemd not detected, dockerd daemon needs to be started manually

/home/inductor/bin/dockerd-rootless.sh --experimental --storage-driver vfs

# Docker binaries are installed in /home/inductor/bin
# WARN: dockerd is not in your current PATH or pointing to /home/inductor/bin/dockerd
# Make sure the following environment variables are set (or add them to ~/.bashrc):

export XDG_RUNTIME_DIR=/tmp/docker-1000
export PATH=/home/inductor/bin:$PATH
export PATH=$PATH:/sbin
export DOCKER_HOST=unix:///tmp/docker-1000/docker.sock

出てきた環境変数を .bashrc などに登録しておきます。

Docker daemonの起動

Mobyのドキュメントの通りに起動してみる。

$ dockerd-rootless.sh --experimental
+ [ -w /tmp/docker-1000 ]
+ [ -w /home/inductor ]
...
...中略
...
INFO[2019-03-02T09:43:30.951521529+09:00] Daemon has completed initialization
INFO[2019-03-02T09:43:30.980047655+09:00] API listen on /tmp/docker-1000/docker.sock

ダエモンさんのInitializeが終わって、APIがListenし始めたよ!と表示されました。
Docker daemonが起動してsocketのlistenが行われているのがわかりますね!

ここからDockerを実際に動かすためには、CLIを使って起動されたDaemonとおしゃべりする必要があります。
また、何らかのシステム管理用のDaemon(systemdとか)にちゃんと設定は入れておいたほうがよさそうです(デフォだと上手く入ってくれませんでした)。

Docker CLIで以下のようにSocketを明示的に指定してあげることで、nginxのイメージをPullしてRunすることができます。

$ docker -H unix://$XDG_RUNTIME_DIR/docker.sock run -d -p 8080:80 nginx

すごい。本当にユーザー領域で動いた!

どうやって動いてるのか

基本的には、RootlessKitというOSSがベースとなっています。
GitHubの概要には

made for mainly running Docker and Kubernetes as an unprivileged user

と書かれていて、要するに、KubernetesやDockerのDaemonを特権ユーザーでなくとも動かせるようにするためのツールです。
実はこのOSSが存在するrootless-containersのOrganizationの中にはusernetesというプロジェクトもあって、こちらは、DockerではなくKuberntesをユーザー領域で動かそうというプロジェクトです。こちらも、Docker rootless modeと同じくNTTの須田さんが主に動いて開発しています。

一通り動かせるのがわかったので僕は満足したので、誰かもうちょい詳しいエントリーをお願いします(他力本願)

inductor
8割くらい正しい情報を噛み砕いて3秒で出すのが得意
https://inductor.me
infra-workshop
インフラ技術を勉強したい人たちのためのオンライン勉強会です
https://wp.infra-workshop.tech/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away