何度だって再入門(Docker)- 1
はじめに
業務でざっくり触ったものの、正直何が何だかよくわかっていなかったので改めて再入門しておこうと思います。
とりあえずそれっぽいコマンド打ってみてOK!見たいな温度感で仕事していると、振り返った時に何していたのかよくわからない時ってありますよね。私はあります。
せっかく業務で触らせてもらったので、今後は「Dockerは少しだけ触ったことあります」って言えるように(そのハードルがとてつもなく高いんですが)改めて一から勉強していこうと思います。
勉強にはレビュー数と評判が良さげなUdemyを使っていきたいと思います。
以下は講義を聞きながら思ったことをメモしたものです。
用語まとめ
コンテナとは
サーバ上で隔離された実行環境。ホスト OS や他のコンテナに影響されず動作する。
ホスト OS とは異なるユーザーランドも用意でき、同一ホスト上で複数の環境を安全に共存させられる。
いきなりですけどホスト OS と別の OS を動かせるとは知りませんでした。コンテナという名前から船のコンテナを連想しますが、Kubernetes のアイコンが舵なのはそういう意味なんでしょうか。
Dockerとは
コンテナ仮想化技術を使い、隔離された環境を用意・実行・配布するためのツール群。
つまり上で諸々言っているコンテナを用意するための技術の1つがDockerってことですね。コンテナ = Dockerくらいに思っていたんですが違うみたいです。ちらっと調べた限りだとPodmanとか、containerdとか色々あるみたいです。
イメージとは
コンテナの実行環境テンプレート。必要な実行ファイルや設定を含む。
AWSで例えるなら AMI や起動テンプレートに近いイメージ(同一環境の複製が容易)。
無理やり知ってる単語で説明すると、AWSの起動テンプレートとかamiに近いものなんだろうなという理解です。テストの自動化とか開発環境の配布とかを行う上で、「全く同じ環境を簡単に複製できる」というのは、コンテナ技術が重宝されている理由の1つなんだろうなと見ていて思いました。
レジストリ
Dockerイメージを格納して置く場所。
ECRのイメージしかありませんでしたが、Docker Hub から取得するのが王道みたいです。
というか、ECR Publicで利用できるDocker Official Imagesというのは、そもそもdocker hubにあるものみたいですね。ちなみにDocker Official Imagesというのは、誰でも公開できるdocker hubの中で、公式が公認しているイメージって意味みたいです。
環境準備
Docker は過去にインストール済みのものを利用します。
いきなり躓きかけたんですが、Kubernetes は一旦考えない前提で「Resets Kubernetes Cluster」を押したところ、Starting...から止まる事象が発生。
よく見ると一瞬停止→再起動を繰り返していたため、タイミングを合わせて停止できました。
Hello World
とりあえず入門といえば、Hello World
全く関係ない話ですが、この「Hello World」には元ネタがあるみたいですね。どんなにすごい人でも Hello World を出力させたことがない人はいないと思うので、この瞬間だけは横並びだなと思うと少しワクワクします。(最も私はもうそんなに若くないので、すでにとんでもない差が開いているのは事実ですが)(引用に Wikipedia を出すのは少し抵抗がありますよね)
docker container run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
17eec7bbc9d7: Pull complete
Digest: sha256:56433a6be3fda188089fb548eae3d91df3ed0d6589f7c2656121b911198df065
Status: Downloaded newer image for hello-world:latest
Hello from Docker!
This message shows that your installation appears to be working correctly.
To generate this message, Docker took the following steps:
1. The Docker client contacted the Docker daemon.
2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
(amd64)
3. The Docker daemon created a new container from that image which runs the
executable that produces the output you are currently reading.
4. The Docker daemon streamed that output to the Docker client, which sent it
to your terminal.
To try something more ambitious, you can run an Ubuntu container with:
$ docker run -it ubuntu bash
Share images, automate workflows, and more with a free Docker ID:
https://hub.docker.com/
For more examples and ideas, visit:
https://docs.docker.com/get-started/
イメージ操作
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 1b44b5a3e06a 3 months ago 10.1kB
タグについて
TAGがバージョンの役割なんですよね。これはAWSの認定資格試験に散々出てきたので元々なんとなく知っていました。タグのイミュータビリティ(素直に上書きって言ってくれればいいのに)は有効にして、後から変更できないようにして置くのがセキュリティ、不慮の事故を防ぐために重要だって10回ぐらい答えた覚えがあります。dockerでもなんかのオプションで上書き不能にできるんですかね。
docker image pull ubuntu:20.04
20.04: Pulling from library/ubuntu
13b7e930469f: Pull complete
Digest: sha256:8feb4d8ca5354def3d8fce243717141ce31e2c428701f6682bd2fafe15388214
Status: Downloaded newer image for ubuntu:20.04
docker.io/library/ubuntu:20.04
docker image ls
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest 1b44b5a3e06a 3 months ago 10.1kB
ubuntu 20.04 b7bab04fd9aa 7 months ago 72.8MB
rmで消せます。どうでもいいんですけどrm(remove)、ls(list)って略されてるのにimageってフルで打たされるのちょっと違和感ありますよね。
docker image rm ubuntu:20.04
Untagged: ubuntu:20.04
Untagged: ubuntu@sha256:8feb4d8ca5354def3d8fce243717141ce31e2c428701f6682bd2fafe15388214
Deleted: sha256:b7bab04fd9aa0c771e5720bf0cc7cbf993fd6946645983d9096126e5af45d713
Deleted: sha256:470b66ea5123c93b0d5606e4213bf9e47d3d426b640d32472e4ac213186c4bb6
コンテナ操作
container lsでコンテナの一覧が見れます。hello-worldは実行されたらすぐにExitedしますが、起動し続けるタイプはここがupになります。
docker container ls -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
51bc1ffe41c1 hello-world "/hello" 41 minutes ago Exited (0) 41 minutes ago pensive_gagarin
停止、再起動も同じような要領ですね。
docker container stop 51bc1ffe41c1
51bc1ffe41c1
docker container restart 51bc1ffe41c1
51bc1ffe41c1
ログの見方
ログはlogsで見ることが出来ます。オプションで時刻を指定したり、表示する行数を指定できたりするみたいです。
ちょっと別の話ですが、docker container logsで見ているのは、コンテナが稼働しているホストOS上のコンテナ固有のファイルにjson形式で書き込まれたものみたいです。これはデフォルトのログドライバがそこに書き込むからそう設定されているだけみたいですね。
docker container logs 51bc1ffe41c1
主なオプション:
-
--timestamps, -t: 各ログエントリにタイムスタンプを表示 -
--details: 追加のログ詳細を表示 -
--tail, -n: 末尾から表示する行数を指定 -
--since: 指定時刻・期間以降のログを表示 -
--until: 指定時刻・期間以前のログを表示 -
--follow, -f: リアルタイムにストリーミング表示
まとめ
- コンテナはホストから隔離された実行環境で、同一ホストに複数共存可能
- Docker はイメージ配布・実行を通して環境の再現性を高める
- 初期確認は hello-world が手軽
- イメージ操作(pull/ls/rm)とコンテナ操作(ls/stop/restart)を押さえる
-
docker container logsで基本的なトラブルシュートが可能