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
にバインドされているようです。
ポート
ufw
やiptables
環境下では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ファイルのパスからディレクトリ名を切り出し
- そのディレクトリへ移動してイメージの更新
をかけています。
pull
もup
も更新がなければスキップされます。自動更新をかけたいイメージには、タグに:latest
などを指定しておきます。逆に更新をかけたくない場合、バージョンを固定するタグが指定しておけば、ほぼスキップされます。
あとはこのシェルスクリプトをcronに登録して完了です。
避けたい操作
compose稼働中にcompose.ymlを変更する
compose
稼働中に設定ファイルを変更し、再度compose
コマンドを実行すると、変更後の設定ファイルに基づいたコマンドが実行されます。
環境変数程度であれば問題ないですが、コンテナ名や内部のネットワーク名を変更した場合、compose down
したときに正常にクリーンアップされず、古い名前のコンテナやネットワークが残り続けることになります。
カレントディレクトリのcomposeが稼働中か確認する
docker compose ls | grep $(pwd)
カテゴリ: 開発