2014-07-11 18 views
14

Chciałbym uruchomić kontener dokera, który obsługuje prostą aplikację internetową, jednak nie rozumiem, jak zaprojektować/uruchomić obraz jako serwer. Na przykład:Jak uruchomić kontener dokowania jako serwer

docker run -d -p 80:80 ubuntu:14.04 /bin/bash 

Spowoduje to uruchomienie i natychmiastowe zamknięcie kontenera. Zamiast tego możemy uruchomić go interaktywnie:

docker run -i -p 80:80 ubuntu:14.04 /bin/bash 

To działa, ale teraz muszę zachować interaktywną powłokę dla każdego uruchomionego kontenera? Wolałbym go uruchomić i uruchomić w tle. Hack byłoby przy użyciu polecenia, które nigdy nie wraca:

docker run -d -p 80:80 {image} tail -F /var/log/kern.log 

Ale teraz nie mogę połączyć się z muszli więcej, aby sprawdzić, co się dzieje, jeśli aplikacja działa w górę.

Czy istnieje sposób na uruchomienie kontenera w tle (tak jak w przypadku vm), w sposób umożliwiający dołączenie/odłączenie powłoki od hosta? A może zupełnie nie rozumiem?

+0

Możesz zamontować folder z komputera hosta do/var/log, aby mieć łatwy dostęp do dzienników kontenera: docker run -d -p 80:80 -v/tmp/log:/var/log {image}/foregroundapp – jchysk

Odpowiedz

19

Ostatnim argumentem dla docker run jest polecenie uruchomienia w kontenerze. Po uruchomieniu docker run -d -p 80:80 ubuntu:14.04 /bin/bash używasz bash w kontenerze i nic więcej. Rzeczywiście chcesz uruchomić swoją aplikację internetową w kontenerze i utrzymać ten kontener przy życiu, więc powinieneś zrobić docker run -d -p 80:80 ubuntu:14.04 /path/to/yourapp.

Ale Twoja aplikacja prawdopodobnie zależy od konfiguracji do uruchomienia. Jeśli odczytuje swoją konfigurację ze zmiennych środowiskowych, można użyć argumentów -e key=value z docker run. Jeśli twoja aplikacja potrzebuje pliku konfiguracyjnego, powinieneś prawdopodobnie użyć Dockerfile, aby najpierw skonfigurować konfigurację.

This article zapewnia ładny pełny przykład uruchamiania aplikacji węzła w kontenerze.

+0

Myślę, że problem polega na tym, że moja aplikacja jest już deamonised (używa standardowego apache2 z ubuntu w kontenerze). – Jeroen

+0

Ahh, więc wystarczy uruchomić apache na pierwszym planie jako polecenie. –

+0

Cóż, mam wszystkie ustawienia zmiennych środowiskowych i mam pewność, że moja aplikacja będzie działać tak, jak opisałeś. Jednak jaki jest sens pliku dockerfile, jeśli muszę ręcznie uruchomić moją aplikację, gdy uruchomiony jest kontener dokowania. Chcę umieścić wszystkie kroki w pliku dokera i tylko to, co użytkownik mojego obrazu musi zrobić, to go uruchomić. –

7

Użytkownicy okna dokowanego mają tendencję do przyjmowania kontenera jako kompletnej maszyny wirtualnej, podczas gdy koncepcja projektu dockera bardziej koncentruje się na optymalizacji kontenerów niż naśladowaniu maszyny wirtualnej w kontenerze.

Obie są poprawne, ale niektóre szczegóły implementacji nie są łatwe do zrozumienia na początku. Próbuję podsumować niektóre różnice implementacyjne w sposób łatwiejszy do zrozumienia.

  1. SSH

SSH byłoby najbardziej prosta droga wewnątrz Linux VM (lub pojemnik), jednak wiele dockerized szablony nie został zainstalowany serwer SSH. Uważam, że dzieje się tak z powodu optymalizacji przyczyn bezpieczeństwa kontenera.

  1. doker dołączyć

doker dołączyć może być przydatny, jeśli pracuje jako out-of-the-box. Jednak od momentu napisania nie jest stabilny - https://github.com/docker/docker/issues/8521. Może być związany z konfiguracją SSH, ale nie jest pewien, kiedy jest całkowicie naprawiony.

  1. dokowane zalecanych praktyk (nsenter i etc)

Niektóre alternatywy (lub najlepsze praktyki w pewnym sensie) zalecaną przez Döcker na https://blog.docker.com/2014/06/why-you-dont-need-to-run-sshd-in-docker/

Praktyka ta w zasadzie oddziela wyjmuje zmienne elementy z kontenera i odwzorowuje je w niektórych miejscach hosta dokera, aby można było manipulować nimi z zewnątrz kontenera i/lub utrzymywać go. Może to być dobra praktyka w środowisku produkcyjnym, ale nie teraz, gdy więcej projektów związanych z dokiem jest wokół środowiska deweloperskiego.

    Linia komend
  1. atakujących

„dokowanym Exec -it {ID pojemnik} atakujących” chmura jest bardzo wygodny i praktyczny narzędzie dostać się do urządzenia.

  1. Pewne podstawy

    • "run doker" tworzy nowy pojemnik nie zostanie zapisany więc wcześniejsze zmiany.
    • "Rozpocznij dokowanie" spowoduje uruchomienie istniejącego kontenera, więc poprzednie zmiany nadal będą znajdować się w kontenerze, ale musisz znaleźć prawidłowy identyfikator kontenera wśród wielu o tym samym identyfikatorze obrazu. Musisz "zatwierdzić docker", aby pominąć wersje, jeśli chcesz.
    • Ctrl-C zatrzyma kontener przy wychodzeniu. Na końcu chcesz wstawić "&", aby kontener mógł działać w tle i wyświetlał monit po naciśnięciu klawisza Enter.
4

do pierwotnego pytania, można ogon jakiś plik, tak jak wspomniałeś, aby utrzymać funkcjonowanie procesu.

Aby dotrzeć do powłoki, zamiast "przyczepić", masz dwie opcje:

  1. docker exec -it <container_id> /bin/bash

Albo

  1. prowadzony przez ssh demon w kontenerze port zamapuj ssh, a następnie ssh do kontenera.
+0

to nie jest to, co chcę zrobić. Pewnie mogę zalogować się do kontenera i uruchomić mój serwer ... ale to nie jest mój cel. Kontener musi wystartować z moim serwerem działającym bez dodatkowych kroków. Nie chcę się logować do kontenera za każdym razem, gdy jest uruchamiany i uruchamiać mój serwer. To powinno być zautomatyzowane. –

+0

@StanSokolov wygląda na niezrozumiałego.Serwer jest uruchamiany z kontenerem jako demonem. Później, jeśli chcesz się zalogować do powłoki, masz dwie powyższe opcje. –

+0

masz rację. Przepraszam, mój błąd. –

Powiązane problemy