本記事では、DockerやDocker Composeに関して、学んだことを自分用にアウトプットしていきます。
また、本記事の内容は都度変更されたり、内容が書き加えられたりすることがあります。
また、Dockerに関する内容の記述は、公式ドキュメントの内容を参考にしています。
Docker概要
Dockerとは
Dockerは、アプリケーションを開発・発表・起動するためのオープンプラットフォームである。
Dockerは、開発者のローカルPCの環境基盤から、アプリケーションを切り離すことで、ソフトウェアを迅速に配布する事ができる。
Dockerを使うことで、開発者は、そのアプリケーションを開発するために使用した環境基盤(OSやプログラミング言語の種類・バージョンなど)を、簡単に再現することができる。
これによって、自分が開発したアプリケーションが、環境の差異によって他人のOSでは動かない、といった事を防ぐことができる。
私たちがDockerを使用する時、イメージ、コンテナを始め、ネットワーク、ボリューム、プラグインといった、様々なDocker オブジェクトを作り、使用することになる。
Images
Dockerイメージ。これは、Docker container(コンテナ)を作るためのインストラクション付きの、読み取り専用のテンプレートである。
通常、イメージは別のイメージを基礎として、いくつかの追加の変更が加えられる。
例えば、Ubuntuのベースイメージを基盤に、そこにアパッチウェブサーバーと自分のアプリケーションを含めたイメージをビルドするかもしれない。
イメージは、自分で1から作るか、もしくは他人が作ってレジストリに公開されているものを使うこともできる。
※あるいは、他人が作ったイメージや公式が配布しているイメージをもとに、自分専用のカスタムを加えることもできる。
自分のイメージをビルドするためには、イメージを作って動かすために必要なステップがシンプルな構文によって定義されたDockerfileを作成する。
Dockerfileのそれぞれのインストラクションは、イメージのレイヤーを作成する。
Dockerfileの中身を変更してイメージを再ビルドした時、変更が加えられたレイヤーだけが再ビルドされる。
これは、Dockerイメージが軽量で、小さく、素早く動くことを実現している仕様の中の1つである。
Containers
Container(コンテナ)は、イメージの実行可能なインスタンスである。
つまり、イメージをもとに、実際に動いている実物のことを指している。
コンテナは、DockerのAPIもしくはCLIを使って、作成・起動・停止・移動・削除を行うことができる。
コンテナは、1つかそれ以上のネットワークへと繋げたり、ストレージを繋げたりすることができる。
デフォルトでは、コンテナは他のコンテナや、ホストPC(ローカルマシン)から相対的に全く独立している。
独立したコンテナ内のネットワーク・ストレージ・その他のシステムなどは、他のコンテナや、ホストPCから操作することができる。
コンテナは、それを作り、起動させるときに、私たちがイメージに施した構造に関するオプションに従って定義される。つまり、私たちが一生懸命作ったイメージ通りのコンテナが作られるのだ。
Docker頻出コマンド
ここからは、使った事のある・またはよく出てくるDockerコマンドを、再利用ができるようにまとめている。
Docker
単一のDockerfileから、イメージをビルドしてコンテナを起動する。
$ docker build -t <imagename> .
-tでイメージに人間が読みやすい名前を付ける。.はカレントディレクトリにdockerfileがある事を教えている。
$ docker run -p <hostportnumber>:<dockerportnumber> <imagename>
ポートフォワディングという技術を使って、ホストPCのポート番号(左)とコンテナのポート番号(右)を繋いでいる。
Docker Compose
compose.yamlファイルから、複数のコンテナを並行して起動するためのコマンド
$ docker compose up -d
同じ階層にあるyamlファイルを読み取ってコンテナを起動する。
-dフラグを付けることで、コンテナがバックグラウンドで起動され、ターミナルの操作権が戻ってくる。
$ docker compose down
作成したコンテナ自体を、完全に削除するコマンド。