web-dev-qa-db-ja.com

元のネットワークでdockerコンテナーに独自のルーティング可能なIPを与えるにはどうすればよいですか?

主な質問

このシナリオを想像してみてください。

  • 192.168.0.0/24のネットワーク。
  • ホスト名が「Docker-Host」のコンピューターは、192.168.0.2でドッキングエンジンを実行しています
  • 「Docker-Host」ではsshdサーバーが実行されています
  • 'Docker-Host'で、ssh:22とhttps:443(GitLab)を使用するコンテナーでアプリケーションを実行しています

このコンテナに192.168.0.3のIPを割り当てるにはどうすればよいですか?

設計されたデフォルトのポートで実行するサービスが必要です


追加情報

SSHを介してGitLabインスタンスと通信する方法の問題が解決されないため、ソリューションとしてリバースプロキシを使用できません。

この状況では、ポート22をホスト上の別のポートにマッピングすることは専門外であり、クライアント開発者はセットアップを望まないでしょう。

これは、このアプリケーションの多くのインスタンスを起動している場合にも維持するのに苦労します。また、各SSHを各コンテナのホスト上の新しいポートにマッピングし続ける必要がありました。

私のクライアントは、クライアント側で追加の構成を行うことなく、以下を解決して実行できる必要があります。

https://GitLab.internal.net.work

ssh git clone https://GitLab.internal.net.work

私はDocker Network Documentionを確認しましたが、誤解しない限り、簡単に保守できる解決策はありません(ただし、Dockerはまだ初めてですが)。

これはどのように行うことができますか?この状況で「ベストプラクティス」として他の人は何をしていますか? (可能な場合は、docker-compose構文の形式で回答してください)。

2
TrevorKS

これは、コンテナスペースでアンチパターンになる傾向があります。コンテナーに外部から直接アクセスする代わりの一般的な解決策の1つは、公開する必要があるIPごとにロードバランサーをセットアップし、そのロードバランサーが既知のポートを一意のポートにマップすることです。クラウドスペースでは、これは多くの場合、異なるIPを持つ複数のVMを割り当てるよりも安価です。


Dockerを使用して、単一のIPアドレスに直接公開できます。例えば。:

docker run -p 192.168.0.3:22:22 sshd

他のSE Q&A で説明されているように、ホストには各IPアドレスが設定されている必要があります。


それでも元のリクエストが必要で、コンテナーを直接公開する場合は、macvlanまたはipvlanネットワークドライバーを使用して、コンテナーに外部から到達可能なIPを与えることができます。 VMであるかのようにコンテナを管理しようとする症状であることが多いので、私はこれを回避する傾向があります。 macvlanのドキュメントは次の場所にあります https://docs.docker.com/network/macvlan/

2
BMitch

コンテナーにIPが必要な場合、最も近いのは bridge networking です。ブリッジにはいくつかのサブタイプがあります。 IBMは、その1つの例 here を持っています。私が説明できるよりも良いです。今彼らがしていることは:

  1. ホスト上にブリッジLinuxを作成します。

    brctl addbr br0 brctl addif br0 enp0s1 brctl setfd br0 0 ifconfig br0 192.168.0.0/24 netmask 255.255.255.0

*永続化するステップを省略しました。

  1. 次に、ブリッジが稼働していることを確認します

    root@docker:~# brctl show br0 bridge name bridge id STP enabled interfaces br0 8000.42570a00bd6d no enp0s1 root@docker:~#

  2. ブリッジネットワークを作成します。

    docker network create --driver=bridge --ip-range=192.168.0.0/24 --subnet=192.168.0.0/24 -o "com.docker.network.bridge.name=br0" br0

**ここでは、--aux-addressを使用して、範囲からIPを除外できます。また、--subnetをより小さなサブセットに制限する必要がありますが、それはすべてあなたのニーズ次第です。

***このデフォルトにすることをお勧めします。それはリンクでも説明されています。

  1. コンテナを開始します。

    docker run -it my/contianer

    • --ipなどのオプションをここで使用できます。 Dockerのヘルプdocker run --help |grep IPが役立つかもしれません。
  2. コンテナが実行されたら、docker inspect <container_name>を使用してIPがあるかどうかを確認し、そのコンテナへの接続をテストする必要があるかどうかなどを確認できます。

お役に立てば幸いです。たまたまご不明な点がある場合や、これが必要なものではない場合や、コンテキストを提供する必要がない場合は、さらに質問してください。

0
wti

私のすべてのプロダクションDockerコンテナーは、このようなセットアップを実行しています。

内部に物理NICを使用してブリッジをセットアップしました(@wti回答のステップ1と2)

Opensvcエージェント( https://repo.opensvc.com )をインストールし、サービス(svcmgr -s mygitlab create

サービス構成(svcmgr -s mygitlab edit config)以下のような構成スニペットを使用

[DEFAULT]
id = 0ce6aa9c-715f-113f-9c32-0fb32df00d49
orchestrate = start

[ip#0]
container_rid = container#0
gateway = 192.168.1.1
ipdev = br0
ipname = 192.168.1.3
netmask = 255.255.255.0
type = netns

[container#0]
type = docker
run_image = gitlab:latest
run_args = -i -t --net=none
        --hostname=gitlab.acme.com
    -v /etc/localtime:/etc/localtime:ro

完了したら、サービスを開始するだけです(svcmgr -s mygitlab start)とステータス(svcmgr -s mygitlab print status

必要に応じて、高可用性セットアップもデプロイします。これにより、最初のノードのダウンタイムが発生した場合に、Dockerサービスが別のノードにフェイルオーバーします。

0
Chaoxiang N