LoginSignup
73

More than 5 years have passed since last update.

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

Posted at

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>

参考

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
73