雑記帳

整理しない情報集

更新情報

Dockerのメモ書き

公開日:

カテゴリ: 開発

Dockerのちょっとしたメモ書きです。

Dockerネットワークのコンテナ間の名前解決

Dockerの内部ネットワークのIPアドレスは固定ではありません。無理矢理固定する方法も無くはないようですが、なんだか闇の手法に見えるので、正攻法っぽいDockerの内部DNSを使う方法で対応していきす(どこにも正攻法とは書いていませんが・・・)。

デフォルトのネットワーク同士では、コンテナ名のみで名前解決できます。net-aliasを指定している場合は、net-aliasで指定したエイリアスでも名前解決できます。

# HTTPでの接続例
http://container_name/
http://net-alias1/
http://net-alias2/

作成したDockerネットワークに接続している場合、ネットワーク名をTLDとしてホスト名(orエイリアス).ネットワーク名で名前解決できます。

# HTTPでの接続例
http://container_name.network_name/
http://net-alias1.network_name/
http://net-alias2.network_name/

ちなみに、Dockerの内部DNSへはコンテナ内のresolv.confに自動で書かれ、127.0.0.11にバインドされているようです。

ポート

ufwiptables環境下ではPORTでポートを開けると、自動でホストのファイアウォールのポート開放が行われます。

外部に公開するコンテナであればそれでよいのですが、Dockerネットワーク内で通信するのみのコンテナであれば、ポート開放は必要ありません。

Dockerネットワーク内に公開するポートはEXPOSEを指定しておくと、docker container lsコマンドでPORTS列に表示されるようになるので便利です。EXPOSEはコンテナの動作には一切関与せず、ただのドキュメントとして機能します。

Docker Compose イメージの自動更新

Hubのイメージが更新された際、毎回composeのディレクトリを開いてpullするのが面倒になってきたので、常時稼働のものについてはシェルスクリプトで自動化します。

ご注意

このような記事を読んでいる方は承知しているとは思いますが、絶対に落としてはいけない環境では、くれぐれもこのようなスクリプトを使用してはいけません。必ず新バージョンでの稼働確認を行ってから更新しましょう。

#!/bin/sh
set -e

for dc_dir in $(docker compose ls | tail -n +2 | awk '{print $3}' | sed 's:/[^/]*$::'); do
  cd ${dc_dir}
  docker compose pull
  docker compose up -d
  cd - > /dev/null
done

docker image prune -f

中身は単純で

  • composeで稼働中のコンテナ一覧を取得
  • 先頭行を切り捨て(先頭行はタイトル)
  • 3列目(CONFIG FILES)を抽出
  • composeファイルのパスからディレクトリ名を切り出し
  • そのディレクトリへ移動してイメージの更新

をかけています。

pullupも更新がなければスキップされます。自動更新をかけたいイメージには、タグに:latestなどを指定しておきます。逆に更新をかけたくない場合、バージョンを固定するタグが指定しておけば、ほぼスキップされます。

あとはこのシェルスクリプトをcronに登録して完了です。

避けたい操作

compose稼働中にcompose.ymlを変更する

compose稼働中に設定ファイルを変更し、再度composeコマンドを実行すると、変更後の設定ファイルに基づいたコマンドが実行されます。

環境変数程度であれば問題ないですが、コンテナ名や内部のネットワーク名を変更した場合、compose downしたときに正常にクリーンアップされず、古い名前のコンテナやネットワークが残り続けることになります。

カレントディレクトリのcomposeが稼働中か確認する

docker compose ls | grep $(pwd)

カテゴリ: 開発