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>