今日は練習。
題材は自作の書籍管理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 のイメージをもとにして作っても、同じ現象に遭遇した。