2013-08-04 18 views
12

Sto eseguendo alcuni test iniziali con la finestra mobile. Al momento ho le mie immagini e posso mettere alcuni contenitori in esecuzione, con:Avvia automaticamente i servizi nel contenitore mobile

docker ps 

faccio docker attach container_id e avviare il servizio apache2.

Quindi dalla console principale impongo il contenitore all'immagine.

Dopo l'uscita dal contenitore, se provo ad avviare il contenitore o provo a eseguire un nuovo contenitore dall'immagine impegnata, il servizio viene sempre arrestato.

Come è possibile creare o riavviare un contenitore con i servizi avviati, ad esempio apache?

risposta

25

MODIFICA: Ho imparato molto su Docker poiché in origine postando questa risposta. "Avvio automatico dei servizi nei contenitori Docker" non è un buon modello di utilizzo per Docker. Invece, usa qualcosa come fleet, Kubernetes, o anche Monit/SystemD/Upstart/Init.d/Cron per avviare automaticamente i servizi che vengono eseguiti all'interno dei contenitori Docker.

RISPOSTA ORIGINALE: Se si avvia il contenitore con il comando /bin/bash, allora si può fare questo nel modo descritto qui: https://stackoverflow.com/a/19872810/2971199

Quindi, se si avvia il contenitore con docker run -i -t IMAGE /bin/bash e se si desidera Avvia automaticamente apache2 all'avvio del contenitore, modifica /etc/bash.bashrc nel contenitore e aggiungi /usr/local/apache2/bin/apachectl -f /usr/local/apache2/conf/httpd.conf (o qualunque sia il tuo comando di avvio di apache2) su una nuova riga alla fine del file.

Salvare le modifiche all'immagine e riavviarla con docker run -i -t IMAGE /bin/bash e si troverà apache2 in esecuzione quando si allega.

+0

buon punto /etc/bash.bashrc –

+6

'/ etc/bash.bashrc' verrà eseguito su ogni avvio bash che potrebbe causare problemi se in seguito si desidera interagire con il contenitore (ad esempio eseguendo 'docker exec -ti ID bash') ... Penso che questo non sia il posto giusto dove mettere gli script di avvio per servizi come apache2 –

+0

concordato Petr. Ho saputo di Docker da quando ho postato questa risposta, e mentre funziona, non è affatto come usiamo Docker nella vita reale. – damick

4

Immagino che tu non possa. Quello che puoi fare è creare un'immagine usando un Dockerfile e definire una CMD, che verrà eseguita all'avvio del contenitore. Consultare la documentazione del builder per le nozioni di base (https://docs.docker.com/reference/builder/) e vedere Run a service automatically in a docker container per informazioni su come mantenere attivo il servizio.

Non è necessario automatizzare questo utilizzando un file Docker. È anche possibile creare l'immagine tramite un commit manuale come si fa, ed eseguirlo dalla riga di comando. Quindi, fornisci il comando che deve essere eseguito (che è esattamente ciò che fa effettivamente la CMD Dockerfile). Puoi anche eseguire l'override della CMD Dockerfiles in questo modo: verrà eseguito solo l'ultimo CMD, che è il comando della riga di comando se si avvia il contenitore utilizzando uno. Il comando base docker run -i -t base /bin/bash dalla documentazione è un esempio. Se il tuo comando diventa troppo lungo, potresti ovviamente creare uno script di convenienza.

2

In base alla progettazione, i contenitori sono stati avviati in modalità indipendente quando il processo root utilizzato per eseguire il contenitore è stato chiuso. È necessario avviare un servizio Apache nella modalità FOREGROUND.

docker run -p 8080:80 -d ubuntu/apache apachectl -D FOREGROUND 

Riferimento: https://docs.docker.com/engine/reference/run/#detached-vs-foreground

Problemi correlati