2020/03/15

Docker再び (2)

時代はdockerだ!
などと私が言い出したときは、仕事として必然的に覚えないといけなくなったと思ってもらって構わない。

hiro99ma blog: Docker再び (1)
https://hiro99ma.blogspot.com/2019/05/docker-1.html

当然ながら、前回の記憶は無い。。。


今回は、dockerだけではなく、docker-composeも覚えたい。

どうやら、dockerの1 imageの中であれこれ立ち上げるのではなく、1 image - 1 appli、みたいな使い方をするそうだ。
それが主流なのかは知らんが、モジュールは疎結合が望ましいのと同じようなものだろうから、理解はできる。
複数のimageを立ち上げたりするのに、docker-composeがよいそうだ。

 

前回の復習。

imageはdocker imageのことで、classとinstanceの関係でいえばclassに当たるもの。
containerは、instanceに当たるもの。
volumeは、ファイルを残しておく領域のようなもの。

"Dockerfile"というものを書いて`docker build`するとimageを作ることができる。

こんなところか。

 

では、今日はこちらを見ながら学習する。

docker と docker-compose の初歩 - Qiita
https://qiita.com/hiyuzawa/items/81490020568417d85e86

うちはメイン環境がWindowsなのだが、dockerはVirtualBox上のUbuntu18.04で動かす。
画面がほしいからVirtualBoxでやってるけど、WSL2でdocker対応するような記事もあるので、しばしこれでやろう。

$ docker version
Client:
  Version:           19.03.6
  API version:       1.40
  Go version:        go1.12.17
  Git commit:        369ce74a3c
  Built:             Fri Feb 28 23:45:43 2020
  OS/Arch:           linux/amd64
  Experimental:      false

Server:
  Engine:
  Version:          19.03.6
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       369ce74a3c
  Built:            Wed Feb 19 01:06:16 2020
  OS/Arch:          linux/amd64
  Experimental:     false
  containerd:
  Version:          1.3.3-0ubuntu1~18.04.1
  GitCommit:       
  runc:
  Version:          spec: 1.0.1-dev
  GitCommit:       
  docker-init:
  Version:          0.18.0
  GitCommit:      


Dockerfileを書くのも良いが、Docker Hubというところにあるimage集(repository、と呼ぶのかな)を使うという手段もあるそうだ。
そして、Docker Hubから持ってきたimageをカスタマイズして使うこともできるそうだ。

記事では、CentOSのimageを使っている。
私であればUbuntuなどのdebian系がよいのかもしれない。
そういえば、前回はDockerfileを書いたが、あれの"FROM"がDocker Hubのrepository名なのだろう。

例えば、こちらはbusyboxだ。

https://hub.docker.com/_/busybox

bashが必須とかでなければ、サイズが小さくてよいかもしれん。

まあ、今回は無難にUbuntu18.04を使おう。

https://hub.docker.com/_/ubuntu

tagsを見ると、バージョンを指定した取得の仕方が出てくるので、それをまねすれば良かろう。

 

記事では、Dockerfileは書かず、`docker run`でattachしたあと、attachしてコンソールからインストールや自動起動の設定を行い、`docker commit`してカスタマイズimageを残している。
Dockerfileを使えば自動化できるのだろうか?

イメージの構築 — Docker-docs-ja 1.9.0b ドキュメント
http://docs.docker.jp/engine/userguide/dockerimages.html

なるほど、`docker commit`は手動で変更する場合、`docker build`はDockerfileで変更する場合ということか。

うーん、dockerのドキュメントは丁寧だな。
これを読んでいく方が正しい気がするのだけど、あとで考えよう。

 

題材が思いつかないので、Ubuntu18.04をベースに、python3をインストールして、このサンプルが動くようにしてみよう。

Compose を始めましょう — Docker-docs-ja 17.06.Beta ドキュメント
http://docs.docker.jp/compose/gettingstarted.html

このサンプルがpython3で動くのかどうかわからんのだが、まあいい。
まずは、手動で確認。

$ docker run -it ubuntu:18.04
root@55463b0cbeb1:/# python3
bash: python3: command not found
root@55463b0cbeb1:/# apt update && apt install python3 -y
...
root@55463b0cbeb1:/# python3-pip
bash: python3-pip: command not found
root@55463b0cbeb1:/# apt install python3-pip -y
...

python3はそうでもないが、python3-pipはいろいろダウンロードしているな。
ともかく、python3とpython3-pipをインストールすればよさそうだ。

Dockerfile

01: FROM ubuntu:18.04
02: ADD . /code
03: WORKDIR /code
04: RUN apt update && apt install python3 python3-pip -y
05: RUN pip3 install -r requirements.txt
06: RUN python3 app.py
  

requirements.txt、app.py、docker-compose.ymlはサンプルと同じ。

では、docker rmでコンテナを削除して、やり直し。

$ docker build -t web3 .

ビルドすると、ずらずらメッセージが表示され、最後は

Step 6/6 : RUN python3 app.py
  ---> Running in 725c62862d51
  * Serving Flask app "app" (lazy loading)
  * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
  * Debug mode: on
  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
  * Restarting with stat
  * Debugger is active!
  * Debugger PIN: 297-571-982

になった。
あれ、実際に立ち上がってしまったのか?
docker psで見ると、立ち上がっているようだ。

 

とりあえずCtrl+Cで止めて、docker composeの方でやってみよう。

$ docker-compose up

aptで取得するところから始まった。
さっき動いていたようだから、ここは省略してくれるとうれしいのだがなぁ。
もしかしたら、docker-composeでの初回だからやっているのかもしれん。

・・・ダメだ。
ダメというか、ホスト側で5000番ポートが使われていない。

$ docker exec -it 1ce5c59baf33 /bin/bash
root@1ce5c59baf33:/code# ps
  PID TTY          TIME CMD
   11 pts/0    00:00:00 bash
   21 pts/0    00:00:00 ps
root@1ce5c59baf33:/code# netstat
bash: netstat: command not found
root@1ce5c59baf33:/code# ps aux
USER       PID %CPU %MEM    VSZ   RSS TTY      STAT START   TIME COMMAND
root         1  0.0  0.0   4628   764 ?        Ss   06:03   0:00 /bin/sh -c python3 app.py
root         6  0.0  0.8  79316 26484 ?        S    06:03   0:00 python3 app.py
root         8  1.3  0.8 161344 26716 ?        Sl   06:03   1:42 /usr/bin/python3 /code/app.py
root        11  5.0  0.1  18508  3404 pts/0    Ss   08:12   0:00 /bin/bash
root        23  0.0  0.0  34404  2816 pts/0    R+   08:12   0:00 ps aux

最近はnetstatは使わないという記事を見かけたが、まあ許しておくれ。
他のコマンドを知らんのだ。使えなかったけど。

root@1ce5c59baf33:/code# netstat -na
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State     
tcp        0      0 0.0.0.0:5000            0.0.0.0:*               LISTEN    
tcp        0      0 172.17.0.2:50742        91.189.88.31:80         TIME_WAIT 
Active UNIX domain sockets (servers and established)
Proto RefCnt Flags       Type       State         I-Node   Path

net-toolsをインストールしてnetstatしてみたが、こっちは動いている。

 

ああ! サンプルDockerfileの最後の行はCMDじゃないか!!
最後はbuild successみたいなログで終わるはずなのだよ。

01: FROM ubuntu:18.04
02: ADD . /code
03: WORKDIR /code
04: RUN apt update && apt install python3 python3-pip -y
05: RUN pip3 install -r requirements.txt
06: CMD python3 app.py
  

$ docker rmi `docker images -qa`
$ docker build -t web3
......

Successfully built acb54c64c632
Successfully tagged web3:latest

ほらね。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
web3                latest              acb54c64c632        About a minute ago   481MB
ubuntu              18.04               72300a873c2c        3 weeks ago          64.2MB

docker-compose.ymlの"web"を"web3"に変更した。

$ docker-compose up
....

redis_1  | 1:M 15 Mar 2020 08:57:43.217 * DB loaded from disk: 0.010 seconds
redis_1  | 1:M 15 Mar 2020 08:57:43.217 * Ready to accept connections
web3_1   |  * Serving Flask app "app" (lazy loading)
web3_1   |  * Environment: production
web3_1   |    WARNING: This is a development server. Do not use it in a production deployment.
web3_1   |    Use a production WSGI server instead.
web3_1   |  * Debug mode: on
web3_1   |  * Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)
web3_1   |  * Restarting with stat
web3_1   |  * Debugger is active!
web3_1   |  * Debugger PIN: 622-200-617

前回は赤色のメッセージだったのだが、今回は何色っていえばいいのか分からんが、ブラウンっぽい色で終わった。
ホスト側でnetstatすると5000番が見えているし、ブラウザでたたいてもサンプル通りになった。

 

よかった・・・。
しかし、中途半端な状態であってもdocker側(クライアント側?)は動いているのだな。

0 件のコメント:

コメントを投稿

コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。