Dockerを一般ユーザで使えるようにする

これまで、docker コマンドを sudo 付きで実行してきた。そうしないと、パーミッションがない、と怒られるからだけど、面倒なので一般ユーザで実行できないか調べてみた。

こたえ: ユーザを docker グループに追加すればいい

というわけで、つぎのようにした。

takatoh@apostrophe $ sudo usermod -a -G docker takatoh

これで sudo をつけずとも実行できるようになった(↓のように)。

takatoh@apostrophe $ docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
b                   latest              4e366dc7de8f        5 hours ago         451MB
bruschetta          1                   197d15517e40        5 hours ago         451MB
ubuntu              20.04               1d622ef86b13        2 weeks ago         73.9MB

Dockerfileを書いてDockerイメージを作る練習→うごいてくれない

今日は練習。

題材は自作の書籍管理webアプリ(GitHub)。これを Docker コンテナで動かすことを目指す。

あと、これまで CentOS を使ってきたけど、ふだんメインに使っているのが Ubuntu なのと、先月リリースされた 20.04 LTS が使える(Docker Hub にイメージがある)ようなので、これをベースにしてみる。

さて、一応やり方を覚えたとはいえ、いきなり Dockerfile をイチからかけるわけではないので、Ubuntu:20.04 のイメージからコンテナを起動して、必要なソフトのインストール、設定ファイルのコピーなど手作業でやりながら Dockerfile を書き起こす、というやり方をした。

書き上がった Dockerfile はこう:

FROM ubuntu:20.04
RUN apt update
RUN apt install -y python3 python3-pip git
RUN pip3 install uwsgi
RUN git clone https://github.com/takatoh/Bruschetta.git /usr/bruschetta
RUN cd /usr/bruschetta && pip3 install -r requirements.txt
RUN cd /usr/bruschetta && python3 manage.py init_db
COPY files/bruschetta.ini /usr/bruschetta/
CMD [ "/usr/local/bin/uwsgi", "/usr/bruschetta/bruschetta.ini" ]

ファイル構成:

takatoh@apostrophe $ tree .
.
├── Dockerfile
└── files
      └── bruschetta.ini
1 directory, 2 files

web アプリは Python 製なので、uWSGI で動かす。./files/bruschetta.ini はその設定ファイル。

[uwsgi]
http = :5000
chdir = /usr/bruschetta
wsgi-file = /usr/bruschetta/manage.py
callable = app
master = true
pidfile = /usr/bruschetta/bruschetta.pid
daemonize = /usr/bruschetta/bruschetta.log

これで準備は OK。Docker イメージをビルドする。

takatoh@apostrophe $ sudo docker build -t bruschetta:1 .

(略)

Successfully built 197d15517e40
Successfully tagged bruschetta:1

うまくいったようだ。

takatoh@apostrophe $ sudo docker image ls
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
bruschetta          1                   197d15517e40        3 minutes ago       451MB
ubuntu              20.04               1d622ef86b13        2 weeks ago         73.9MB

では、いま作ったイメージ bruschetta:1 を起動。

takatoh@apostrophe $ sudo docker run -it -d -p 8080:5000 --name bruschetta-1 bruschetta:1

これで、ブラウザで localhost:8080 にアクセスすれば web アプリに繋がる……はずなんだけど、つながらない。

コンテナの状況を見てみると:

takatoh@apostrophe $ sudo docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS               NAMES
1dc9e16f813a        bruschetta:1        "/usr/local/bin/uwsg…"   5 seconds ago       Exited (0) 4 seconds ago                       bruschetta-1

STATUS が Exited になっている。どういうこと?

何が起きているのかを探るために、やり方をググるとつぎのページを見つけた。

このページに従ってまずはコンテナのログを見てみる。

takatoh@apostrophe $ sudo docker logs bruschetta-1
[uWSGI] getting INI configuration from /usr/bruschetta/bruschetta.ini

うーん、ちゃんと uWSGI が起動した(ということはつまり web アプリが起動した)ように見える。

じゃあつぎ、コンテナからイメージを作って、そのイメージからコンテナを起動し、中に入って様子を見る。コンテナからイメージを作るのは docker commit コマンド。

takatoh@apostrophe $ sudo docker commit bruschetta-1 b

一時的な用途のイメージなので b というテキトーな名前をつけている。これをつぎのように起動する。

takatoh@apostrophe $ sudo docker run --rm -it -p 8080:5000 b bash

これでコンテナの中には入れたので web アプリを起動してみる。

root@2ab03bb28bc5:/# /usr/local/bin/uwsgi /usr/bruschetta/bruschetta.ini
[uWSGI] getting INI configuration from /usr/bruschetta/bruschetta.ini

この結果どうなったかというと……期待通りに web アプリが動いた!

えぇ!?どういうこと?

[追記]

CentOS 7 のイメージをもとにして作っても、同じ現象に遭遇した。