docker compose create 명령어를 사용하여 컨테이너 빌드 및 생성 방법

DockerBeginner
지금 연습하기

소개

이 랩에서는 docker compose create 명령어를 효과적으로 사용하여 docker-compose.yml 파일을 기반으로 컨테이너를 빌드하고 생성하는 방법을 배우게 됩니다. 먼저 LabEx 환경에서 Docker Compose 를 설치하는 데 필요한 단계를 포함하여 간단한 docker-compose.yml 파일을 준비하는 것으로 시작합니다.

설정 후, docker compose create의 기본적인 사용법을 살펴보고 다양한 옵션을 자세히 살펴보겠습니다. 여기에는 --force-recreate를 사용하여 컨테이너를 강제로 다시 생성하고, --no-build를 사용하여 이미지를 다시 빌드하지 않고 컨테이너를 생성하며, --pull always를 사용하여 최신 이미지를 가져오는 것이 포함됩니다. 이 랩을 마치면, 멀티 컨테이너 애플리케이션 관리를 위해 docker compose create를 활용하는 방법에 대한 확실한 이해를 갖게 될 것입니다.

간단한 docker-compose.yml 파일 준비

이 단계에서는 간단한 docker-compose.yml 파일을 준비합니다. 시작하기 전에 Docker Compose 를 설치해 보겠습니다. LabEx VM 환경에는 Docker Compose 가 미리 설치되어 있지 않으므로 수동으로 설치해야 합니다. Docker Compose 바이너리를 다운로드하고 실행 가능하게 만들 것입니다.

먼저, curl을 사용하여 Docker Compose 바이너리를 다운로드합니다. 설치된 Docker 버전과 호환되는 버전 1.29.2를 다운로드합니다.

sudo curl -L "https://github.com/docker/compose/releases/download/1.29.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 가 올바르게 설치되었는지 버전을 확인하여 확인해 보겠습니다.

docker-compose --version

docker-compose version 1.29.2, build 5becea4c와 유사한 출력을 볼 수 있습니다. 이는 Docker Compose 가 설치되어 사용할 준비가 되었음을 확인합니다.

이제 ~/project 디렉토리에 간단한 docker-compose.yml 파일을 생성해 보겠습니다. 이 파일은 nginx 이미지를 사용하는 단일 서비스를 정의합니다.

nano ~/project/docker-compose.yml

이 명령어는 nano 텍스트 편집기를 열어 docker-compose.yml 파일을 생성하고 편집합니다. 다음 내용을 편집기에 붙여넣습니다.

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

docker-compose.yml 파일을 자세히 살펴보겠습니다.

  • version: '3.8'은 Docker Compose 파일 형식 버전을 지정합니다.
  • services:는 실행하려는 서비스 (컨테이너) 를 정의합니다.
  • web:은 서비스의 이름입니다. 원하는 이름을 선택할 수 있습니다.
  • image: nginx:latest는 이 서비스에 사용할 Docker 이미지를 지정합니다. 이 경우 공식 Nginx 이미지의 최신 버전을 사용하고 있습니다.
  • ports:는 호스트 머신과 컨테이너 간의 포트를 매핑합니다. "80:80"은 호스트의 포트 80 을 컨테이너의 포트 80 에 매핑합니다. 즉, 웹 브라우저에서 http://localhost(또는 VM 의 IP 주소) 를 방문하여 컨테이너 내에서 실행 중인 Nginx 웹 서버에 액세스할 수 있습니다.

Ctrl + O를 누르고 Enter를 누른 다음, Ctrl + X를 눌러 파일을 저장하고 편집기를 종료합니다.

이제 Nginx 이미지를 사용하여 웹 서비스를 정의하는 간단한 docker-compose.yml 파일을 성공적으로 생성했습니다. 다음 단계에서는 이 파일을 사용하여 컨테이너를 생성하고 관리합니다.

docker compose create 명령어를 사용하여 컨테이너 생성

이 단계에서는 이전 단계에서 준비한 docker-compose.yml 파일을 기반으로 docker-compose create 명령어를 사용하여 컨테이너를 생성합니다. docker-compose create 명령어는 컨테이너를 생성하지만 시작하지는 않습니다. 이는 서비스를 즉시 실행하지 않고 컨테이너 환경을 설정하려는 경우에 유용합니다.

컨테이너를 생성하기 전에 nginx 이미지가 로컬에서 사용 가능한지 확인해 보겠습니다. 그렇지 않은 경우 Docker Compose 는 생성 프로세스 중에 자동으로 이미지를 가져옵니다. 그러나 사용 중인 이미지를 인지하는 것이 좋습니다. docker pull 명령어를 사용하여 수동으로 이미지를 가져올 수 있습니다.

docker pull nginx:latest

이 명령어는 nginx:latest 이미지를 Docker Hub 에서 로컬 머신으로 다운로드합니다. 다운로드 진행 상황과 완료를 나타내는 출력을 볼 수 있습니다.

이제 docker-compose.yml 파일이 포함된 디렉토리로 이동합니다. 이 경우 ~/project 디렉토리입니다.

cd ~/project

이제 docker-compose create 명령어를 실행합니다.

docker-compose create

이 명령어는 현재 디렉토리의 docker-compose.yml 파일을 읽고 정의된 컨테이너를 생성합니다. web 서비스에 대한 컨테이너가 생성되고 있음을 나타내는 출력을 볼 수 있습니다.

명령어가 완료되면 docker ps -a 명령어를 사용하여 생성된 컨테이너의 상태를 확인할 수 있습니다.

docker ps -a

docker ps -a의 출력은 실행되지 않는 컨테이너를 포함한 모든 컨테이너를 표시합니다. project_web_1이라는 컨테이너 (이름은 디렉토리 이름과 서비스 이름을 기반으로 생성됨) 가 Created 상태로 표시되어야 합니다. 이는 컨테이너가 성공적으로 생성되었지만 아직 시작되지 않았음을 확인합니다.

docker-compose create 명령어는 컨테이너를 미리 프로비저닝하는 데 유용합니다. 다음 단계에서는 이러한 컨테이너를 시작하고 관리하는 방법을 살펴보겠습니다.

--force-recreate 옵션으로 컨테이너 강제 재 생성

이 단계에서는 docker-compose create --force-recreate 명령어를 사용하여 컨테이너를 강제로 다시 생성하는 방법을 배웁니다. --force-recreate 플래그는 구성이 변경되지 않은 경우에도 컨테이너를 다시 생성하는 데 사용됩니다. 이는 Docker Compose 가 자동으로 감지하지 못할 수 있는 기본 이미지에 변경 사항을 적용한 후와 같이 컨테이너 인스턴스를 새로 고쳐야 하는 시나리오에서 유용합니다.

먼저, docker-compose.yml 파일이 있는 ~/project 디렉토리에 있는지 확인합니다.

cd ~/project

이제 --force-recreate 플래그와 함께 docker-compose create 명령어를 실행합니다.

docker-compose create --force-recreate

이전 단계에서 이미 컨테이너를 생성했으므로 Docker Compose 는 기존 컨테이너를 감지합니다. --force-recreate 플래그로 인해 기존 컨테이너를 제거하고 동일한 구성으로 새 컨테이너를 생성합니다. 기존 컨테이너가 제거되고 새 컨테이너가 생성되고 있음을 나타내는 출력을 볼 수 있습니다.

docker ps -a를 사용하여 컨테이너의 상태를 다시 확인해 보겠습니다.

docker ps -a

여전히 project_web_1이라는 컨테이너가 Created 상태로 표시되어야 합니다. 이름과 구성은 동일하지만, 이는 --force-recreate 플래그로 인해 생성된 새로운 컨테이너 인스턴스입니다.

--force-recreate 플래그는 docker-compose.yml 파일의 구성이 변경되었는지 여부에 관계없이 컨테이너의 새 인스턴스를 보장해야 할 때 강력한 옵션입니다.

--no-build 옵션으로 빌드 없이 컨테이너 생성

이 단계에서는 docker-compose create --no-build 옵션을 살펴봅니다. 이 플래그는 docker-compose.yml 파일에 Dockerfile 에서 빌드된 서비스 ( build 지시어를 사용) 가 포함되어 있지만 이미지를 다시 빌드하지 않고 컨테이너만 생성하려는 경우에 유용합니다. 현재 docker-compose.yml 파일은 미리 빌드된 이미지 (nginx:latest) 만 사용하므로 --no-build 플래그는 이 특정 경우 이미지 빌드 프로세스에 눈에 띄는 영향을 미치지 않습니다. 그러나 빌드가 필요한 서비스에 대한 향후 사용을 위해 그 목적을 이해하는 것이 중요합니다.

먼저, ~/project 디렉토리에 있는지 확인합니다.

cd ~/project

이제 --no-build 플래그와 함께 docker-compose create 명령어를 실행해 보겠습니다. 이전 단계에서 project_web_1 컨테이너가 이미 존재하므로 새 컨테이너가 생성되도록 --force-recreate 플래그도 사용합니다.

docker-compose create --no-build --force-recreate

docker-compose.ymlbuild 지시어로 정의된 서비스가 있는 시나리오에서 이 명령어를 실행하면 기존 이미지를 사용하여 컨테이너를 생성하거나 (사용 가능한 경우) 이미지를 가져오지만 Dockerfile 에 정의된 이미지 빌드 프로세스는 건너뜁니다. 현재의 경우, 미리 빌드된 이미지를 사용하고 있으므로 출력은 이전 단계와 유사하며, 이전 컨테이너를 제거하고 새 컨테이너를 생성함을 나타냅니다.

컨테이너 상태를 다시 확인해 보겠습니다.

docker ps -a

여전히 project_web_1 컨테이너가 Created 상태로 표시되어야 합니다. --no-build 플래그는 주로 Dockerfile 에서 빌드된 서비스에 영향을 미치며, 컨테이너 생성 중 빌드 프로세스를 방지합니다.

--pull always 옵션으로 컨테이너 생성 및 이미지 다운로드

이 단계에서는 docker-compose create --pull always 명령어를 사용합니다. --pull always 플래그는 로컬에 이미지 복사본이 있는 경우에도 컨테이너를 생성하기 전에 항상 최신 버전의 이미지를 가져오도록 Docker Compose 에 지시합니다. 이는 항상 서비스에 가장 최신 이미지를 사용하도록 보장하는 데 유용합니다.

먼저, ~/project 디렉토리에 있는지 확인합니다.

cd ~/project

이제 --pull always 플래그와 함께 docker-compose create 명령어를 실행합니다. project_web_1 컨테이너가 이미 존재하므로, 잠재적으로 업데이트된 이미지를 기반으로 새 컨테이너를 생성하기 위해 --force-recreate 플래그도 사용합니다.

docker-compose create --pull always --force-recreate

이 명령어를 실행하면 Docker Compose 는 먼저 Docker Hub 에서 nginx:latest 이미지에 대한 업데이트를 확인합니다. 최신 버전이 있는 경우 이를 가져옵니다. 그런 다음 기존 project_web_1 컨테이너를 제거하고 가져온 이미지를 사용하여 새 컨테이너를 생성합니다. 새 이미지를 사용할 수 있는 경우 가져오기 프로세스를 나타내는 출력이 표시된 다음 컨테이너의 제거 및 생성이 표시됩니다.

마지막으로 컨테이너 상태를 확인해 보겠습니다.

docker ps -a

여전히 project_web_1 컨테이너가 Created 상태로 표시됩니다. 여기서 중요한 차이점은 Docker Compose 가 이 컨테이너 인스턴스를 생성하기 전에 최신 이미지를 적극적으로 확인하고 잠재적으로 가져왔다는 것입니다.

--pull always 플래그는 서비스 배포를 최신 이미지 버전으로 최신 상태로 유지하여 최신 기능, 버그 수정 및 보안 업데이트의 이점을 누릴 수 있도록 하는 데 중요합니다.

요약

이 랩에서는 docker compose create 명령어를 사용하여 docker-compose.yml 파일을 기반으로 컨테이너를 빌드하고 생성하는 방법을 배웠습니다. 먼저 Nginx 서비스를 정의하는 간단한 docker-compose.yml 파일을 준비하는 것으로 시작했습니다. 여기에는 바이너리를 다운로드하고 실행 가능하게 만들어 LabEx 환경에 Docker Compose 를 수동으로 설치하는 작업이 포함되었습니다. 그런 다음 설치를 확인했습니다.

준비 후, docker compose create 명령의 다양한 옵션을 살펴보았습니다. 기본 명령어를 사용하여 컨테이너를 생성하는 방법, --force-recreate 플래그를 사용하여 기존 컨테이너를 강제로 다시 생성하는 방법, --no-build 플래그를 사용하여 이미지를 다시 빌드하지 않고 컨테이너를 생성하는 방법, 그리고 --pull always 플래그를 사용하여 생성 전에 최신 이미지를 가져오도록 보장하는 방법을 배웠습니다. 이러한 단계는 컨테이너 수명 주기를 관리하는 데 있어 docker compose create가 제공하는 유연성과 제어 기능을 보여주었습니다.