[docker] Docker Compose vs. Dockerfile-어느 것이 더 낫습니까?

Docker 에 대해 읽고 배우고 있으며 사용할 Django 설정을 올바르게 선택하려고합니다. 지금까지 다음 중 하나가 있습니다.

도커 작성 또는 도커 파일

Dockerfiles에서 사용되는 것을 이해 Docker Compose하지만 FROM다른 이미지에 대해 여러 명령을 사용하여 하나의 큰 Dockerfile에 모든 것을 넣는 것이 좋은지 확실하지 않습니까?

다음과 같은 여러 가지 다른 이미지를 사용하고 싶습니다.

uwsgi
nginx
postgres
redis
rabbitmq
celery with cron

Docker를 사용하여 이러한 유형의 환경을 설정하는 모범 사례에 대해 조언하십시오 .

도움이된다면 Mac에 있으므로 boot2docker 사용 하십시오 .

내가 가진 몇 가지 문제 :

  1. Docker Compose는 Python3과 호환되지 않습니다
  2. 내 프로젝트를 컨테이너화하고 싶기 때문에 하나의 큰 Dockerfile이 이상적이지 않으면 Docker Compose를 사용하여 분해해야한다고 생각합니다.
  3. Py2 및 Py3 프로젝트를 호환 가능하게 만들었으므로 장고 작성에 기대어 있습니다.


답변

대답은 없습니다.

Docker Compose (여기에서 compose라고 함)는 프로젝트에 build 명령을 추가하면 Dockerfile을 사용합니다 docker-compose.yml.

Docker 워크 플로는 만들려는 Dockerfile각 이미지에 적합한 것을 빌드 한 다음 compose를 사용하여 build명령을 사용하여 이미지를 어셈블해야합니다 .

당신은 사용하여 개별 Dockerfiles의 경로를 지정할 수 있습니다 build /path/to/dockerfiles/blah어디 /path/to/dockerfiles/blah어디 어쩌구의입니다 Dockerfile삶.


답변

도커 파일

여기에 이미지 설명을 입력하십시오

Dockerfile은 사용자가 이미지를 어셈블하기 위해 호출 할 수있는 명령이 포함 된 간단한 텍스트 파일입니다.

예, 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 애플리케이션을 정의하고 실행하기위한 도구입니다.

  • docker-compose.yml격리 된 환경에서 함께 실행될 수 있도록 앱을 구성하는 서비스를 정의하십시오 .

  • 그냥 실행하여 하나의 명령으로 앱을 실행하십시오. docker-compose up

예, docker-compose.yml

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


답변

그만큼 작성 파일은 설명 의 실행 상태 컨테이너를 하는 방법에 대한 세부 사항 떠나, 용기를 구축Dockerfiles을 .
http://deninet.com/blog/1587/docker-scratch-part-4-compose-and-volumes

앱을 정의 할 때 개발 중 Compose 때이 정의를 사용 하여 CI, 스테이징 및 프로덕션과 같은 다른 환경
에서 애플리케이션을 실행할 수 있습니다 .
https://docs.docker.com/compose/production/

또한 Compose는 1.11부터 생산 안전으로 간주됩니다https://docs.docker.com/v1.11/compose/production/ 더 이상 https : // docs 와 같은 프로덕션 환경에서 사용하지 말아야한다는 경고가 없으므로 부터 . .docker.com / v1.10 / compose / production / 않습니다.


답변

docker-compose는 docker-cli와 관련하여 많은 명령을 작성해야합니다.

docker-compose를 사용하면 여러 컨테이너를 동시에 쉽게 시작하고 특정 형태의 네트워킹과 함께 자동으로 연결할 수 있습니다.

docker-compose의 목적은 docker cli로 작동하지만 여러 명령을 훨씬 빨리 발행하는 것입니다.

docker-compose를 사용하려면 이전에 실행중인 명령을 docker-compose.yml파일 로 인코딩해야 합니다.

당신은 그것들을 yaml 파일에 붙여 넣기 만하는 것이 아니라 특별한 문법이 있습니다.

일단 생성되면, docker-compose cli에 파일을 공급해야하며 파일을 구문 분석하고 지정한 올바른 구성으로 모든 다른 컨테이너를 작성하는 것은 cli에 달려 있습니다.

예를 들어, 하나는 redis-server두 번째는 node-app있고 다른 것을 사용하여 만든 컨테이너는 별도의 컨테이너를 갖 습니다.Dockerfile 현재 디렉토리에서를 .

또한 해당 컨테이너를 만든 후 컨테이너에서 로컬 시스템으로 일부 포트를 매핑하여 내부에서 실행중인 모든 항목에 액세스합니다.

따라서 docker-compose.yml파일의 경우 첫 번째 줄을 다음과 같이 시작하려고합니다.

version: '3'

Docker docker-compose에게 사용하려는 버전을 알려줍니다 . 그 후에 다음을 추가해야합니다.

version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    build: .

들여 쓰기가 매우 중요합니다. 또한 하나의 서비스에 대해서는 이미지를 잡고 있지만 다른 서비스에 대해서는docker-compose 대해서는 현재 디렉토리 내부를 살펴보고 두 번째 컨테이너에 사용될 이미지를 빌드하도록 지시하고 있습니다.

그런 다음이 컨테이너에서 열려는 다른 모든 포트를 지정하려고합니다.

version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    build: .
    ports:
      -

대시, yaml 파일의 대시는 배열을 지정하는 방법입니다. 이 예제에서는 다음 과 같이 8081로컬 컴퓨터 8081에서 컨테이너 로 매핑 합니다 .

version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    build: .
    ports:
      - "8081:8081"

따라서 첫 번째 포트는 로컬 시스템이고 다른 포트는 컨테이너의 포트입니다. 혼동을 피하기 위해 두 포트를 구별 할 수도 있습니다.

version: '3'
services:
  redis-server:
    image: 'redis'
  node-app:
    build: .
    ports:
      - "4001:8081"

이와 docker-compose.yml같은 파일 을 개발 하면 본질적으로 동일한 네트워크에서 이러한 컨테이너를 생성하고 원하는 방식으로 서로 통신하고 원하는만큼 정보를 교환 할 수있는 무료 액세스 권한을 갖게됩니다.

두 컨테이너를 사용하여 만들 때 docker-compose포트 선언이 필요하지 않습니다.

이제 내 예제에서는 Nodejs 앱에서 다음과 같은 코드 구성을 수행해야합니다.

const express = require('express');
const redis = require('redis');

const app = express();
const client = redis.createClient({
  host: 'redis-server'
});

위의 예제를 사용하여 사용자가 수행해야 할 특정 구성이있을 수 있음을 docker-compose.yml 하여 프로젝트와 관련된 파일 해야 할 수도 있습니다.

이제 Nodejs 앱으로 작업하고 redis를 사용하고 있다면 Nodejs가 사용하는 기본 포트를 알고 있으므로 다음을 추가하겠습니다.

const express = require('express');
const redis = require('redis');

const app = express();
const client = redis.createClient({
  host: 'redis-server',
  port: 6379
});

Docker는 Node 앱이 redis-server해당 연결을 찾고 실행중인 컨테이너로 리디렉션한다는 것을 알 것입니다.

내내 Dockerfile유일한 것은 다음과 같습니다.

FROM node:alpine

WORKDIR '/app'

COPY /package.json ./
RUN npm install
COPY . .

CMD ["npm", "start"]

따라서 docker run myimage파일 내부의 모든 컨테이너 또는 서비스 인스턴스를 만들기 위해 실행하기 전에 대신 실행할 수 있으며 docker-compose upDocker는 현재 작업 디렉토리를 찾고 이미지를 찾기 때문에 이미지를 지정할 필요가 없습니다.docker-compose.yml 거기에 파일.

전에 docker-compose.yml, 우리는 두 개의 별도의 명령을 처리했다 docker build .하고 docker run myimage, 그러나에 docker-compose세계 당신은 당신이 쓰는 이미지를 재 구축하려는 경우 docker-compose up --build. Docker에게 컨테이너를 다시 시작하되 다시 빌드하여 최신 변경 사항을 얻도록 지시합니다.

따라서 docker-compose여러 컨테이너로 작업하기가 더 쉽습니다. 다음에이 컨테이너 그룹을 백그라운드에서 시작해야 할 수 docker-compose up -d있고 중지 할 수 있습니다 docker-compose down.


답변

워크 플로에서 시스템의 각 부분에 대해 Dockerfile을 추가하고 각 부분이 개별적으로 실행될 수 있도록 구성합니다. 그런 다음 docker-compose.yml을 추가하여 연결하고 연결하십시오.

가장 큰 장점은 (내 의견으로는) 컨테이너를 연결할 때 이름을 정의하고 컨테이너를이 이름으로 핑할 수 있습니다. 따라서 이름으로 데이터베이스에 액세스 할 수 있으며 db더 이상 IP로 데이터베이스에 액세스 할 수 없습니다.


답변

“더 나은”은 상대적입니다. 그것은 모두 당신의 요구에 달려 있습니다. Docker compose는 여러 컨테이너를 오케스트레이션하기위한 것입니다. 이 이미지가 이미 docker 레지스트리에 있으면 작성 파일에 이미지를 나열하는 것이 좋습니다. 이러한 이미지 또는 다른 이미지를 컴퓨터의 파일로 작성해야하는 경우 Dockerfile에서 해당 이미지를 빌드하는 프로세스를 설명 할 수 있습니다.

Dockerfiles가 Docker Compose에서 사용된다는 것을 이해하지만 다른 이미지에 대해 여러 FROM 명령을 사용하여 하나의 큰 Dockerfile에 모든 것을 넣는 것이 좋은지 확실하지 않습니까?

단일 dockerfile에서 여러 FROM을 사용하는 것은 기능을 제거하라는 제안이 있기 때문에 좋은 생각이 아닙니다. 13026

예를 들어, 데이터베이스를 사용하고 컴퓨터에 응용 프로그램 파일이있는 응용 프로그램을 고정하려면 다음과 같이 작성 파일을 dockerfile과 함께 사용할 수 있습니다

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

도커 파일

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


답변

Dockerfile과 Docker Compose는 Dockerland에서 서로 다른 두 가지 개념입니다. Docker에 대해 이야기 할 때 가장 먼저 떠오르는 것은 오케스트레이션, OS 레벨 가상화, 이미지, 컨테이너 등입니다. 다음과 같이 각각을 설명하려고합니다.

이미지 :
이미지는 Docker-trusted 레지스트리에 저장된 변경 불가능한 공유 가능 파일입니다. Docker 이미지는 일련의 읽기 전용 레이어로 구성됩니다. 각 레이어는 이미지의 Dockerfile에 제공되는 명령어를 나타냅니다. 이미지는 실행하는 데 필요한 모든 바이너리를 보유합니다.

여기에 이미지 설명을 입력하십시오

컨테이너 :
이미지의 인스턴스를 컨테이너 라고합니다 . 컨테이너는 호스트 OS에서 실행되는 실행 가능한 이미지 바이너리입니다. 실행중인 이미지는 컨테이너입니다.

여기에 이미지 설명을 입력하십시오

Dockerfile :
Dockerfile은 모든 명령 / 빌드 지침을 포함하는 텍스트 문서이며, 사용자는 명령 줄을 호출하여 이미지를 어셈블 할 수 있습니다. 이것은로 저장됩니다 Dockerfile. (소문자 ‘f’에 유의하십시오.)

여기에 이미지 설명을 입력하십시오

Docker-Compose :
Compose는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기위한 도구입니다. Compose를 사용하면 YAML 파일을 사용하여 응용 프로그램 서비스 (컨테이너)를 구성 할 수 있습니다. 그런 다음 단일 명령으로 구성에서 모든 서비스를 작성하고 시작합니다. 작성 파일은로 저장됩니다 docker-compose.yml.