docker compose build 명령어를 사용하여 서비스 빌드하는 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker compose build 명령을 효과적으로 사용하여 Docker Compose 파일에 정의된 서비스를 빌드하는 방법을 배우게 됩니다. 먼저, 다중 컨테이너 애플리케이션을 정의하기 위한 간단한 Docker Compose 파일을 준비하는 것으로 시작합니다.

설정 후, docker compose build 명령을 사용하여 서비스를 빌드합니다. 그런 다음, 해당 Dockerfile 에 변경 사항을 적용한 후 서비스를 다시 빌드하는 방법을 살펴봅니다. 마지막으로, 빌드 인수를 사용하여 서비스를 빌드하고, 깨끗한 빌드를 위해 --no-cache 옵션을 활용하는 방법을 배우게 됩니다.

간단한 Docker Compose 파일 준비

이 단계에서는 다중 컨테이너 Docker 애플리케이션을 정의하고 관리하기 위한 기본적인 Docker Compose 파일을 만드는 방법을 배우게 됩니다. Docker Compose 는 다중 컨테이너 Docker 애플리케이션을 정의하고 실행하기 위한 도구입니다. Compose 를 사용하면 YAML 파일을 사용하여 애플리케이션의 서비스를 구성합니다. 그런 다음, 단일 명령으로 구성에서 모든 서비스를 생성하고 시작합니다.

먼저, Docker Compose 를 설치해 보겠습니다. LabEx 환경에는 미리 설치되어 있지 않으므로 바이너리를 다운로드해야 합니다.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

이 명령은 공식 GitHub 릴리스 페이지에서 Docker Compose 바이너리를 다운로드하여 /usr/local/bin/docker-compose에 저장합니다. $(uname -s)$(uname -m) 부분은 운영 체제와 아키텍처를 자동으로 감지하여 올바른 바이너리를 다운로드합니다.

다음으로, 다운로드한 바이너리에 실행 권한을 부여해야 합니다.

sudo chmod +x /usr/local/bin/docker-compose

이 명령은 docker-compose 명령을 실행 가능하게 만듭니다.

이제 버전을 확인하여 설치를 확인해 보겠습니다.

docker-compose --version

Docker Compose version v2.20.2와 유사한 출력을 볼 수 있으며, Docker Compose 가 올바르게 설치되었음을 확인합니다.

이제 간단한 Docker Compose 파일을 만들어 보겠습니다. nginx 이미지를 사용하는 서비스를 정의할 것입니다.

프로젝트 디렉토리로 이동합니다.

cd ~/project

nano 편집기를 사용하여 docker-compose.yml이라는 새 파일을 만듭니다.

nano docker-compose.yml

다음 내용을 파일에 추가합니다.

version: "3.8"
services:
  web:
    image: nginx:latest
    ports:
      - "80:80"

이 파일을 자세히 살펴보겠습니다.

  • version: '3.8'은 Docker Compose 파일 형식 버전을 지정합니다.
  • services:는 애플리케이션을 구성하는 다양한 서비스를 정의합니다.
  • web:은 서비스의 이름입니다. 원하는 이름을 선택할 수 있습니다.
  • image: nginx:latest는 이 서비스에 사용할 Docker 이미지를 지정합니다. 이 경우, 공식 Nginx 이미지의 최신 버전을 사용하고 있습니다.
  • ports:는 호스트 머신과 컨테이너 간의 포트를 매핑합니다. "80:80"은 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑합니다.

Ctrl + X, Y, Enter를 눌러 파일을 저장합니다.

이제 docker-compose.yml 파일에서 지정한 nginx:latest 이미지를 가져오겠습니다. Docker Compose 는 docker-compose up을 실행할 때 자동으로 이미지를 가져올 수 있지만, 특히 랩 환경에서는 이미지를 미리 명시적으로 가져와서 사용할 수 있도록 하는 것이 좋습니다.

docker pull nginx:latest

이 명령은 Docker Hub 에서 nginx:latest 이미지를 다운로드합니다. 다운로드 진행 상황을 나타내는 출력을 볼 수 있습니다.

docker compose build 를 사용하여 서비스 빌드

이전 단계에서는 기존 Docker 이미지 (nginx) 를 사용하는 간단한 docker-compose.yml 파일을 만들었습니다. Docker Compose 는 Dockerfile에서 이미지를 빌드할 수도 있습니다. 이는 이미지를 사용자 정의하거나 자체 애플리케이션용 이미지를 빌드해야 할 때 유용합니다.

이 단계에서는 미리 빌드된 이미지를 사용하는 대신 Dockerfile에서 이미지를 빌드하도록 docker-compose.yml 파일을 수정합니다.

먼저, ~/project 디렉토리에 간단한 Dockerfile을 만들어 보겠습니다.

nano ~/project/Dockerfile

다음 내용을 Dockerfile에 추가합니다.

FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello, Docker Compose!"]

Dockerfile을 설명해 보겠습니다.

  • FROM ubuntu:latest는 새 이미지의 기본 이미지를 지정합니다. 공식 Ubuntu 이미지의 최신 버전을 사용하고 있습니다.
  • RUN apt-get update && apt-get install -y cowsay는 패키지 목록을 업데이트하고 cowsay 패키지를 설치합니다. cowsay 명령은 소가 그린 말풍선에 메시지를 표시합니다.
  • CMD ["cowsay", "Hello, Docker Compose!"]는 이 이미지에서 컨테이너가 시작될 때 실행될 기본 명령을 설정합니다.

Ctrl + X, Y, Enter를 눌러 Dockerfile을 저장합니다.

이제 이 Dockerfile을 사용하도록 docker-compose.yml 파일을 수정해 보겠습니다. 편집을 위해 파일을 엽니다.

nano ~/project/docker-compose.yml

내용을 다음으로 변경합니다.

version: "3.8"
services:
  cow:
    build: .

이 업데이트된 docker-compose.yml에서:

  • 서비스 이름을 web에서 cow로 변경하여 목적을 더 잘 반영했습니다.
  • image: 지시어를 build: .로 바꿨습니다. build: . 지시어는 Docker Compose 에게 현재 디렉토리 (.) 에 있는 Dockerfile을 사용하여 이 서비스에 대한 이미지를 빌드하도록 지시합니다.

Ctrl + X, Y, Enter를 눌러 docker-compose.yml 파일을 저장합니다.

이제 docker-compose build 명령을 사용하여 cow 서비스에 대한 이미지를 빌드할 수 있습니다. ~/project 디렉토리에 있는지 확인하십시오.

cd ~/project
docker-compose build

이 명령은 docker-compose.yml 파일을 읽고, cow 서비스를 찾고, 현재 디렉토리의 Dockerfile을 기반으로 이미지를 빌드합니다. Ubuntu 기본 이미지 다운로드, 패키지 업데이트, cowsay 설치를 포함한 빌드 프로세스의 단계를 보여주는 출력을 볼 수 있습니다.

빌드가 완료되면 로컬 Docker 이미지를 나열하여 이미지가 생성되었는지 확인할 수 있습니다.

docker images

project_cow와 같은 이름 (Docker Compose 는 디렉토리 이름과 서비스 이름을 기반으로 이미지를 자동으로 명명합니다) 과 latest와 같은 태그가 있는 이미지를 볼 수 있습니다.

Dockerfile 변경 후 서비스 재빌드

이전 단계에서는 Dockerfiledocker-compose build를 사용하여 Docker 이미지를 빌드했습니다. Dockerfile을 변경하면 어떻게 될까요? Docker 는 빌드 프로세스의 속도를 높이기 위해 캐싱 메커니즘을 사용합니다. Dockerfile의 레이어가 변경되지 않은 경우 Docker 는 해당 레이어를 다시 빌드하는 대신 캐시된 버전을 사용합니다. 그러나 레이어 또는 후속 레이어가 변경되면 Docker 는 해당 레이어를 다시 빌드합니다.

이 단계에서는 Dockerfile을 수정하고 이미지를 다시 빌드하여 Docker 가 변경 사항을 처리하는 방식을 살펴보겠습니다.

먼저, cowsay에서 표시되는 메시지를 변경하도록 Dockerfile을 수정해 보겠습니다. 편집을 위해 Dockerfile을 엽니다.

nano ~/project/Dockerfile

CMD 줄을 다음으로 변경합니다.

FROM ubuntu:latest
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "Hello again, Docker Compose!"]

메시지를 "Hello, Docker Compose!"에서 "Hello again, Docker Compose!"로 변경했습니다.

Ctrl + X, Y, Enter를 눌러 Dockerfile을 저장합니다.

이제 docker-compose build 명령을 다시 사용하여 이미지를 다시 빌드해 보겠습니다. ~/project 디렉토리에 있는지 확인하십시오.

cd ~/project
docker-compose build

빌드 프로세스의 출력을 관찰합니다. 처음 두 단계 (FROM ubuntu:latestRUN apt-get update && apt-get install -y cowsay) 는 이전 빌드에서 캐시된 레이어를 사용할 가능성이 높습니다. 그러나 마지막 단계 (CMD ["cowsay", "Hello again, Docker Compose!"]) 는 Dockerfile에서 해당 줄을 변경했기 때문에 다시 빌드됩니다.

빌드가 완료되면 로컬 Docker 이미지를 나열하여 이미지가 업데이트되었는지 확인할 수 있습니다.

docker images

project_cow 이미지는 이제 Dockerfile에서 변경된 사항을 반영해야 합니다. 이미지 ID 가 변경될 수 있지만 이름과 태그는 동일하게 유지됩니다.

변경 사항을 추가로 확인하기 위해 새로 빌드된 이 이미지에서 컨테이너를 실행하고 출력을 볼 수 있습니다.

docker run project_cow

업데이트된 메시지 "Hello again, Docker Compose!"가 포함된 cowsay 출력을 볼 수 있습니다.

빌드 인자와 캐시 없이 서비스 빌드

이 단계에서는 Docker Compose 의 두 가지 고급 빌드 옵션인 빌드 인자 사용과 캐시 없이 빌드하는 방법을 살펴보겠습니다.

빌드 인자를 사용하면 Docker 빌드 프로세스에 변수를 전달할 수 있습니다. 이는 Dockerfile 자체를 변경하지 않고도 다양한 환경 또는 구성에 따라 빌드를 사용자 정의하는 데 유용합니다.

먼저, 빌드 인자를 수락하도록 Dockerfile을 수정해 보겠습니다. 편집을 위해 Dockerfile을 엽니다.

nano ~/project/Dockerfile

내용을 다음으로 변경합니다.

FROM ubuntu:latest
ARG MESSAGE="Hello from build argument!"
RUN apt-get update && apt-get install -y cowsay
CMD ["cowsay", "$MESSAGE"]

MESSAGE라는 빌드 인자를 기본값과 함께 정의하기 위해 ARG MESSAGE 지시어를 추가했습니다. 또한 CMD 지시어를 변경하여 이 인자를 사용하도록 했습니다.

Ctrl + X, Y, Enter를 눌러 Dockerfile을 저장합니다.

이제 이 빌드 인자에 값을 전달하도록 docker-compose.yml 파일을 수정해 보겠습니다. 편집을 위해 파일을 엽니다.

nano ~/project/docker-compose.yml

내용을 다음으로 변경합니다.

version: "3.8"
services:
  cow:
    build:
      context: .
      args:
        MESSAGE: "Custom message from Compose!"

build: 지시어를 context:args:가 있는 객체로 변경했습니다.

  • context: .Dockerfile이 포함된 디렉토리인 빌드 컨텍스트를 지정합니다.
  • args:Dockerfile에 전달할 빌드 인자의 맵입니다. MESSAGE 인자에 값 "Custom message from Compose!"를 전달하고 있습니다.

Ctrl + X, Y, Enter를 눌러 docker-compose.yml 파일을 저장합니다.

이제 빌드 인자를 사용하여 이미지를 빌드해 보겠습니다. ~/project 디렉토리에 있는지 확인하십시오.

cd ~/project
docker-compose build

빌드 출력을 관찰합니다. 빌드 프로세스 중에 빌드 인자가 사용되는 것을 확인할 수 있습니다.

빌드가 완료된 후 이 이미지에서 컨테이너를 실행하여 출력을 확인해 보겠습니다.

docker run project_cow

"Custom message from Compose!" 메시지가 포함된 cowsay 출력을 볼 수 있습니다. 이는 빌드 인자가 성공적으로 전달되고 사용되었음을 확인합니다.

경우에 따라 캐싱 문제를 의심하거나 깨끗한 빌드를 보장하기 위해 Docker 가 모든 레이어를 다시 빌드하도록 강제할 수 있습니다. 이는 docker-compose build 명령과 함께 --no-cache 플래그를 사용하여 수행할 수 있습니다.

--no-cache 플래그를 사용하여 이미지를 다시 빌드해 보겠습니다.

docker-compose build --no-cache

빌드 출력을 다시 관찰합니다. 이번에는 Docker 가 캐시된 레이어를 사용하지 않고 Dockerfile의 모든 단계를 다시 빌드하는 것을 볼 수 있습니다. 이 프로세스는 캐시된 빌드보다 더 오래 걸립니다.

빌드가 완료된 후 컨테이너를 다시 실행하여 메시지가 여전히 빌드 인자를 통해 전달된 것인지 확인할 수 있습니다.

docker run project_cow

여전히 "Custom message from Compose!"를 볼 수 있습니다. --no-cache 플래그는 docker-compose.yml에 정의된 구성이 아닌 빌드 프로세스에만 영향을 미칩니다.

요약

이 랩에서는 Docker Compose 를 설치하고 nginx 이미지를 사용하여 서비스를 정의하는 docker-compose.yml 파일을 생성하여 간단한 Docker Compose 파일을 준비하는 방법을 배웠습니다. 그런 다음 docker compose build 명령을 사용하여 서비스를 빌드하는 연습을 했습니다. 여기에는 Dockerfile 을 수정한 후 서비스 재빌드, 빌드 인자를 사용한 서비스 빌드 및 캐시를 사용하지 않는 빌드가 포함됩니다.