Docker Compose vs. Dockerfile - który lepszy?

Czytam i uczę się o Docker i próbuję poprawnie wybrać konfigurację Django do użycia. Na razie jest albo:

Docker Compose lub Dockerfile

Rozumiem, że {[1] } są używane w Docker Compose, ale nie jestem pewien, czy jest dobrą praktyką umieszczanie wszystkiego w jednym dużym pliku Dokerowym z wieloma poleceniami FROM dla różnych obrazów?

Chcę użyć kilku różnych obrazów, które obejmują:

uwsgi
nginx
postgres
redis
rabbitmq
celery with cron

Proszę doradzić, jakie są najlepsze praktyki w tworzeniu tego typu środowiska przy użyciu Docker .

Jeśli to pomoże, jestem na komputerze Mac, więc używam boot2docker .

Niektóre problemy miałem:

    Docker Compose nie jest kompatybilny z Python3]}
  1. chcę konteneryzować mój projekt, więc jeśli jeden duży plik Dockerfile nie jest to idealne rozwiązanie, więc czuję, że muszę to przerwać używając Docker Compose]}
  2. jestem w porządku, aby projekt Py2 i Py3 były kompatybilne, więc skłaniam się ku django-compose
Author: suci, 2015-04-07

6 answers

Odpowiedź nie jest żadna.

Docker Compose (dalej jako compose) użyje pliku Dockerfile, jeśli dodasz polecenie build do docker-compose.yml twojego projektu.

Obieg pracy Dockera powinien polegać na zbudowaniu odpowiedniego Dockerfile dla każdego obrazu, który chcesz utworzyć, a następnie użyciu compose do złożenia obrazów za pomocą polecenia build.

Możesz określić ścieżkę do poszczególnych plików Dockerfiles używając build /path/to/dockerfiles/blah Gdzie /path/to/dockerfiles/blah jest miejscem, w którym mieszka Dockerfile bla.

 110
Author: booyaa,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-04-07 08:28:57

Dockerfile

Tutaj wpisz opis obrazka

Plik Dockerfile to prosty plik tekstowy, który zawiera polecenia, które użytkownik może wywołać w celu złożenia 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

Docker Compose

Tutaj wpisz opis obrazka

Docker Compose

  • Jest narzędziem do definiowania i uruchamiania aplikacji Docker dla wielu kontenerów.

  • Zdefiniuj usługi, które składają się na Twoją aplikację w docker-compose.yml, aby mogły być prowadzone razem w odizolowanym środowisku.

  • Pobierz aplikację działającą jednym poleceniem, uruchamiając ją docker-compose up

Przykład, docker-compose.yml

version: '3'
services:
  web:
    build: .
    ports:
    - "5000:5000"
    volumes:
    - .:/code
    - logvolume01:/var/log
    links:
    - redis
  redis:
    image: redis
volumes:
  logvolume01: {}
 223
Author: kyo,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-07 14:28:16

Plik Compose opisuje kontener w stanie uruchomionym , pozostawiając szczegóły jak zbudować kontenera do Dockerfiles . http://deninet.com/blog/1587/docker-scratch-part-4-compose-and-volumes

Kiedy zdefiniujesz swoją aplikację z Compose w rozwoju, możesz użyć tego definicja uruchamiania aplikacji w różnych środowiskach, takich jak CI, inscenizacji i produkcji . https://docs.docker.com/compose/production/

Wydaje się również, że komponowanie jest uważane za produkcję bezpieczną od 1.11, ponieważ https://docs.docker.com/v1.11/compose/production/ nie ma już ostrzeżenia, aby nie używać go w produkcji jak https://docs.docker.com/v1.10/compose/production / robi.

 61
Author: Peeter Kokk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-29 08:36:56

W moim obiegu pracy dodaję plik Dockerfile dla każdej części systemu i konfiguruję go tak, aby każda część mogła działać indywidualnie. Następnie dodaję docker-compose.yml, aby je połączyć i połączyć.

Największa zaleta( moim zdaniem): Kiedy połączysz kontenery, możesz zdefiniować nazwę i pingować swoje kontenery o tej nazwie. Dlatego Twoja baza danych może być dostępna pod nazwą db, a nie pod jej adresem IP.

 28
Author: n2o,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-29 08:49:06

Pliki Dockerfiles mają na celu zbudowanie obrazu na przykład z gołej kości ubuntu, możesz dodać mysql o nazwie "mySQL" na jednym obrazie i mywordpress na drugim obrazie o nazwie "mywordpress".

Komponowanie plików YML ma na celu zrobienie tych obrazów i ich spójną analizę. na przykład, jeśli masz w docker-compose.YML file a service call " db" : usługi: db: image: mySQL - - - image that you built.

Oraz serwis o nazwie worpress taki jak:

Wordpress: obraz: mywordpress

Następnie wewnątrz kontenera mywordpress możesz użyć "db", aby połączyć się z kontenerem mySQL. ta magia jest możliwa, ponieważ host Dockera tworzy most netowrk (network overly).

 1
Author: Hugo R,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-08-14 22:29:59

"lepszy" jest względny. Wszystko zależy od twoich potrzeb. Docker compose służy do aranżacji wielu kontenerów. Jeśli te obrazy już istnieją w rejestrze dokera, lepiej jest wymienić je w pliku compose. Jeśli te lub inne obrazy muszą być zbudowane z plików na komputerze, możesz opisać procesy tworzenia tych obrazów w pliku Dockerfile.

Rozumiem, że pliki Dockerfiles są używane w Docker Compose, ale nie jestem pewien, czy jest dobra praktyka, aby umieścić wszystko w jednym dużym pliku Dokerowym z wieloma poleceniami FROM dla różnych obrazów?

Używanie multiple FROM w jednym pliku dokerowym nie jest zbyt dobrym pomysłem, ponieważ istnieje propozycja usunięcia tej funkcji. 13026

Jeśli na przykład chcesz dokerować aplikację, która używa bazy danych i ma pliki aplikacji na twoim komputerze, możesz użyć pliku compose razem z plikiem dockerfile jako follows

Docker-compose.yml

mysql:
  image: mysql:5.7
  volumes:
    - ./db-data:/var/lib/mysql
  environment:
    - "MYSQL_ROOT_PASSWORD=secret"
    - "MYSQL_DATABASE=homestead"
    - "MYSQL_USER=homestead"
  ports:
    - "3307:3306"
app:
  build:
    context: ./path/to/Dockerfile
    dockerfile: Dockerfile
  volumes:
    - ./:/app
  working_dir: /app

Dockerfile

FROM php:7.1-fpm 
RUN apt-get update && apt-get install -y libmcrypt-dev \
  mysql-client libmagickwand-dev --no-install-recommends \
  && pecl install imagick \
  && docker-php-ext-enable imagick \
  && docker-php-ext-install pdo_mysql \
  && curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 1
Author: Akongnwi Devert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-25 11:20:38