こんにちは。ファガイです。
いままで開発環境でのみDocker(docker-compose)を利用していたのですが、k8sとか使って本番環境作ってみたいなぁとかそういうことを考え始めて調べていたら色々勘違いがあったので脳内アップデートした話です。
(実際にはまだ本番利用などをしてないので実践したというよりも空想上で理解した話です)
これまでの話
これまで、開発用にdocker-composeを利用して環境を構築するといったことをやってきました。(nginx,php-fpm,mysqlみたいな分け方はしてました)
Docker自体の理解をあまりしてなくて、単にvagrantをちょっと便利にしたような物といった感じで使ってました。
ただ、本番でこれを活用するといったことは無いといった状況です。
何を勘違いしていたのか
結論から言うと、アプリケーション(Laravelなどの動かすためのファイル)を内包してイメージ(コンテナ)化するべきだということです。(これだけで、一気に自分のずれた歯車がピッタリはまって、検索等でも思ったような情報が持ってこれるようになった気がします。)
Docker HubなどのDocker Registoryにpushする前提にする必要があること。(もちろん開発だけで使う場合は必要ない)
アップデート経緯
k8sの情報を見ていると、どの記事をみてもプロジェクトファイルを置く話が書いていません。
いままでdocker-composeでvolumeでバインドしていたので、基本的に外部から読みに行くものだと思っていてここが私のk8sなどのツールの理解の障壁となっていました。
他にも、arukasの初期のベータ版を利用してみようと思ったときも、前提としてプロジェクトファイルを外に置いておくものと言う認識があったせいで???となっていました。
流石にここまで来ると私の認識が間違えているんじゃないかということを理解し始めて検索するにも一向に手がかりを見つけきれてなかったのですが、ふと幾つかのDockerfileを見ていてCOPYなどを利用してイメージに埋め込んでいる箇所を見つけて色々調べていったらこっちが一般的だということに気づきました。
実際、DockerfileにCOPYを書いてプロジェクトファイルを内包するという話に至るのは相当時間がかかりました。もともとそのようなものではないという認識が大きかったので。イメージが大きくなってしまうから入れるべきではないものだと思っていました。
脳内アップデートしたので、今後の利用を考えた
- まず、ベースとなるphpイメージを作成する(これは本番利用という話ではなく、後にめんどくささを解消するということもあって)
- それをベースに本番用Dockerfileを作る。(ここでは本番で動く最低限のものしか入れないようにする。プロジェクトファイル内に用意する。Docker multi stage buildとか使えばnpmを排除出来たり。)
- Docker Cloudなどを利用して、本番用Dockerfileをビルドしてテスト、その後にできたイメージをDocker HubとかECRとかに投げるScriptを書く。
- デプロイが必要なら、CIが動いた後にそのままデプロイするか、WebHookで別のCIにデプロイを任せる(デプロイ時にイメージにプロジェクトファイルが内包出来ているので環境変数とかそのあたりを設定しておけば良いだけ)
- ローカルで利用する場合は本番用イメージを引っ張ってきて今までのような使い方をする。本番用イメージには開発用のパッケージなどが入ってないので必要であれば別途Dockerfileを書いて利用する
こんな感じかな?DockerComposeも本番用にoverride用ファイル書けるとか個別ビルドの話もドキュメントに載っていたので活用できそう。
ちょっとポエムっぽくなってしまいましたがこんな感じです~。
すっきりしたので、今度本番でも活用していきたい。
コメント