時代は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: falseServer:
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だ。
bashが必須とかでなければ、サイズが小さくてよいかもしれん。
まあ、今回は無難にUbuntu18.04を使おう。
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をインストールすればよさそうだ。
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 件のコメント:
コメントを投稿
コメントありがとうございます。
スパムかもしれない、と私が思ったら、
申し訳ないですが勝手に削除することもあります。
注: コメントを投稿できるのは、このブログのメンバーだけです。