1. ホーム
  2. networking

[解決済み] Dockerコンテナ間で "ホスト名 "を介して通信する方法

2023-01-29 10:40:58

質問

モノリシックなサーバーを多くの小さな docker コンテナに分割する予定ですが、コンテナ間通信のための良いソリューションがまだ見つかっていません。これは私のターゲットシナリオです。

コンテナ同士をリンクさせる方法や、ポートを公開する方法は知っていますが、どの解決策も私には満足のいくものではありません。

従来のサーバネットワークのように、コンテナ間でホスト名(コンテナ名)を介して通信するソリューションはないのでしょうか?

どのように解決するのですか?

編集:Docker1.9以降では docker network コマンドを利用できるようになりました( https://stackoverflow.com/a/35184695/977939 ) を使用することをお勧めします。


私の解決策は、DNS レコードが自動的に更新されるようにホスト上で dnsmasq をセットアップすることです: "A" レコードはコンテナーの名前を持ち、コンテナーの IP アドレスを自動的に (10 秒ごとに) 指します。そのため 自動更新スクリプト をここに貼り付けます。

#!/bin/bash

# 10 seconds interval time by default
INTERVAL=${INTERVAL:-10}

# dnsmasq config directory
DNSMASQ_CONFIG=${DNSMASQ_CONFIG:-.}

# commands used in this script
DOCKER=${DOCKER:-docker}
SLEEP=${SLEEP:-sleep}
TAIL=${TAIL:-tail}

declare -A service_map

while true
do
    changed=false
    while read line
    do
        name=${line##* }
        ip=$(${DOCKER} inspect --format '{{.NetworkSettings.IPAddress}}' $name)
        if [ -z ${service_map[$name]} ] || [ ${service_map[$name]} != $ip ] # IP addr changed
        then
            service_map[$name]=$ip
            # write to file
            echo $name has a new IP Address $ip >&2
            echo "host-record=$name,$ip"  > "${DNSMASQ_CONFIG}/docker-$name"
            changed=true
        fi
    done < <(${DOCKER} ps | ${TAIL} -n +2)

    # a change of IP address occured, restart dnsmasq
    if [ $changed = true ]
    then
        systemctl restart dnsmasq
    fi

    ${SLEEP} $INTERVAL
done

dnsmasq サービスが docker0 . そして、コンテナを --dns HOST_ADDRESS でコンテナを起動し、このミニDNSサービスを使用します。

参考にしてください。 http://docs.blowb.org/setup-host/dnsmasq.html