Dockerをなんとなく使えるようになった(?)
お久しぶりです。今回はDockerという技術にトライし、それっぽく使えるようになったので自分なりにまとめてみようと思います。
Dockerとはそもそも
Qiita等で散々書かれている内容ではありますが、一応書くと
「アプリケーション導入の手順をスクリプト化し、それをDockerのコマンドとして実行し、(これまでのVMよりは軽量な)コンテナ(仮想マシン)のイメージを生成し,それをコンテナとして実体化することでアプリケーションを実行でき, さらにそれらを構成するデータベース等も同様にコンテナ化することで, コマンド一行でバックエンドとしてひとまとめに管理することができる。」というのが私の現状としての認識です。(めっちゃ早口で言ってそう)
もう少し噛み砕いてみる
このDockerという技術が生まれるまでにはいわゆる「それお前の環境だけじゃね?」というあるあるを取り除くことにあると考えています。
あなたのPCはバージョン〇〇のライブラリしか入ってないけど、実際に動かす環境では▲▲のライブラリが入っていて動かないetc…
このようなバージョンの差異だったり、環境の違いによる動作しないような状況を取り除くべく、仮想マシンを使ってある程度環境を統一しようという試みがあったようです。
しかし、この仮想マシンは一度起動するのに2分から3分程かかり、時間が無駄になります。
そこでこのDockerでは仮想マシンというものを使うのではなく、コンテナという仮想マシンに導入するホストOSの一部機能しか持たない特殊なOSを用いることで導入にかかる時間を削減するということを行ったわけです。
Dockerを使うまでの流れ
ここで想定するのは、なにか自作したアプリケーションをDockerの環境上で使うという場面です。
Dockerを使う前に、アプリケーションの実行ファイルや実行環境も含まれたイメージを生成する必要があり、それをするためにはDockerfileという設定ファイルを書く必要があります。
このDockerfileにDockerのコンテナを実体化するためのスクリプトを書きます。
例えば実際のコンテナで使う仮想OSの指定、どのディレクトリにあるソースコードをコンテナのイメージにコピーして、なんのコンパイル用のコマンドを叩く..といったものです。
次にこのDockerfileをもとに、「生成するイメージ名を指定した」イメージを生成するコマンドを叩きます。
このコマンドによってあなたのDocker環境にあなたのアプリケーションを含んだイメージが登録されます。
ここまででDockerのコンテナを起動するコマンドを叩けばそのものを動かすことができますし、後述するDockerComposeで作成したイメージを使うことができるようになります。
DockerComposeとはなにか
これも探せばQiita等でそれっぽい説明がいっぱい出てきます。
一応書くと、「コンテナを複数管理するための技術」です。
docker-compose.ymlという設定ファイルに、起動するサービス名(コンテナに相当する)や使うイメージ名・イメージそのものの指定、ポート開放、環境変数等を記述することができます。例えばデータベースのイメージを指定すれば、アプリケーションのコンテナとデータベースのコンテナを生成し、連携することが可能です。
またDockerは「お前の環境だけだろ」問題を取り除くという発想のもと生まれた技術なので、通常はデータの書き込みができませんが、ホストPCのフォルダをマウントする設定も記述することでデータを保存することが可能になります。
最後に
ここ1週間ほどDockerに悩まされたのですが、自分なりの理解ができたためまとめてみました。
間違えているところがあればコメントで指摘してください。
コメント入力