Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

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>

参考

dyoshikawa
広島でクジラTシャツを着て仕事しています
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away