J'ai essayé de suivre des didacticiels et de la documentation sur la dockérisation de mon serveur Web, mais j'ai du mal à exécuter le service via la commande docker run.
Voici mon Dockerfile:
FROM ubuntu:trusty
#Update and install stuff
RUN apt-get update
RUN apt-get install -y python-software-properties aptitude screen htop nano nmap nginx
#Add files
ADD src/main/resources/ /usr/share/nginx/html
EXPOSE 80
CMD service nginx start
Je crée mon image:
docker build -t myImage .
Et quand je le lance:
docker run -p 81:80 myImage
il semble que ça s'arrête:
docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
90e54a254efa pms-gui:latest /bin/sh -c service n 3 seconds ago Exit 0 prickly_bohr
Je m'attendrais à ce que cela fonctionne avec le port 81-> 80, mais ce n'est pas le cas. Fonctionnement
docker start 90e
ne semble rien faire.
J'ai aussi essayé de le saisir directement
docker run -t -i -p 81:80 myImage /bin/bash
et à partir d'ici je peux démarrer le service
service nginx start
et d'un autre onglet, je peux voir qu'il fonctionne comme prévu (également dans mon navigateur):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
408237a5e10b myImage:latest /bin/bash 12 seconds ago Up 11 seconds 0.0.0.0:81->80/tcp mad_turing
Je suppose donc que je fais quelque chose de mal avec mon Dockerfile? Quelqu'un pourrait-il m'aider avec cela, je suis tout à fait nouveau à Docker. Merci!
SOLUTION: Sur la base de la réponse d'Ivant, j'ai trouvé une autre façon de démarrer nginx au premier plan. Mon Dockerfile CMD ressemble maintenant à:
CMD /usr/sbin/nginx -g "daemon off;"
À partir de maintenant, l'image officielle de nginx l'utilise pour exécuter nginx (voir le Dockerfile ):
CMD ["nginx", "-g", "daemon off;"]
Dans mon cas, cela a suffi pour qu'il démarre correctement. Il existe des tutoriels en ligne suggérant des moyens plus maladroits pour y parvenir, mais ce qui précède semble assez clair.
Le conteneur Docker s'exécute tant que la commande que vous spécifiez avec CMD
, ENTRTYPOINT
ou via la ligne de commande est en cours d'exécution. Dans votre cas, la commande service
se termine immédiatement et le conteneur entier est arrêté.
Une façon de résoudre ce problème consiste à démarrer nginx directement à partir de la ligne de commande (assurez-vous de ne pas l'exécuter en tant que démon).
Une autre option consiste à créer un petit script qui démarre le service, puis s'endort pour toujours. Quelque chose comme:
#!/bin/bash
service nginx start
while true; do sleep 1d; done
et exécutez ceci au lieu d'exécuter directement la commande service
.
Une troisième option serait d'utiliser quelque chose comme runit ou un programme similaire, au lieu du service normal.
Utilisation de docker-compose:
Pour suivre la solution recommandée, ajoutez à docker-compose.yml:
command: nginx -g "daemon off"
J'ai également trouvé que je pouvais simplement ajouter à nginx.conf:
daemon off;
... et continuez à utiliser dans docker-compose.yml:
command: service nginx start
... bien que cela rendrait le fichier de configuration moins portable en dehors du docker.
Docker comme un très bel index d'images officielles et utilisateur. Lorsque vous voulez faire quelque chose, il y a de fortes chances que quelqu'un l'ait déjà fait;)
Recherchez simplement 'nginx' sur index.docker.io, vous verrez, il y a une image officielle de nginx: https://registry.hub.docker.com/_/nginx/
Là, vous avez un guide complet pour vous aider à démarrer votre serveur Web.
N'hésitez pas à jeter un œil à l'image nginx des autres utilisateurs pour voir les variantes :)
L'idée est de démarrer nginx en mode premier plan.