速習Docker

# Dockerを学びたい人のための速習法
Dockerを学びたいけど、何から始めたらいいのかわからない。
Dockerは知ってるけど、全体はつかめていない。

という人のためにDockerの速習法についてまとめます。

Docker Desktopのインストールなど環境構築については今回割愛します。
環境構築については多数記事があがっているので、環境構築が終わってから本記事を見ることをオススメします。

# Dockerを学ぶ手順
Dockerといっても機能がたくさんあってすべて網羅するのは大変です。
なので、今回はよく使う重要なポイントだけをピックアップしました。
この流れで学習すれば、ほとんどの開発現場では困らないはずです。

次の手順で学んでいきましょう。
1. Dockerコマンド集
1. コンテナ操作
1. Dockerfileの記述法
1. イメージ作成
1. マルチステージビルド
1. ストレージマウント
1. コンテナネットワーク
1. Docker Composeの記述法
1. devContainer


# 各項目について解説
簡単に各項目を学習する上でのポイントや参考リソースを紹介します。

## Dockerコマンド集
Dockerを扱う上でコマンドを覚えることは必須です。
まずはどのようなコマンドがあるのかざっと確認して、いつでも確認できるようにチートシートなど持っておきましょう。

なお、旧コマンドと新コマンドがありますが、今から学ぶなら新コマンドで覚えましょう。
次のように旧コマンドのほうが短くて使いやすいという特徴があるものの、今後のアップデートで使えなくなる可能性があるので。

| 旧コマンド | 新コマンド |
| ---- | ---- |
| docker ps | docker container ls |
| docker run | docker container run |

https://docs.docker.jp/engine/reference/commandline/index.html

## コンテナ操作
コマンドをざっくり確認したら、実際に叩いてみて動きを確認しましょう。
扱うDockerイメージはDocker Hubというところで公開されています。
試しに使うイメージは何でも大丈夫ですが、定番はnginxのイメージを起動して、Webサーバーを動かすといったものがあります。

https://hub.docker.com/_/nginx

## Dockerfileの記述法
Dockerコンテナの操作に慣れたら、次はオリジナルのDockerコンテナを作りましょう。
コンテナをカスタマイズするには、Dockerfileというファイルにカスタマイズ内容を記述していきます。

Dockerfileは記述する上でのルールがあるので、下記を参考に書いていきましょう。

https://docs.docker.jp/engine/reference/builder.html

## イメージの作成
Dockerfileができたら、次はDockerfileをもとにイメージを作成しましょう。
Dockerfileは基本的にプロジェクトフォルダのルート直下に置きますが、別のディレクトリに配置することもできます。その際にはビルドコンテキストについて知っておく必要がありますが、今回は割愛します。

ビルドコンテキストについては下記を参照

https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/dockerfile_best-practices/

## マルチステージビルド
Dockerイメージは一度作成したら終わりではなく、運用していく上で繰り返し更新していくものです。
そして、更新したイメージはサーバーに送る必要があります。

このとき、ストレージの容量節約とネットワーク上の転送量節約の観点から、作成するイメージの容量はできるだけ小さくしたいです。

このイメージ容量を最小限にする方法としてよく使われるのがマルチステージビルドです。

また開発用、ステージング用、本番用と用途別にイメージ出力を分けたいという場合にも使われます。

https://docs.docker.jp/develop/develop-images/multistage-build.html

https://matsuand.github.io/docs.docker.jp.onthefly/develop/develop-images/multistage-build/

## ストレージマウント
コンテナ上のファイルはコンテナを削除してしまうとファイルも削除されてしまいます。
そのため、ログやデータベースバックアップなども残りません。
これらを残したい場合には、コンテナ外に保存する必要があります。

ローカルで開発する場合、コンテナとローカル上のファイルをマウントでつなぐ方法があります。

またマウント方法は複数あるので下記を参考にしてみてください。

https://matsuand.github.io/docs.docker.jp.onthefly/storage/

## コンテナネットワーク
コンテナをつなぐネットワークについてはいくつか種類がありますが、デフォルトはブリッジネットワークになっており、基本的にこのブリッジを使います。

またデフォルトのブリッジと自分で作ったブリッジにも違いがあり、デフォルトのブリッジネットワークではコンテナ名による名前解決ができないといった特徴などがあります。

一番使うのはこのブリッジネットワークなので、とりあえずこれだけ抑えていたら問題ないです。
他のネットワークについては使う場面が限られるので、その時に学習すれば問題ありません。

https://docs.docker.jp/engine/userguide/networking/dockernetworks.html

## Docker Composeの記述法
アプリケーション開発でDockerを使用する場合、複数コンテナを扱うことがよくあります。
Webサーバー、APサーバー、DBサーバーなど用途別にコンテナを分けて管理する場合など。

もちろんDockerfileとDockerコマンドだけで構築することもできますが、記述量や実行するコマンドが多くなり、管理が大変になります。

そういうときに使うのが、Docker Composeです。

Docker Composeを使えば、docker-compose.ymlというファイルに構成を一元管理できたり、「docker-compose up」コマンドで一括起動することもできます。

https://docs.docker.jp/compose/toc.html

## devContainer
Dockerコンテナはローカル環境を汚さずに開発できるのが利点だけど、コーディング作業もできればそのままコンテナ上で行いたいですよね。

そういうときに使えるのがdevContaienrです。

基本的にIDEのプラグインとして提供されており、プラグインと「.devcontainer/devcontainer.json」というファイルを用意するば使用できます。

VSCodeのdevContainerはIDEで使用するプラグインもコンテナ別に分けることができるので、Java用のコンテナにはJava用のプラグイン、PythonだったらPython用というようにローカルのインストール済みプラグインとは分けて管理することもできます。

https://code.visualstudio.com/docs/devcontainers/containers

# Dockerを使う上で注意したいこと
Dockerを使っているとよくあるのがストレージ容量の圧迫です。
コンテナ起動やイメージ作成を繰り返していると、未使用のコンテナやイメージが大量にできてしまいます。

またコンテナ名やイメージ名をわかりやすくつけていないと、消してもいいものなのかどうかもわからなくなります。

そのため、Dockerを使うときはなるべき使わなくなったコンテナやイメージはすぐ消すことを意識しましょう。