ふるてつのぶろぐ

福岡在住のエンジニアです。

写真提供:福岡市

今度は客先でコンテナ勉強会

今日すること

f:id:tetsufuru:20190806104529p:plain:w100
こんにちはふるてつです。

ただいま客先の勉強会にてDockerを勉強中で、まずは入門としてこちらのサイト「入門Docker」を勉強しております。
https://y-ohgi.com/introduction-docker/
今回は少なめですが、「プロダクションでの活用」 メニューの中から「デバッグ」ページをもくもくとしました。
「設計」と「セキュリティ」のところは読むだけで終わりましたので 今日は「デバッグ」です。 またいつものように勉強した内容を書きます。

1. コンテナのライフサイクル

f:id:tetsufuru:20191010180504p:plain ライフサイクルを意識することは重要だそうです。
コンテナの状態の確認方法をまずは勉強していきます。

1-1. 短命なコンテナ

docker runpythonで"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 へアクセスしてみます。
動いてますねー
f:id:tetsufuru:20191109004034p:plain

下記のように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>

書き変わりました。
f:id:tetsufuru:20191109005247p:plain

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初心者なのでどういったデバッグのシチュエーションがあるのか、あまり想像がついていませんがなんとなく一通りのことはできそうかなと思いました。

それではまた✨