web-dev-qa-db-fra.com

Le conteneur Docker se lie au port, mais je ne parviens pas à le cingler

J'ai un conteneur Docker en cours d'exécution (de this image). Le conteneur semble fonctionner correctement pour autant que je puisse voir (les fichiers journaux semblent bons et peuvent se connecter via SSH au conteneur et utiliser SQLPlus à l'intérieur). Cependant, je ne parviens pas à me connecter au conteneur à partir de mon hôte.

J'ai commencé le conteneur comme ceci:

Sudo docker run -d -p 49160:22 -p 49161:1521 -p 49162:8080 alexeiled/docker-Oracle-xe-11g

J'ai inspecté la liaison de port par ceci:

$ Sudo docker port <container> 8080
0.0.0.0:49162

Et quand je fais un Sudo docker inspect <container> J'obtiens entre autres ceci:

"NetworkSettings": {
    "IPAddress": "172.17.0.2",
    "IPPrefixLen": 16,
    "Gateway": "172.17.42.1",
    "Bridge": "docker0",
    "PortMapping": null,
    "Ports": {
        "1521/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49161"
            }
        ],
        "22/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49160"
            }
        ],
        "8080/tcp": [
            {
                "HostIp": "0.0.0.0",
                "HostPort": "49162"
            }
        ]
    }
},

Lorsque j'essaie d'envoyer une requête ping au conteneur, le conteneur répond:

$ ping 172.17.0.2
PING 172.17.0.2 (172.17.0.2) 56(84) bytes of data.
64 bytes from 172.17.0.2: icmp_req=1 ttl=64 time=0.138 ms
64 bytes from 172.17.0.2: icmp_req=2 ttl=64 time=0.132 ms

Mais je ne peux pas me connecter de mon hôte (Windows) au conteneur Docker . J'exécute Docker dans une machine virtuelle Ubuntu 12.04 (dans VirtualBox sous Windows). Je ne sais pas si c'est un problème avec Docker, avec mon Linux VM ou avec VirtualBox. J'ai transmis un tas de ports dans VirtualBox:

enter image description here

Ceci est le résultat de Sudo netstat -tpla:

Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:sunrpc                *:*                     LISTEN      542/rpcbind
tcp        0      0 *:ssh                   *:*                     LISTEN      1661/sshd
tcp        0      0 *:51201                 *:*                     LISTEN      831/rpc.statd
tcp        0     80 docker:ssh              10.0.2.2:62220          ESTABLISHED 1902/sshd: vagrant
tcp6       0      0 [::]:49160              [::]:*                  LISTEN      2388/docker
tcp6       0      0 [::]:49161              [::]:*                  LISTEN      2388/docker
tcp6       0      0 [::]:56105              [::]:*                  LISTEN      831/rpc.statd
tcp6       0      0 [::]:49162              [::]:*                  LISTEN      2388/docker
tcp6       0      0 [::]:sunrpc             [::]:*                  LISTEN      542/rpcbind
tcp6       0      0 [::]:ssh                [::]:*                  LISTEN      1661/sshd

Une idée pourquoi je ne peux pas me connecter de Windows à mon conteneur Docker (en cours d'exécution)?

21
Thomas Uhrig

MISE À JOUR:

Votre configuration me semble correcte, mais je pense que les ports 49160-49162 doit être lié à l'interface IPv4 et non à IPv6. J'ai googlé cela et il semble que vous ayez rencontré un bogue ouvert dans docker:

Je vois deux solutions à votre problème:

  1. désactiver complètement IPv6 sur Ubuntu VM
  2. ou liez directement à l'adresse IPv4: -p 172.17.42.1:49162:8080

Répondez avant de modifier:

Vous ne pouvez pas envoyer de requêtes ping aux ports. Ping utilise le protocole ICMP.

Si vous ne pouvez pas vous connecter au port publié, vous pouvez vérifier si un service spécifique dans le conteneur Docker se lie à l'interface réseau appropriée (par exemple 0.0.0.0) et non à localhost. Vous pouvez vérifier tous les ports d'écoute dans le conteneur: netstat -tpla.

12
Jiri

Lorsque vous exécutez Docker dans Windows, la construction est la suivante

Windows machine [
  Docker Virtual Box VM [ 
    Container1,
    Container2,
    ...
  ]
]

Ainsi, lorsque vous exposez un port dans votre conteneur et le liez à toutes les adresses de la machine hôte, dites à l'aide de -p paramètre, le port est réellement exposé dans la boîte virtuelle docker VM et non sur la machine Windows.

Dites par exemple que vous courez

docker run --name MyContainerWithPortExpose -d -p 127.0.0.1:43306:3306  SomeImage:V1

Exécutez une commande netstat à partir de votre invite de commandes Windows. Étrangement, vous ne verrez pas le localhost:43306 port en mode LISTEN

Maintenant, faites un boot2docker ssh de ton boot2docker console pour se connecter à la boîte virtuelle docker VM Exécutez une commande netstat. Vola ..... vous trouverez localhost:43306 répertorié sur la machine virtuelle de la boîte virtuelle docker

Solution de contournement:

Une fois dans la VM Virtual Box, exécutez une commande ipconfig et recherchez l'adresse IP de la VM. Utilisez cette adresse IP dans la commande run docker, au lieu de 127.0.0.1 L'inconvénient de cette solution est que votre serveur DHCP peut parfois faire des ravages en attribuant des adresses IP différentes chaque fois que vous démarrez boot2docker boîte virtuelle VM.

2
Raghavan Iyer