Exemple :
FROM ubuntu
RUN apt-get install service
EXPOSE 8080
CMD [“service”]
Le service “expose” le port 8080.
Ici le port n’est pas “publié” (-p, --publish), il est juste indiqué que le service tourne sur ce port.
EXPOSE
est donc une INSTRUCTION à titre indicatif pour l'utilisateur qui va lancer le conteneur.
Si l’on fait un docker ps après avoir lancé un nginx sans le -p :
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
8d6b89e70fb9 nginx "/docker-entrypoint.…" 2 seconds ago Up 1 second 80/tcp without-port
On voit que le port 80 est exposé mais pas publié.
Si on veut accéder au conteneur depuis l’extérieur (i.e depuis notre machine), il faut bind un port hote → conteneur via la commande -p 80:80 par exemple :
docker run -d --name nginx2 -p 80:80 nginx
S’il n’y a aucun “EXPOSE” dans le Dockerfile, cela va être compliqué pour l’utilisateur de savoir sur quel port écoute l’application. EXPOSE est donc mis à disposition afin de documenter.