`docker-compose build`와`docker build`의 차이점은 무엇입니까?


87

docker-compose build과 의 차이점은 무엇입니까 docker build?

고정 된 프로젝트 경로에 docker-compose.yml파일 이 있다고 가정 합니다.

docker-compose build

docker build

답변:


109

docker-compose고정 표시기의 CLI 래퍼로 간주 할 수있다 (사실은 파이썬에서 또 다른 구현 코멘트 말했다 이득 시간과 피할 500 자 길이의 선 (또한 동시에 여러 컨테이너를 시작)에 순서가). docker-compose.yml매개 변수를 검색하기 위해 라는 파일을 사용합니다 .

여기 에서 docker-compose 파일 형식에 대한 참조를 찾을 수 있습니다 .

따라서 기본적으로을 docker-compose build읽고 문을 docker-compose.yml포함하는 모든 서비스를 찾고 각각에 대해 build:실행합니다 docker build.

각각build:Dockerfile도커에 전달할, 컨텍스트 및 인수를 지정할 수 있습니다 .

예제 docker-compose.yml파일로 마무리하려면 :

version: '3.2'

services:
  database:
    image: mariadb
    restart: always
    volumes:
      - ./.data/sql:/var/lib/mysql

  web:
    build:
      dockerfile: Dockerfile-alpine
      context: ./web
    ports:
      - 8099:80
    depends_on:
      - database 

를 호출 할 때 타겟 docker-compose buildweb빌드 할 이미지가 필요합니다. docker build명령과 같을 것이다 :

docker build -t web_myproject -f Dockerfile-alpine ./web

2
"web_myproject"태그는 어디에서 왔습니까? 아니면 단지 예일 뿐입니 까? docker-compose로 빌드 할 때 모든 이미지 이름을 지정할 수 있습니까?
eyalzba

5
web컨테이너 이름에서 가져옵니다. myproject현재 폴더의 이름입니다. web컨테이너가 포함 된 두 프로젝트에서 작업 할 경우 충돌을 방지 합니다.
hugoShaka


docker-compose.yml위에 제공된 web서비스 이름을 기반으로합니다 .
eigenfield

1
이것은 내 이해이기도하지만 약간의 미묘한 차이가있는 것 같습니다. 예를 들어 파일 레이어 해시는 둘 사이에서 약간 다르게 계산됩니다.
vidstige


9

기본적으로 docker-compose는 docker 명령보다 docker를 사용하는 더 좋은 방법입니다.

여기서 질문이 docker-compose build 명령인지 여부가 여러 이미지를 포함하는 zip 종류를 빌드합니다. 그렇지 않으면 일반적인 Dockerfile과 별도로 빌드되었을 것이므로 생각이 잘못되었습니다.

Docker-compose 빌드는 docker-compose.yml의 개별 서비스 항목으로 이동하여 개별 이미지를 빌드합니다.

도커 이미지, 명령을 사용하면 모든 개별 이미지가 저장되는 것을 볼 수 있습니다.

진정한 마술은 도커 구성입니다.

이것은 기본적으로 호스트 이름과 유사한 컨테이너 이름으로 서로 통신 할 수있는 상호 연결된 컨테이너 네트워크를 생성합니다.


5

첫 번째 답변에 추가 중 ...

서비스 정의 아래에 이미지 이름과 컨테이너 이름을 제공 할 수 있습니다.

예를 들어 아래의 docker-compose 예제에서 'web'이라는 서비스의 경우 이미지 이름과 컨테이너 이름을 명시 적으로 제공하여 docker가 기본값을 사용할 필요가 없도록 할 수 있습니다.

그렇지 않으면 docker가 사용할 이미지 이름은 폴더 (Directory)와 서비스 이름의 연결이됩니다. 예 : myprojectdir_web

따라서 docker build 명령이 실행될 때 생성 될 원하는 이미지 이름을 명시 적으로 입력하는 것이 좋습니다.

예 : 이미지 : mywebserviceImage container_name : my-webServiceImage-Container

docker-compose.yml 파일 예 :

version: '3.2'
services:
  web:
    build:
      dockerfile: Dockerfile-alpine
      context: ./web
    ports:
      - 8099:80
    image: mywebserviceImage
    container_name: my-webServiceImage-Container
    depends_on:
      - database

subdir을의 값으로 지정하면 build:정확한 파일 이름이 Dockerfile. 예를 들어, build: ./web.So 사용은 context:좋은 것입니다!
eigenfield

2

docker build과 의 차이점에 대한 추가 단어가 거의 없습니다 docker-compose build. 둘 다 기존 이미지를 레이어 캐시로 사용하여 이미지를 빌드하는 옵션이 있습니다.

안타깝게도 지금까지이 수준에서 하나가 만든 이미지는 레이어 캐시로 다른 하나와 호환되지 않습니다 ( ID는 호환되지 않음 ). 그러나 docker-compose v1.25.0 (2019-11-18) 은 네이티브 도커 빌더 를 사용 하도록 실험적인 기능인 COMPOSE_DOCKER_CLI_BUILD를 도입했습니다 docker-compose(따라서에서 만든 이미지를 docker build에서 레이어의 캐시로 사용할 수 있음 docker-compose build).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.