今度は客先でコンテナ勉強会
今日すること
こんにちはふるてつです。
ただいま客先の勉強会にてDockerを勉強中で、まずは入門としてこちらのサイト「入門Docker」を勉強しております。
https://y-ohgi.com/introduction-docker/
今回は少なめですが、「プロダクションでの活用」 メニューの中から「デバッグ」ページをもくもくとしました。
「設計」と「セキュリティ」のところは読むだけで終わりましたので 今日は「デバッグ」です。
またいつものように勉強した内容を書きます。
1. コンテナのライフサイクル
ライフサイクルを意識することは重要だそうです。
コンテナの状態の確認方法をまずは勉強していきます。
1-1. 短命なコンテナ
docker run
でpythonで"hoge"と出力するコンテナを起動してみます。
"hoge"と表示しただけで終わる、これはたしかに短命ですな。
docker run python python -c "print('hoge')"
hoge
現在のホスト上の全てのコンテナを見ます。
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fc4be9b622af python "python -c print('ho…" 11 seconds ago Exited (0) 9 seconds ago elastic_hypatia
STATUSが "Exited (0) 9 seconds ago" となっています、もう終わってますね。
もう1回print('hoge')を実行してみます、そしてコンテナを確認します。
docker run python python -c "print('hoge')"
hoge
PS C:\Users\ts-tetsuji.furukawa> docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
20fa58fd83b0 python "python -c print('ho…" 5 seconds ago Exited (0) 3 seconds ago interesting_heyrovsky
fc4be9b622af python "python -c print('ho…" 5 minutes ago Exited (0) 5 minutes ago elastic_hypatia
今度は2つになりました。
実行される度に新しい環境 が立ち上がるようです。
以前立ち上げたコンテナを動かしたいときはdocker start -a [CONTAINER ID]
コマンドを実行すると良いそうです、なるほど。
docker start -a 20fa58fd83b0
hoge
1-2. 長命なコンテナ
Webサーバのように起動し続けるタイプのコンテナを見てみます。
docker run -P -d nginx
コンテナの状態を確認してみます。
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1a8b6df0862c nginx "nginx -g 'daemon of…" 53 seconds ago Up 52 seconds 0.0.0.0:32768->80/tcp cocky_cerf
20fa58fd83b0 python "python -c print('ho…" 20 minutes ago Exited (0) 10 minutes ago interesting_heyrovsky
fc4be9b622af python "python -c print('ho…" 26 minutes ago Exited (0) 26 minutes ago elastic_hypatia
STATUSが "Up 52 seconds" となっています、これはまだ動いてますね。
nginxをもう一つ起動します。
nginxが下記のように一つ増えました。
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
31035305c436 nginx "nginx -g 'daemon of…" 5 seconds ago Up 4 seconds 0.0.0.0:32769->80/tcp awesome_murdock
1a8b6df0862c nginx "nginx -g 'daemon of…" 16 minutes ago Up 16 minutes 0.0.0.0:32768->80/tcp cocky_cerf
20fa58fd83b0 python "python -c print('ho…" 36 minutes ago Exited (0) 26 minutes ago interesting_heyrovsky
fc4be9b622af python "python -c print('ho…" 41 minutes ago Exited (0) 41 minutes ago elastic_hypatia
では一旦これまでに起動したコンテナを削除します。
まずコンテナを停止します。
docker stop $(docker container ls -q)
次にコンテナを削除します。
docker rm $(docker container ls -aq)
そしてイメージを削除します。
docker rmi $(docker images -q)
と参考にしたサイトには書いてあります。
しかし全部消すのであれば、わたしとしては下のコマンドで一掃したいですね。
これは使われていないコンテナやイメージを一気に消してくれます。
docker system prune
あとは残ったコンテナやイメージを最初のコマンドで停止・削除します。
2. コンテナの中に入る
起動したコンテナの中に入ることも可能です。
これまでの作業ですべてのコンテナを削除してしまいましたので、もう一度ngnxを起動します。
ホスト側のブラウザからnginxにアクセスしたいのでポートを設定しておきます。
docker run -d -p 8080:80 nginx
run -d -p 8080:80 nginx
fa94b6da6e0e63abc33eca78e061c5921f24f7aee3b07b498a16df0a946874af
PS C:\Users\tetsuji> docker container ls
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa94b6da6e0e nginx "nginx -g 'daemon of…" 14 minutes ago Up 14 minutes 0.0.0.0:8080->80/tcp xenodochial_merkle
2-1. 起動したコンテナの中に入る
下のコマンドを実行すると先ほど起動したコンテナに入ることができます。
コンテナIDを指定してbashで入ります。
docker exec -it {Container ID} bash
例えばnginxファイルの存在を確認してみます。
たしかにnginxのファイルが見えますね。
docker exec -it 0b3901f01b82 bash
root@0b3901f01b82:/# ls /usr/share/nginx/html/
50x.html index.html
あとコマンドのインストールなどもしてみます。
root@fa94b6da6e0e:/# apt-get update
root@fa94b6da6e0e:/# apt-get install -y curl procps
実際nginxが起動しているか、 localhost:80 へアクセスしてみます。
動いてますねー
下記のようにnginxのindex.htmlを変えることもできます。
root@fa94b6da6e0e:/# echo "<h1>hello docker</h1>" > /usr/share/nginx/html/index.html
root@fa94b6da6e0e:/# cat /usr/share/nginx/html/index.html
<h1>hello docker</h1>
書き変わりました。
docker logs {Container ID}
コマンドでログを見ることも可能です。
起動したプロセスの 標準出力と標準エラーを見ることができるそうです。
docker logs fa94b6da6e0e
172.17.0.1 - - [08/Nov/2019:15:21:57 +0000] "GET / HTTP/1.1" 200 612 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36" "-"
2019/11/08 15:21:58 [error] 7#7: *2 open() "/usr/share/nginx/html/favicon.ico" failed (2: No such file or directory), client: 172.17.0.1, server: localhost, request: "GET /favicon.ico HTTP/1.1", host:
"localhost:8080", referrer: "http://localhost:8080/"
172.17.0.1 - - [08/Nov/2019:15:21:58 +0000] "GET /favicon.ico HTTP/1.1" 404 555 "http://localhost:8080/" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36" "-"
172.17.0.1 - - [08/Nov/2019:15:52:18 +0000] "GET / HTTP/1.1" 200 22 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.87 Safari/537.36" "-"
2-2. 停止したコンテナの中に入る
最後は停止したコンテナから新たにイメージを作る方法です。
amazonlinux2を起動して/tmp/中にhogeフォルダを作ります。
コマンドが終わればコンテナは停止します。
docker run amazonlinux:2 mkdir /tmp/hoge
docker run amazonlinux:2 mkdir /tmp/hoge
Unable to find image 'amazonlinux:2' locally
2: Pulling from library/amazonlinux
17282fad1a5e: Pull complete
Digest: sha256:5aa0460abffafc6a76590f0070e1b243a93b7bbe7c8035f98c1dee2f9b46f44c
Status: Downloaded newer image for amazonlinux:2
PS C:\Users\tetsuji> docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8f67ae93d41c amazonlinux:2 "mkdir /tmp/hoge" 18 seconds ago Exited (0) 17 seconds ago youthful_edison
docker commit
コマンドで停止したコンテナからexited-containerという名前の新たなイメージを作ります。
docker commit 8f67ae93d41c exited-container
sha256:de46c9f656fcaab46266762d07524ab42a4b68e6e70a928ac2008bd9277fff32
新たなイメージを起動して、コンテナ内で作成したディレクトリが存在するかどうか確認します。
docker run -it exited-container bash
bash-4.2# ls /tmp/
hoge
たしかにありました。
今日の感想
今回もまた「入門Docker」の内容をそのまま、まとめた内容になりました。
基本的にはデバッグの仕方を練習してみた感じでした。
Docker初心者なのでどういったデバッグのシチュエーションがあるのか、あまり想像がついていませんがなんとなく一通りのことはできそうかなと思いました。
それではまた✨