静的IPをDockerコンテナーに割り当てる


205

Dockerコンテナが起動したときに静的IP 172.17.0.1を割り当てようとしています。

このコンテナーのsshポートとしてポート2122を使用して、このコンテナーがポート2122をリッスンするようにします。

sudo docker run -i -t -p 2122:2122 ubuntu

このコマンドは、172.17.0.5のようなランダムなIPでDockerコンテナーを実行しますが、コンテナーに特定のIPを割り当てる必要があります。

次のシェルスクリプトは、高度なネットワーク設定でDockerドキュメントを参照するものです。

pid=$(sudo docker inspect -f '{{.State.Pid}}' <container_name> 2>/dev/null)
sudo rm -rf /var/run/netns/*
sudo ln -s /proc/$pid/ns/net /var/run/netns/$pid
sudo ip link add A type veth peer name B
sudo brctl addif docker0 A
sudo ip link set A up
sudo ip link set B netns $pid
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link delete eth0
sudo ip netns exec $pid ip link set dev B name eth0
sudo ip netns exec $pid ip link set eth0 address 12:34:56:78:9a:bc
sudo ip netns exec $pid ip link set eth0 down
sudo ip netns exec $pid ip link set eth0 up
sudo ip netns exec $pid ip addr add 172.17.0.1/16 dev eth0
sudo ip netns exec $pid ip route add default via 172.17.42.1

このシェルスクリプトは、静的IP 172.17.0.1を割り当て、問題なく世界にリンクします。しかし、ローカルからこのコンテナにSSH接続しようとすると、うまくいきませんでした。私が遭遇した可能性のある問題は何ですか?


その質問に対する単純な答えはないと思います。github.com / docker / docker / issues / 6743およびgithub.com/docker/docker/issues/1179を参照し、github.com / jpetazzo / pipework
user2915097

@larrylo、コンテナー内でsshdを開始したことを確認できますか?
ブライアン

5
dockerデーモンが行うすべてのルーティングを取り消します。コンテナはVMではありません。
user2105103 2015年

はい、私はコンテナ内でsshdを開始できることを確認します
LarryLo

回答:


291

Dockerバージョン1.10.1で簡単に、9e83765をビルドします。

最初に、独自のDockerネットワーク(mynet123)を作成する必要があります

docker network create --subnet=172.18.0.0/16 mynet123

単にイメージを実行するより(ubuntuを例にとります)

docker run --net mynet123 --ip 172.18.0.22 -it ubuntu bash

その後、ubuntuシェルで

ip addr

さらに、あなたは使うことができます

  • --hostname ホスト名を指定するには
  • --add-host / etc / hostsにさらにエントリを追加する

https://docs.docker.com/engine/reference/commandline/network_create/のドキュメント(およびネットワークを作成する必要がある理由)


1
すばらしい答え-情報を追加するだけです:blog.jessfraz.com/post/ips-for-all-the-things
Ole

@cantSleepNow何らかの理由で、システムの起動時にインターフェースファイルで作成された独自のデフォルト作成ブリッジbr0を使用する必要があるだけなので(docker network createを使用して作成されません)、同じ効果を得る方法を教えてください- -ipパラメーター(コンテナーの固定IPアドレスを取得)で、Dockerを使用してブリッジを作成していませんか?
Mohammed Noureldin

@MohammedNoureldin完全に理解できません-また、新しい質問のように聞こえるので、そのように尋ねるべきだと思います。
cantSleepNow 2016年

@cantSleepNowカスタムブリッジを使用していませんが(--ipパラメータは使用できません)、コンテナのIPアドレスを修正する必要があります。これを取得する方法はありますか?
Mohammed Noureldin

@MohammedNoureldinわかりません。私が言ったように、コメントとしてではなく質問としてあなたの質問を投稿してください-多分答えを知っている誰かがいます。
cantSleepNow

89

以下のためにdocker-compose、あなたは以下のものを使用することができますdocker-compose.yml

version: '2'
services:
  nginx:
    image: nginx
    container_name: nginx-container
    networks:
      static-network:
        ipv4_address: 172.20.128.2
networks:
  static-network:
    ipam:
      config:
        - subnet: 172.20.0.0/16
          #docker-compose v3+ do not use ip_range
          ip_range: 172.28.5.0/24

ホストから次を使用してテストできます:

docker-compose up -d
curl 172.20.128.2

モダンdocker-composeは頻繁にIPアドレスを変更しません。

内のすべてのコンテナのIPをdocker-compose1行で検索するには、次のコマンドを使用します。

for s in `docker-compose ps -q`; do echo ip of `docker inspect -f "{{.Name}}" $s` is `docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $s`; done

自動化したい場合は、この例の要点のようなものを使用できます


2
これはdocker-compose v2、v3でのみ機能するようで、互換性がなくなりました。
Andrzej Rehmann 2018年

4
ip_range
docker

ip_rangeは取得できません。それはサブネットでカバーされていませんか?とにかくありがとう!それ私の「私は再び私のmongoコンテナのIPをルックアップする必要があり、」固定-問題
ベン

1
Composeバージョン3でIPアドレスを指定する方法はありますか?
ealeon、

2
解決策はなしで私にとってはうまくいきip_rangeます。バージョン「3.4」を使用しています。
ミハイルモルフィコフ2018年

24

直接的な回答ではありませんが、役立つかもしれません。

私は次のアプローチを使用して、自分の静的IPに関連付けられた私のドッキングされたサービスのほとんどを実行します。

  1. Dockerホスト上のすべてのサービスのIPエイリアスを作成します
  2. 次に、各サービスを実行して、このIPからコンテナーにポートをリダイレクトします。これにより、各サービスには、外部ユーザーや他のコンテナーが使用できる独自の静的IPがあります。

サンプル:

docker run --name dns --restart=always -d -p 172.16.177.20:53:53/udp dns
docker run --name registry --restart=always -d -p 172.16.177.12:80:5000 registry
docker run --name cache --restart=always -d -p 172.16.177.13:80:3142 -v /data/cache:/var/cache/apt-cacher-ng cache
docker run --name mirror --restart=always -d -p 172.16.177.19:80:80 -v /data/mirror:/usr/share/nginx/html:ro mirror
...

ありがとう〜知っています。github.com/brandon-rhodes/fopnp/tree/m/playgroundと同じようにします。やってみます。
LarryLo 2015年

1
これは非常に良い解決策ですが、私はちょうどエイリアシングについて学ぶために、新しいユーザーのために、このリンクを添付しますcyberciti.biz/faq/...を
モハメド・Noureldin

素敵な解決策をありがとう。
RavinderSingh13

4

これは私にとってはうまくいきます。

でネットワークを作成する docker network create --subnet=172.17.0.0/16 selnet

Dockerイメージを実行する docker run --net selnet --ip 172.18.0.2 hub

最初は

docker: Error response from daemon: Invalid address 172.17.0.2: It does not belong to any of this network's subnets.
ERRO[0000] error waiting for container: context canceled

解決策:IPの2番目の4倍を増やしました[.18。.17の代わりに。]


3
2歳年上と類似/同一の答えは、このページ上の他の場所にあります:stackoverflow.com/a/35359185/694469は
KajMagnus

2

正しく機能するためにパブリックIPを認識する必要があるAvahiをドッキングする際に、この問題に遭遇しました。Docker では静的IP割り当てがサポートされていないため、静的IPをコンテナに割り当てるのは難しいです。

この記事では、Debianのコンテナーに静的IPを割り当てる方法について説明します

  1. Dockerサービスはで開始する必要がありDOCKER_OPTS="--bridge=br0 --ip-masq=false --iptables=false"ます。br0ブリッジはすでに構成されていると思います。

  2. コンテナは --cap-add=NET_ADMIN --net=bridge

  3. 次の例のように、内部のコンテナpre-up ip addr flush dev eth0/etc/network/interfaces使用して、Dockerによって割り当てられたIPアドレスを閉じることができます。


auto lo
iface lo inet loopback

auto eth0
iface eth0 inet static
    pre-up ip addr flush dev eth0
    address 192.168.0.249
    netmask 255.255.255.0
    gateway 192.168.0.1
  1. コンテナのエントリスクリプトはで始まる必要があり/etc/init.d/networking startます。また/etc/hosts、Dockerによって割り当てられたIPへの参照を削除するには、エントリスクリプトでファイルを編集または入力する必要があります。

2

実行中にIPを設定できます。

docker run --cap-add=NET_ADMIN -dit imagename /bin/sh -c "/sbin/ip addr add 172.17.0.12 dev eth0; bash"

https://github.com/RvdGijp/mariadb-10.1-galeraで私の例を参照してください


残念ながら、これによりIPアドレスが1つ追加されます。以前にプロセスでIPアドレスが割り当てられていた場合、2つのIPアドレスが割り当てられます
davey

1

名前で他のコンテナのサービスにアクセスできます(ping apacheIPを取得するかcurl http://apache、httpサービスにアクセスします)。これは、静的IPの代わりになる場合があります。


3
1.8のDockerバージョンでは、これは直接動作します。新しいバージョンでは、これらのコンテナーを最初からリンクする必要があります。
Guisong He 2016年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.