dockerコマンドをsudoの付与無しに実行できるようにする

OS: Ubuntu Server 18.04.1 LTS
docker: 18.09.0

dockerコマンドを打ち込む度にsudoを付加するのはしちめんどうな手続きであるけれどもrootユーザにスイッチして操作をするのも甚だしく物騒であるから、何らかの細工を施して一般ユーザでsudo無しにdockerコマンドを実行できれば大変楽ちんである。

けれども安全性を鑑みると無闇にdockerコマンドがsudo無しで実施できるようになるのは大きな懸念材料となる模様であるから、せめて信頼のおけるユーザだけに許すなど細やかな配慮が求められる情勢である。しちめんどうであるからといって横着してはいけないのである。

そう云う事情をすべて飲み込んだうえで作業を進めてゆく。まずdockerコマンドをsudo無しで実施するとエラーメッセージが現れて直ちに処理が終いとなる。

$ docker images
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/images/json: dial unix /var/run/docker.sock: connect: permission denied

メッセージから察するに /var/run/docker.sock なるUNIXドメインソケットに対するアクセスが認められていない模様である。ファイルのパーミッションは果たしてどういう具合なのかを確認するとこうである。

$ ls -l /var/run/docker.sock
srw-rw---- 1 root docker 0 Dec 30 10:05 /var/run/docker.sock

docker.sockに対して読み書きが許されるのはrootユーザとdockerグループに所属する者という風に認められる。rootユーザにスイッチする心積もりがなければdockerグループに所属すればよいのである。説明書には先ずdockerグループを作成なさいとあるけれどもdocker-ceインストール時に併せて作成された風情であった。

$ getent group docker
docker:x:999:

したがって作業はgpasswdでもってdockerグループへ所属させるばかりである。

$ id guro
uid=1000(guro) gid=1000(guro) groups=1000(guro),(snip)
$ sudo gpasswd -a guro docker
Adding user guro to group docker
$ id guro
uid=1000(guro) gid=1000(guro) groups=1000(guro),(snip),999(docker)

dockerグループへ所属したら一度ログアウトして再ログインしてからdockerコマンドを実行するとこういう具合である。

$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 4ab4c602aa5e 3 months ago 1.84kB

sudoを付加することなくdockerコマンドが実行できるようになった。様々な事情によってdockerグループを脱退するのであればgpasswdの-dオプションに出動してもらってログアウト、再ログインで終いである。

$ sudo gpasswd -d guro docker
Removing user guro from group docker

参考:
Docker daemon attack surface
Manage Docker as a non-root user

Ubuntu Server 18.04にDockerをインストールする

OS: Ubuntu Server 18.04.1 LTS

一口にDockerと云ってもCEとEEと云う2つのエディションが存在し、CEは無償で利用できるCommunity Editionであり、EEがEnterprise Editionという有償のソフトウェアのようである。一先ずapt searchで現れたdockerパッケージをインストールすればよかろうと考え、勢い勇んで導入したけれどもコンテナ技術とはちっとも因縁のないwmdockerコマンドが使用できるようになるだけで今の所、出番はなさそうな情勢である。

$ apt search docker
(snip)
docker/bionic 1.5-1build1 amd64
  System tray for KDE3/GNOME2 docklet applications

コンテナ技術に係るほうのDockerを導入する手立ては幾つか用意されている模様で、一つはDockerのリポジトリを追加するものである。或いはDockerパッケージをインストールするやり口もある。今般はDockerのリポジトリを追加してインストールする舵取りをする。公式サイトの説明書にインストールの手引きが記してあるから此れと照らし合わせながら作業を進めてゆく。

$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
OK

公開鍵を追加して其のフィンガープリントを確認する。9DC858229FC7DD38854AE2D88D81803C0EBFCD88にピタリと一致するものが追加されているのでなんとなくdockerのリポジトリサーバへ接続するような豫覚を感じ取れる。

$ apt-key list 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
pub   rsa4096 2017-02-22 [SCEA]
      9DC8 5822 9FC7 DD38 854A  E2D8 8D81 803C 0EBF CD88
uid           [ unknown] Docker Release (CE deb) 
sub   rsa4096 2017-02-22 [S]

Dockerの公式リポジトリを追加するにあたってはCPUのアーキテクチャに合わせて記載する。公式の説明書にはアーキテクチャ毎に記載内容が用意されているから大変行き届いている。アーキテクチャはuname -mあたりのコマンドから推し量って調べをつけておけば宜しいと思う。

$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"

此の操作によって/etc/apt/sources.listに次の二行が挿入される。

$ cat /etc/apt/sources.list
deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable
# deb-src [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable

新たなリポジトリを追加したから此処で改めてapt updateを実行してパッケージインデックスファイルを同期しておく。

$ sudo apt update
All packages are up to date.

然り而して愈々Dockerのインストールが可能になる。Dockerのパッケージ名はdocker-ceであると云う。

$ sudo apt install docker-ce

Docker CEが正しくインストールされたか検証するためにhello-worldイメージを起動する。This message shows that your installation appears to be working correctly.との掲示から申し分なく導入された模様である。

$ sudo docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Status: Downloaded newer image for hello-world:latest

Hello from Docker!
This message shows that your installation appears to be working correctly.
(snip)

もう幾らか試してみたい向きにはdocker run -it ubuntu bashで以って簡素なUbuntuを導入して様々な動作を検証することができるようである。

取得したイメージを確認する場合はこういう具合である。

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB
ubuntu              latest              93fd78260bd1        19 hours ago        86.2MB

1.84kBもの容量を占拠するhello-worldイメージはもうたくさんだという情勢になればrmiコマンドによって削除することができるというから此れを試みたところコンテナID 0a105932ce9aのコンテナがhello-worldイメージを未だ参照している事で削除の妨げとなっている。

$ sudo docker rmi hello-world
Error response from daemon: conflict: unable to remove repository reference "hello-world" (must force) - container 0a105932ce9a is using its referenced image 4ab4c602aa5e

予めrmコマンドで以って参照しているコンテナを削除して皆がhello-worldのイメージに見向きもしない状況へ押し込んでやると良いようである。

$ sudo docker rm 0a105932ce9a
0a105932ce9a

改めてイメージの削除を試みると無事、電子の藻屑と化した。

$ sudo docker rmi 4ab4c602aa5e
Untagged: hello-world:latest
Untagged: hello-world@sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
Deleted: sha256:4ab4c602aa5eed5528a6620ff18a1dc4faef0e1ab3a5eddeddb410714478c67f
Deleted: sha256:428c97da766c4c13b19088a471de6b622b038f3ae8efa10ec5a37d6d31a2df0b

$ sudo docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE

Dockerの与るファイルを概ね削除してしまうならこういう手続きで良さそうである。設定ファイルは自動で削除されないから手動での作業を余儀なくされるようである。

$ sudo apt purge docker-ce
$ sudo add-apt-repository --remove "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable"
$ sudo apt-key del 9DC858229FC7DD38854AE2D88D81803C0EBFCD88
$ sudo rm -rfv /var/lib/docker/

参考:
Get Docker CE for Ubuntu