docker network connectコマンドの使い方(実例付)

Docker
Docker公式ロゴ3a
©2020 Docker Inc. All rights reserved

 本記事はDocker ver19.03.10の環境で確認しています。

 このコマンドは、コンテナをDockerネットワークに接続する際に使用します。

 コンテナをDockerネットワークに接続する方法は、接続するネットワークをコンテナ起動時に指定する方法と、docker network connectコマンドを使用する方法の2つあります。

 コンテナ起動時に指定する方法では、1つのネットワークしか指定できませんが、docker network connectを使用することで、コンテナを複数のネットワークに接続させることが可能になります。

 dockerネットワークに関しましては、別記事「Dockerネットワークの概要とその作り方の解説」をご参照ください。

docker network connectコマンドのフォーマットとオプション

フォーマット

docker network connect [オプション] ネットワーク コンテナ

主なオプション一覧

オプション概説
--alias=[] 対象のネットワーク内で使用可能なコンテナ用の
エイリアスを追加する
--ip接続するコンテナのIPアドレス(v4)を指定する
--ip6接続するコンテナのIPアドレス(v6)を指定する

コマンド例

$ docker network connect testnet1 testvm

docker network connectコマンドの主な使い方

 以下で実例をまじえたコマンドの使い方を解説していきたいと思います。

実例では、CentOSの公式イメージにより起動したコンテナ(testvm)を使用します。

コンテナは「docker run -d --name testvm centos init」で起動します。

※「--rm」オプションを付けておりませんので、ご利用後はコンテナ削除をお忘れなく。

基本事項の解説

 docker network connectコマンドは、コンテナを指定したDockerネットワークに接続することができます。

 Dockerネットワークに接続したコンテナのIPアドレスは、デフォルトではDockerが自動付与しますが、オプションで指定することもできます。

コンテナを指定したDockerネットワークに接続する

 まず、テスト用のコンテナtestvmを作成して起動します。

$ docker run -d --name testvm centos init

 docker inspectコマンドにて「Networks」の設定内容を確認してみましょう。

$ docker inspect testvm

 「Networks」の部分は以下のようになっています。

(省略)
 "Networks": {
        "bridge": {
 (省略)

 これは、testvmはbridgeという名前のネットワークに接続していることを表しています。Dockerコンテナ起動時にネットワークを指定しなかった場合は、デフォルトでbridgeネットワークに接続されます。

 docker runコマンドにてネットワークの指定なしにコンテナを起動しましたので、仕様どおりの動きですね。

 コンテナtestvmを接続するもうひとつのDockerネットワークtestnet1を作成します。

$ docker network create -d bridge testnet1

 ネットワークtestnet1にコンテナtestvmをdocker network connectコマンドで接続します。

$ docker network connect testnet1 testvm

 再度docker inspectコマンドにて、コンテナtestvmの「Networks」の設定内容を確認してみましょう。

$ docker inspect testvm

 「Networks」の部分は以下のようになりました。

(省略)
 "Networks": {
        "bridge": {
 (省略)
 },
        "testnet1": {
 (省略)

 先ほどはネットワークbridgeしか表示されてなかったのですが、今回はネットワークtestnet1が追加されています。

 docker network connectコマンドでコンテナtestvmがネットワークtestnet1に接続されたことが確認できました。

ネットワークに接続する際にコンテナのIPアドレスを指定する

 まず、前項で作成したネットワークtestnet1に接続したコンテナtestvmのIPアドレスを確認します。

 docker inspectコマンドでtestvmの情報を確認してみましょう。

$ docker inspect testvm

 「Networks」の「IPAddress」部分のみ確認します。

"Networks": {
       "bridge": {
 (省略)
             "IPAddress": "172.17.0.2",
 (省略)
       "testnet1": {
 (省略)
             "IPAddress": "192.168.128.2",
 (省略)

 ネットワークbridgeでは「172.17.0.2」、ネットワークtestnet1では「192.168.128.2」であることがわかりました。

 Dockerネットワークでは、ネットワーク毎に使用可能なアドレス帯やコンテナのIPアドレスが自動的に割り当てられます。これはDHCP機能ではなく、Docker独自の仕組みです。

 基本的に、IPアドレスに関しましてはDockerに任せておけば重複などの心配は無いのですが、場合によっては自分で指定したい場合もあると思います。

 例えば、WebサーバとDBサーバで構成されたシステムで、お互いのIPアドレスを設定しなければいけないような場合です。

 Dockerネットワークで、自分でIPアドレスを決めたい場合は、まずネットワークを作成する際に、そのネットワークのサブネットを自分で指定して作成する必要があります。

 以下のコマンドで新しいネットワークtestnet2を作成します。作成する際にtestnet2のサブネットは「172.20.0.0/24」を指定することにします。

$ docker network create --subnet 172.20.0.0/24 testnet2

 このネットワークtestnet2にコンテナtestvmを接続してみます。IPアドレスは「172.20.0.77」を指定します。

$ docker network connect --ip 172.20.0.77 testnet2 testvm

 docker inspectコマンドでtestvmの情報を確認してみましょう。

$ docker inspect testvm

 「Networks」の「IPAddress」部分のみ確認します。

"Networks": {
      "bridge": {
 (省略)
            "IPAddress": "172.17.0.2",
 (省略)
      "testnet1": {
 (省略)
            "IPAddress": "172.18.0.2",
 (省略)
      "testnet2": {
 (省略)
            "IPAddress": "172.20.0.77",
 (省略)
 }
 (省略)

 ネットワークtestnet2上では、コンテナtestvmのIPアドレスは「172.20.0.77」に設定されていることが確認できました。

 IPv6を使用する場合は、「--ip6」オプションを使用します。

ネットワークに接続する際にコンテナのエイリアス名(別名)を指定する

 コンテナをDockerネットワークに接続する際に、コンテナにエイリアス名を設定することができます。

 エイリアスのテストを行うためにコンテナtestvm2を起動します。

$ docker run -d --name testvm2 centos init

 このコンテナを前項で作成したネットワークtestnet2に接続してみましょう。接続する際に、betsumeiというエイリアス名を設定します。

$ docker network connect --alias betsumei testnet2 testvm2

 前項で使用したコンテナtestvmからbetsumeiに対してpingを飛ばしてみます。

$ docker exec -it testvm ping betsumei
 PING betsumei (172.20.0.2) 56(84) bytes of data.
 64 bytes from testvm2.testnet2 (172.20.0.2): icmp_seq=1 ttl=64 time=0.065 ms
 64 bytes from testvm2.testnet2 (172.20.0.2): icmp_seq=2 ttl=64 time=0.055 ms
 ^C
 --- betsumei ping statistics ---
 2 packets transmitted, 2 received, 0% packet loss, time 1028ms
 rtt min/avg/max/mdev = 0.055/0.060/0.065/0.005 ms

 testvm2のエイリアス名betsumeiからpingの応答がありました。

 pingの出力を止めるには「Ctrl + c」を押します。

 念のためtestvm2に対してもpingを飛ばしてみます。

$ docker exec -it testvm ping testvm2
 PING testvm2 (172.20.0.2) 56(84) bytes of data.
 64 bytes from testvm2.testnet2 (172.20.0.2): icmp_seq=1 ttl=64 time=0.046 ms
 64 bytes from testvm2.testnet2 (172.20.0.2): icmp_seq=2 ttl=64 time=0.054 ms
 ^C
 --- testvm2 ping statistics ---
 2 packets transmitted, 2 received, 0% packet loss, time 1021ms
 rtt min/avg/max/mdev = 0.046/0.050/0.054/0.004 ms

 testvm2からもpingの応答がありました。testvm2とbetsumeiのIPアドレスも同じですね。

おわりに

 以上でdocker network connectコマンドの紹介を終わります。

 ご指摘、ご要望などが御座いましたらコメントいただけるとうれしいです。

 他のDockerコマンドの実例付紹介記事は、本サイト内の別記事「Dockerのコマンドの一覧(CE対応版)(オリジナルな実例付き)」をご参照ください。

 ご訪問ありがとうございました。

コメント

タイトルとURLをコピーしました