Dockerとは?
Dockerとはアプリケーションを開発・転送・実行するためのオープンなプラットフォームです
もっと噛み砕くとアプリケーションを基盤となるハードウェアに依存しないため、インフラがアプリケーションを扱っているかのように管理できるため便利かつ容易にサービス開発を行うのに役立ちます
インフラが管理できるということは他のチームメンバーに同様の環境を転送することも可能となります
より詳しく知りたいなら公式ドキュメントを参照してみてください
基礎的な概念
最も基本的な概念が
イメージからコンテナが作られる
ということです
コンテナが作成されることによって、僕らの実行環境(OS&ライブラリ&アプリケーション)が作られます
ではどうやって起動させるのでしょうか?
例えば
% docker run hello-world
というコマンドを打ってみると
Hello from Docker!
と出力されます
Dockerのアーキテクチャー
Dockerはクライアント・サーバ型のアーキテクチャです
これは使う側である僕らのコマンドを処理するクライアントとその後の複雑な処理をするサーバが別になってる(分散してる)ということです
先ほどのコマンドを詳しく見ていく前にDockerの内部を3つに分けると以下のようになります
- Dockerクライアント(client)
- Dockerデーモン(daemon)
- Dockerレジストリ(registry)
Dockerクライアント
Dockerクライアントは僕らが打ったコマンドを処理してDockerデーモンに情報を伝える窓口のようなものです
クライアント・サーバ型のクライアントに当たります
この際DockerデーモンへはRESTful APIを通して通信を行なっています
人に例えるなら耳や目のような外部の情報を受け取るところといった感じでしょうか
Dockerデーモン
DockerデーモンはDockerクライアントから届いたコマンドを元にDockerレジストリからイメージを取得しコンテナを作り出します
Dockerを使う際の脳みそと考えるといいかもしれません
ちなみにデーモンは"demon(悪魔)"ではなく"daemon(守護神)"であることに注意が必要です
Dockerレジストリ
Dockerレジストリとはイメージの貯蔵庫でパブリックとプライベートの2種類があります
つまりコンテナを作るときの仕様書をレジストリに保存していると考えると良いと思います
自分が使いたいイメージや他の人が作ったイメージをアップロードしておき、使いたい時にダウンロードするという仕組みで、例えるなら脳みその中でも海馬に近いと思います
コマンドを打ったときの流れ
先ほどコマンドを打ったとき以下のメッセージが帰ってきたと思います
$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
d1725b59e92d: Pull complete
Digest: sha256:0add3ace90ecb4adbf7777e9aacf18357296e799f81cabc9fde470971e499788
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/
これは以下の流れを示しています
- クライアントがデーモンに「"hello-world"イメージ下さいというリクエストが来ましたよ」と伝える
- デーモンは「ローカルのレジストリを調べたけど"hello-world"なんてイメージないよ」とクライアントに伝える
- デーモンがDocker Hubというパブリックなレジストリにあるか調べる➡︎これがlibraryディレクトリのこと
- "hello-world"のイメージがレジストリにあるのでダウンロードする
- デーモンが取得したイメージをもとにコンテナを作る
- コンテナを作った結果をクライアントに伝える
- "Hello from Docker!"と表示される
まとめ
基本的な流れを理解することでその後のコマンドやエラー文を読めるようになるためこの記事でまとめたことは最低限の知識として理解しておきましょう
ドキュメントが日本語で書かれているので読みやすいです