1

J'ai un projet mis en place avec CircleCI que j'utilise pour auto-deploy to Elastic Beanstalk. Mon environnement EBS est un conteneur unique, évolutif et environnement Web. Je suis en train de lancer un service qui écoute sur le port raw socket 8080.Déploiement de Docker sur AWS Elastic Beanstalk - comment transférer un port vers un hôte? (port binding)

Mon Dockerfile:

FROM golang:1.4.2 

... 

EXPOSE 8080 

Mon Dockerrun.aws.json.template:

{ 
    "AWSEBDockerrunVersion": "1", 
    "Authentication": { 
    "Bucket": "<bucket>", 
    "Key": "<key>" 
    }, 
    "Image": { 
    "Name": "project/hello:<TAG>", 
    "Update": "true" 
    }, 
    "Ports": [ 
    { 
     "ContainerPort": "8080" 
    } 
    ] 
} 

Je me suis assuré de exposer le port 8080 sur le "rôle" assigné à mon environnement de projet.

J'ai utilisé le script de déploiement exact du tutoriel CircleCI ci-dessus (sauf avec les noms changés).

Dans l'instance EC2 qui exécute mon application EBS, je peux voir que le conteneur Docker s'est exécuté avec succès, sauf que Docker n'a pas transmis le port exposé au conteneur hôte. J'ai rencontré ceci dans le passé quand j'ai couru docker run .... sans le drapeau -P.

Voici un exemple de session après-tion SSH dans la machine:

[[email protected] ~]$ sudo docker ps 
CONTAINER ID  IMAGE        COMMAND    CREATED    STATUS    PORTS    NAMES 
a036bb061aea  aws_beanstalk/staging-app:latest "/bin/sh -c 'go run 3 days ago   Up 3 days   8080/tcp   boring_hoover 
[[email protected] ~]$ curl localhost:8080 
curl: (7) Failed to connect to localhost port 8080: Connection refused 

Ce que j'attends de voir est le ->8080 ou quoi que dans le récipient qu'il transmet sur l'hôte.

Quand je fais docker inspect sur mon récipient, je vois aussi que ces deux configurations ne sont pas ce que je veux:

"PortBindings": {}, 
    "PublishAllPorts": false, 

Comment puis-je déclencher un port obligatoire dans ma demande?

Merci d'avance.

Répondre

2

Il s'avère que j'ai fait un malentendu sur la façon dont fonctionne la pile réseau de Docker. Lorsqu'un port est exposé mais non publié, il est toujours disponible pour l'interface réseau locale via l'adresse IP privée du conteneur Docker. Vous pouvez obtenir cette adresse IP en cochant docker inspect <container>. Au lieu de faire curl localhost:8080, je pourrais faire curl <containerIP>:8080. Dans mon déploiement EBS, nginx était automatiquement configuré pour transférer le trafic (HTTP) du port 80 vers ce port privé interne.