web-dev-qa-db-fra.com

Comment faire un conteneur Docker sa propre adresse IP routable sur le réseau d'origine?

Question principale

Imaginez ce scénario.

  • Un réseau de 192.168.0.0/24.
  • Un ordinateur avec nom d'hôte 'Docker-Host' exécute un moteur Docker à 192.168.0.2
  • 'Docker-Host' a SSHD Server en cours d'exécution
  • Sur 'Docker-Host', je suis une application dans un conteneur qui utilise ssh: 22 et https: 443 (gitlab)

Comment assignez-moi ce conteneur une adresse IP de 192.168.0.3?

J'ai besoin de services pour exécuter sur leurs ports par défaut conçus.


Information additionnelle

Je ne peux pas utiliser de proxy inverse comme solution car cela ne résout pas le problème de la manière de communiquer avec l'instance Gitlab sur SSH.

Cartographie du port 22 sur un port différent de l'hôte est peu professionnelle dans cette situation et mes développeurs de clients n'aimeraient pas la configuration.

Cela constituerait également une lutte pour maintenir si je tournais de nombreuses instances de cette application. et devait garder la cartographie chaque SSH à un nouveau port de l'hôte pour chaque conteneur.

Mes clients doivent être capables de résoudre et d'exécuter ce qui suit sans côté de la clientèle de configuration supplémentaire.

https://gitlab.internal.net.work

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

J'ai examiné la documentation du réseau Docker, et sauf erreur, je ne vois pas une solution facile à maintenir (bien que je suis toujours nouveau à Docker).

Comment cela peut-il être fait? Quelles sont les autres personnes qui font dans cette situation comme "meilleure pratique"? (Si possible, donnez des réponses sous forme de syntaxe Docker-Compose).

3
TrevorKS

Cela a tendance à être un anti-motif dans l'espace de conteneur. Une solution commune au lieu d'accéder directement au conteneur directement, consiste à configurer un équilibreur de charge par IP que vous devez exposer et que l'équilibreur de charge correspond à un port bien connu au port unique. Dans l'espace nuage, cela est souvent moins cher que d'attribuer plusieurs VM avec des IP différentes.


Vous pouvez publier directement sur une seule adresse IP avec Docker. par exemple.:

docker run -p 192.168.0.3:22:22 sshd

Cela nécessite que l'hôte ait chacune des adresses IP configurées qui ont été décrites dans autres Q & A .


Si vous avez toujours besoin de la demande d'origine, exposez directement le conteneur, vous pouvez utiliser des pilotes de réseau MACVLAN ou IPvlan pour donner au conteneur une adresse IP à l'extérieur de l'extérieur. J'ai tendance à éviter cela puisqu'il est souvent le symptôme d'essayer de gérer un conteneur comme s'il s'agit d'un VM. La documentation sur Macvlan est à: https://docs.docker.com/network/macvlan/

2
BMitch

Pour un cas où vous avez besoin d'IPS sur les conteneurs, la chose la plus proche est réseau de pont , il y a quelques sous-types de pont. IBM a et exemple de l'un d'entre eux ici . C'est mieux que ce que je pouvais expliquer. Maintenant ce qu'ils font est:

  1. Créez un pont Linux sur l'hôte.

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

* Omi l'étape pour la persister.

  1. Ensuite, vérifiez que le pont est en place

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

  2. Créez le réseau ponté:

    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

** Ici vous pouvez utiliser --aux-address Pour exclure les IP de la gamme. Vous devriez également limiter le --subnet à un sous-ensemble plus petit, mais tout est à vos besoins.

*** Vous voudrez peut-être faire cette valeur par défaut. Cela est également expliqué dans le lien.

  1. Commencez votre conteneur:

    docker run -it my/contianer

    • Options comme --ip Et d'autres peuvent être utilisés ici. Docker aide docker run --help |grep IP pourrait être d'une aide d'une aide ici.
  2. Une fois que le conteneur est en cours d'exécution, vous pouvez utiliser docker inspect <container_name> Pour savoir si vous avez la propriété intellectuelle, puis devez tester la connectivité à ce conteneur, etc.

J'espère que cela vous aidera, s'il vous plaît demander plus loin si vous avez des questions ou si ce n'est pas ce que vous voulez/besoin de fournir un contexte.

0
wti

Tous mes conteneurs de docker de production sont en cours d'exécution.

Je configurais un pont avec ma carte réseau physique à l'intérieur (étapes 1 et 2 dans @wti Réponse)

J'installe OpenSVC Agent ( https://repo.opensvc.com ), créez un service (svcmgr -s mygitlab create)

Je remplit la configuration du service (svcmgr -s mygitlab edit config) avec un extrait de configure comme ci-dessous

[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

Une fois terminé, commencez simplement le service (svcmgr -s mygitlab start) et vérifier le statut (svcmgr -s mygitlab print status)

Si nécessaire, je déploie également une configuration de haute disponibilité, qui rend le basculement du service Docker à un autre nœud en cas de temps d'arrêt du premier nœud.

0
Chaoxiang N