docker
docker-compose

いい加減docker-composeでlinksを使うのをやめてnetworkでコンテナ間名前解決をする

Dockerの --link や docker-composeの links が古臭い手法になっていることは認識していたが、特に不便を感じておらず使い続けてしまっていたのでnetworkをちょっと調べてみる。


docker-compose.yamlマイグレーション


linksで名前解決

version: '3'

services:
web1:
image: nginx:alpine
links:
- web2:web2
web2:
image: nginx:alpine

このようなごくシンプルな例で検証してみる。

links:

- web2:web2

の部分でweb1→web2へアクセスできるようにし、名前解決も行えるようにしたつもり。

ではweb1からweb2へcurlコマンドを叩いてみる。

$ docker-compose up -d

$ docker-compose exec web1 sh
# apk --update add curl
# curl web2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

ここまでOK。

既知の領域。


networkで名前解決

続いてlinksを使うのをやめるバージョン。

ドキュメントによると、


デフォルトでは、Compose はアプリケーションに対して ネットワーク を1つ設定します。


network: を書かなくてもデフォルトでnetworkは生成され、各コンテナはそのnetworkに参加した状態になるということのようだ。

さらに、


Docker のリンク(link)は、一方通行の単一ホスト上における通信システムです。この機能は廃止される可能性があり、アプリケーションはネットワーク機能を使うようにアップデートすべきです。 多くの場合は、docker-compose.yml で link セクションを削除するだけです。


ということなので links: を削除しただけのyamlが下記。

version: '3'

services:
web1:
image: nginx:alpine
web2:
image: nginx:alpine

名前解決がどのように行われるのかというと、


リンク機能(links)とは、他のサービスから到達可能なエイリアス(別名)を定義するものです。サービス間で通信するために必要ではありません。すなわち、 デフォルトでは、あらゆるサービスはサービス名を通して到達できます


サービス名が自動的にそうなるのか、なるほど、ということで下記を検証。

$ docker-compose up -d

$ docker-compose exec web1 sh
# apk --update add curl
# curl web2
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>

問題なくweb1からweb2にアクセスできた。

もちろんweb2→web1の名前解決も可能。

$ docker-compose exec web2 sh

# apk --update add curl
# curl web1
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>


参考