そろそろDockerコンテナをもとにCI/CDを実践してみようかと思ったところ、Dockerのイメージとコンテナの概念をしっかり理解していないとCI/CDパイプラインが作成できないことに気づき、少々混乱しました。
ということでDockerおよびdocker-conposeの動作についてまとめてみました。
CI/CDにコンテナを使うときの課題
わかったつもりで使っていましたが、CI/CDパイプラインを構築しようと思うと以下でつまずきました。
永続化したファイルってイメージに含まれるの?
docker-compose.ymlに記述したenvironment部分ってどうなる?
Dockerfileとイメージ・コンテナの関係は?
接続データベースを商用環境のコンテナやテスト環境のコンテナでは変更したいけどどうしたらいい?
実際にコンテナベースでCI/CDを構築しようと思うとしっかりとDockerコンテナの仕様を知らないと運用できないですね😥
まずはコンテナ、イメージの関係を整理する
ということでDockerのコンテナ、イメージの関係を整理することにしました。
コンテナとは?イメージとは?を記載している方は多くいるので助かっているのですが、Dockerコマンドやdocker-composeコマンドのbuild,up,run,createなどで何が起こるのかについては少々情報が少ないです。
そんな中で以下の記事を参考にしながら図式化してみました。
※私なりの解釈で書いています。
Dockerの動作
- buildを行うとDockerfileをもとにイメージを組み立てる、その際ローカルファイルをイメージに取り込む(バインドする)ことができる
- createを行うとイメージからコンテナを作る
- startでコンテナを起動する、その際ローカルファイルをマウントできる
docker-composeの動作
- buildを行うとdocker-compose.ymlファイルをもとにイメージを組み立てる、その際Dockerfileの利用やローカルファイルのバインドも可能
- startを行うとまず停止中のコンテナがないかを調べ、なければイメージからコンテナを作成。その後コンテナを実行する。その際ローカルファイルをマウントできる
まとめ
自身で開発したプログラムなどはバインドまたはマウントして永続化しているはずです。
しかし、マウントしただけでは開発プログラムはイメージに取り込まれません。
AWS Fargateなどでテスト環境、商用環境を構築しようと思うと独自生成したイメージを利用することになるのでマウントではなく、バインドしてあげる必要があるというわけですね。