118

Przeczytałem i dowiedziałem się o Docker i próbuję poprawnie wybrać konfigurację Django do użycia. Do tej pory nie jest:Docker Compose vs. Dockerfile - co jest lepsze?

Docker Compose lub Dockerfile

Rozumiem, że Dockerfiles są wykorzystywane w Docker Compose, ale nie jestem pewien, czy to jest dobra praktyka, aby umieścić wszystko w jednym dużym Dockerfile z wielokrotności FROM poleceń dla różnych obrazy?

chcę używać kilku różnych obrazów, które zawierają:

uwsgi 
nginx 
postgres 
redis 
rabbitmq 
celery with cron 

Proszę doradzić, co jest najlepsze praktyki w tworzeniu tego typu środowiska, stosując Döcker.

Jeśli to pomaga, jestem na komputerze Mac, więc przy użyciu boot2docker.

Niektóre problemy jakie jadłem:

  1. Docker Compose nie jest kompatybilny z Python3
  2. Chcę containerize mojego projektu, więc jeśli jeden duży Dockerfile nie jest idealny, to czuję, że trzeba złamać go używając Docker Compose
  3. Jestem OK, aby projekt PY2 & Py3 kompatybilne, więc jestem pochylony w kierunku Django komponować
+1

sprawa będzie lepiej sformułowane jako „Czy mogę uruchomić mój aplikacja jako jeden lub wiele kontenerów? "Wydaje się, że to zależy i że należy wziąć pod uwagę kwestie skalowania i separacji problemów (jeden kontener na usługę). Te mogą pomóc: http://stackoverflow.com/questions/30534939/should-i-use-separate-docker-containers-for-my-web-app/30535869#30535869 i https://www.quora.com/ Co jest zaletą posiadania wielu kontenerów Dockera na serwerze, a zamiast tego po prostu uruchamiając jedną aplikację na serwerze? Srid = ttRm –

Odpowiedz

79

T on nie jest.

Docker Compose (określany tutaj jako komponowanie) użyje pliku Dockerfiles, jeśli dodasz polecenie build do projektu docker-compose.yml.

Twoim zadaniem w Dockerze jest zbudowanie odpowiedniego Dockerfile dla każdego obrazu, który chcesz utworzyć, a następnie użycie komponowania do złożenia obrazów za pomocą polecenia build.

Możesz określić ścieżkę do indywidualnych plików Docker za pomocą build /path/to/dockerfiles/blah, gdzie /path/to/dockerfiles/blah jest miejscem zamieszkania blah Dockerfile.

+2

używasz 'docker-compose' w produkcji lub tylko dev? Dzięki za pomoc. –

+8

To zależy od twojego apetytu na ryzyko, używam go do produkcji, ale potem znowu mój budżet jest mały lub nie istnieje. – booyaa

+3

@booyaa Czy mógłbyś to rozwinąć? –

48

Compose plik opisuje pojemnik na w stanie biegu, pozostawiając szczegóły dotyczące sposobu build pojemnik do Dockerfiles. http://deninet.com/blog/1587/docker-scratch-part-4-compose-and-volumes

Podczas definiowania aplikacji z Compose w rozwoju, można użyć tej definicję, aby uruchomić aplikację w różnych środowiskach, takich jak CI, inscenizacji i produkcji. https://docs.docker.com/compose/production/

jest Wydaje się również, że Compose jest uważany produkcja bezpieczna od 1,11, ponieważ https://docs.docker.com/v1.11/compose/production/ nie ma już ostrzeżenie, by nie używać go w produkcji jak https://docs.docker.com/v1.10/compose/production/ robi.

+0

Dziękuję za zgłoszenie problemu. Czy możesz dodać więcej tego, co zostało ustalone dla bezpieczeństwa produkcji na 1.11? –

17

W moim przepływie pracy dodajemy plik Dockerfilm dla każdej części mojego systemu i konfiguruję go tak, aby każda część mogła działać pojedynczo. Następnie dodam docker-compose.yml, aby połączyć je i połączyć.

Największa zaleta (według mnie): kiedy linking the containers, możesz zdefiniować nazwę i wysłać polecenie ping do kontenerów o tej nazwie. Dlatego Twoja baza danych może być dostępna pod nazwą db, a nie według jej adresu IP.

111

Dockerfile

enter image description here

Dockerfile to zwykły plik tekstowy, który zawiera polecenia użytkownik może dzwonić do montażu obrazu.

przykład, Dockerfile

FROM ubuntu:latest 
MAINTAINER john doe 

RUN apt-get update 
RUN apt-get install -y python python-pip wget 
RUN pip install Flask 

ADD hello.py /home/hello.py 

WORKDIR /home 

dokowanym redagowania

enter image description here

dokowanym redagowania

  • to narzędzie do definiowania i uruchamiania aplikacji Docker z wieloma kontenerami.

  • zdefiniuj usługi składające się na aplikację w docker-compose.yml, aby można je było uruchamiać razem w odizolowanym środowisku.

  • uzyskać aplikację działa w jednym poleceniu po prostu działa docker-compose up

Przykład, doker-compose.yml

version: '3' 
services: 
    web: 
    build: . 
    ports: 
    - "5000:5000" 
    volumes: 
    - .:/code 
    - logvolume01:/var/log 
    links: 
    - redis 
    redis: 
    image: redis 
volumes: 
    logvolume01: {} 
+9

@ Odpowiedź brzmi, że pytanie jest źle sformułowane na podstawie braku zrozumienia Docker vs Docker Compose.Zwięzłe wyjaśnienie, w jaki sposób te dwie interakcje są prawdopodobnie najlepszą odpowiedzią, jaką mogę wymyślić. – mpowered