dockerのimageとコンテナ
なんとなく、golangとpostgresの2つのコンテナを持つdocker-composeを用意できた。けど、あまりにもいろんなことがわからないので、整理する。
例えば、、
- Dockerfileのgithub tokenはどうやって設定するのか?
- commandに置いたshがdocker composeから参照できない
- コンテナ、ネットワーク、イメージ、ビルド?
っていうレベル。
Docker imageとcontainer
Docker Engineがイメージとコンテナを扱う。
何が行われているか。
- hello-world ソフトウェアのイメージを持っているかどうか確認。
- Docker Hub (詳しくは後述)からイメージをダウンロード。
- コンテナにイメージを載せて(読み込んで)「実行」する。
つまり、コンテナはimageを元にして作られるってことか。まずは理解。
で、docker compose。
Compose とは、複数のコンテナを使う Docker アプリケーションを、定義・実行するツールです。Compose はアプリケーションのサービスの設定に、Compose ファイルを使います。そして、コマンドを1つ実行するだけで、設定した全てのサービスを作成・起動します。
こんな感じか。
コンテナ作成時にボリューム・データの保持
docker-compose up を実行時、以前に実行済みのコンテナが見つかれば、古いコンテナから新しいコンテナにボリュームをコピーする。ボリューム内で作成したデータを失わないように守る。
volumes:
logvolume01: {}
変更のあったコンテナのみ再作成
Compose はコンテナ作成時に使う設定情報をキャッシュし、サービスの再起動時に、内容に変更がなければ、Compose は既存のコンテナを再利用する。
ここがよくわからないんだよなあ。
環境間で変数の共有
Compose は Compose ファイル中で、変数の使用をサポートする。環境変数を使い、別々の環境や別々のユーザ向けに構成をカスタマイズできる。ここもdocker fileの変数と、docker composeの変数とといろいろあって、混乱する。
Compose は開発環境、テスト、ステージング環境だけでなく、CI ワークフローにも適しています
ここもこれから理解しないと行けない。ここからちょっと各論に行く。
- Dockerfileでimageを作る
- docker-compose upで複数のコンテナを作る
exposedでportの開放可能。これをするとhttp://0.0.0.0:port/ で入れる - docker-compose stopでサービスを停止できる
だから、例えばソースコードを変更したら、そのイメージだけ削除して、イメージを作り直してdocker compose upをやれば良い。
working_dir
WORKDIR 命令セットは Dockerfile で RUN 、 CMD 、 ENTRYPOINT 、 COPY 、 ADD 命令実行時の作業ディレクトリ(working directory)を指定します。
コピペで環境を作っていたら、shファイルが見つからなくてハマった。 docker composeとdockerfileそれぞれでどうやって設定すべきなのか。
Cannot start service: OCI runtime create failed: containerlinux.go:348: starting container process caused "exec: \"/startapp.sh testdb:5432\": stat /startapp.sh test_db:5432: no such file or directory": unknown
改行が入ると引数の扱いが変わるからだった。
entrypoint: ./wait-for-it.sh db:5432
とするのと、
entrypoint:
- ./wait-for-it.sh db:5432
ではだめ。 この場合は、ymlではシェルでおなじみの \ ではなくて > 記号でできる。
entrypoint: >
./wait-for-it.sh
- db:5432
とする。もう一つ、shの#!で始まる行のことをShebangといい、ここが大切だと知らなかった。
シバンまたはシェバン (英: shebang) とはUNIXのスクリプトの #! から始まる1行目のこと。 起動してスクリプトを読み込むインタプリタを指定する。 ハッシュ・バンまたはシェル・バン、シャープ・バンとも言うが、これらを縮めたシェバンという呼び方が一般的かつ簡素である。