はじめに
Dockerは2年ほど憧れてた技術です。新人から4年ほどSIerさんにて開発者として務めた自分は、以前も基礎知識ぐらい触れましたが、転職4ヶ月後初めて構築してみました。
机上の知識を習得しても、資格を取得しても、実際に操作しないとしっかり把握できないことに痛感しました。
セキュリティを配慮してざっくりまとめますと、今回の案件は、子会社開発されたものをうちのサーバに構築する要望がありました。
提供されたもの:
・ソース
・フォルダ構成
・DDL
・ユーザマニュアル
準備と経緯
別にデカいのPJではないので、最初はMacOSで直接構築する案もありましたが、今後の運用保守や移行の可能性を考えたところ、Dockerを使うことにしました。
先輩にデプロイ用のフォルダ構成、そして社内AI部で人気があるGEMINI CLIの使い方を教えてくれました。その後、自分で模索して、三つのコンテナを立ち上げました。
正直言うと、今理解したこと全部正しいのかよくわかりませんが、とにかく今回の経験をメモしたいと思います。
遭遇した問題
1、そもそも、どうやって始まるか?
簡単なWEBプロジェクトは共通だと思いますが、最初は作業フォルダにて次のフォルダ構成を作りました。
my-project/
├── Frontend/
│ ├── js(Frontendソース)
│ └── nginx.conf
│ └── Dockerfile
├── Backend/
│ └── jar(Backendソース)
│ └── Dockerfile
├── DB/
│ └── create.sql(初期化用sql)
│ └── basic_data.sql(初期化用sql)
│ └── Dockerfile
├── docker-compose.yml
├── README.md
└── .env
続いて、各Dockerfileとdocker-compose.ymlを作成します。Dockerfile は「どんな環境(イメージ)を作るか」を書くファイルです。docker-compose.yml は「そのイメージをどう動かすか、どう連携させるか」を書くファイルです。具体的にはネットで例があるので割愛します。ちなみに、作業フォルダにGEMINI CLIを使えば、実際のソースや環境に応じて、上記ファイルを作成してくれます。今回の場合も大活躍でした。
また、docker-compose.yml一つのファイルだけで、3つのコンテナを生成できます。もし、他のDockerを連携する必要がある場合、特定の書き方で必要項目を書き込んでください。
2、docker buildコマンドを実行すると、エラーメッセージが出てきました。
MacOsに作業する場合、次のエラーメッセージが出る可能性あります。
security: SecKeychainSearchCopyNext: The specified item could not be found in the keychain.
要するに、DockerがmacOSのKeychainにアクセスできないので、ビルドは異常終了しました。これもあり得ることです。
解決方法:
sudo security -v unlock-keychain ~/Library/Keychains/login.keychain-db
これで一時的にロックを解除できて次へ進めます。
余談ですが、ここの問題を解決した時に、最初はGEMINIに投げて、解決案のコマンドを自動実行してくれたが、失敗しました。GEMINIがそういう権限ありません。ただ私が別のセッションで解除してもGEMINIが進められませんでした。やはり、同じセッションでアンロックとビルドを実行しなかったからです。
3、ポートのマッピング
今回はWindows端末からMacOSに接続して操作したので、ネットワークの問題は避けられません。
一番重要なのはポートのマッピングです。まずdocker_compose.ymlファイルにポートのマッピングを設定するには、portsを使います。次の例だと、これはホストのポート 8080 を、コンテナのポート 80 にマッピングしています。
ports:
- "8080:80"
今回はもともと存在しているredisのdockerと連携していますが、構築された時にポートのマッピングは設定されませんでした。しかし、redis insightを使いたいため、ポートマッピングの追加は不可欠です。
この場合、GEMINIの提案は、元のDockerを削除して、docker runで立ち上げ直すという方法です。この方法について疑問があるのは、マウントしたボリュームは削除されますか?ということです。最後はこの方法を使わなかったんですが、時間があればまた実践してみたいです。
ymlにポートマッピングを追加し、docker-compose up -dで再起動する解決案は無難でしょう。
最後に
今回は初心者として初めてのdocker構築です。大きな問題のみ書いてますが、実際作業中に色々あったので、AIがすごく助かりました。素晴らしい先生ですが、提案はそのまま受け入れたら何かまずいことも発生する可能性がありますので、今後使う時も心がけます。