dockerのimageとコンテナ

なんとなく、golangとpostgresの2つのコンテナを持つdocker-composeを用意できた。けど、あまりにもいろんなことがわからないので、整理する。
例えば、、

  • Dockerfileのgithub tokenはどうやって設定するのか?
  • commandに置いたshがdocker composeから参照できない
  • コンテナ、ネットワーク、イメージ、ビルド?

っていうレベル。

Docker imageとcontainer

Docker Engineがイメージとコンテナを扱う。

何が行われているか。

  1. hello-world ソフトウェアのイメージを持っているかどうか確認。
  2. Docker Hub (詳しくは後述)からイメージをダウンロード。
  3. コンテナにイメージを載せて(読み込んで)「実行」する。

つまり、コンテナはimageを元にして作られるってことか。まずは理解。

で、docker compose。

Compose とは、複数のコンテナを使う Docker アプリケーションを、定義・実行するツールです。Compose はアプリケーションのサービスの設定に、Compose ファイルを使います。そして、コマンドを1つ実行するだけで、設定した全てのサービスを作成・起動します。

こんな感じか。

コンテナ作成時にボリューム・データの保持

docker-compose up を実行時、以前に実行済みのコンテナが見つかれば、古いコンテナから新しいコンテナにボリュームをコピーする。ボリューム内で作成したデータを失わないように守る。

volumes:  
  logvolume01: {}

変更のあったコンテナのみ再作成

Compose はコンテナ作成時に使う設定情報をキャッシュし、サービスの再起動時に、内容に変更がなければ、Compose は既存のコンテナを再利用する。
ここがよくわからないんだよなあ。

環境間で変数の共有

Compose は Compose ファイル中で、変数の使用をサポートする。環境変数を使い、別々の環境や別々のユーザ向けに構成をカスタマイズできる。ここもdocker fileの変数と、docker composeの変数とといろいろあって、混乱する。

Compose は開発環境、テスト、ステージング環境だけでなく、CI ワークフローにも適しています

ここもこれから理解しないと行けない。ここからちょっと各論に行く。

  1. Dockerfileでimageを作る
  2. docker-compose upで複数のコンテナを作る
    exposedでportの開放可能。これをするとhttp://0.0.0.0:port/ で入れる
  3. 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行目のこと。 起動してスクリプトを読み込むインタプリタを指定する。 ハッシュ・バンまたはシェル・バン、シャープ・バンとも言うが、これらを縮めたシェバンという呼び方が一般的かつ簡素である。