Docker-Compose를 사용하여 새 이미지에서 컨테이너 재생성

David Mbochi Njonge 2023년6월20일
  1. 새 프로젝트 만들기
  2. 캐시로 이미지 재구성
  3. 캐시 없이 이미지 재생성
  4. 결론
Docker-Compose를 사용하여 새 이미지에서 컨테이너 재생성

응용 프로그램을 개발할 때 일반적으로 응용 프로그램과 상호 작용하는 다양한 사용자에게 응용 프로그램을 보다 효과적으로 만들기 위해 변경하거나 더 많은 기능을 추가합니다.

Docker로 작업할 때 이미지를 다시 빌드하고 이 이미지에서 새 컨테이너를 실행하여 변경 사항이나 기능이 기본 애플리케이션에 업데이트되도록 해야 합니다. 이 자습서에서는 Docker Compose를 사용하여 새 이미지에서 컨테이너를 다시 만드는 방법을 알려줍니다.

새 프로젝트 만들기

WebStorm IDEA에서 파일 > 새로 만들기 > 프로젝트를 선택하여 새 프로젝트를 만듭니다. 그런 다음 Empty Project를 선택하고 untitled에서 docker-compose-no-cache로 프로젝트 이름을 변경하거나 원하는 이름을 사용하십시오.

만들기라고 표시된 버튼을 눌러 프로젝트를 생성합니다. 현재 폴더 아래에 index.html이라는 파일을 만들고 다음 코드를 복사하여 붙여넣습니다.

<!doctype html>
<html lang="en">
<head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <title>Bootstrap demo</title>
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/css/bootstrap.min.css"
          rel="stylesheet"
          integrity="sha384-Zenh87qX5JnK2Jl0vWa8Ck2rdkQ2Bzep5IDxbcnCeuOxjzrPF/et3URy9Bv1WTRi"
          crossorigin="anonymous">
</head>
<body>
<div class="card">
    <div class="card-header">
        Featured
    </div>
    <div class="card-body">
        <h5 class="card-title">Special title treatment</h5>
        <p class="card-text">With supporting text below as a natural lead-in to additional content.</p>
        <a href="#" class="btn btn-primary">Go somewhere</a>
    </div>
</div>
<script src="https://cdn.jsdelivr.net/npm/bootstrap@5.2.2/dist/js/bootstrap.bundle.min.js"
        integrity="sha384-OERcA2EqjJCMA+/3y+gxIOqMEjwtxJY7qPCqsdltbNJuaOe923+mo//f6V8Qbsw3"
        crossorigin="anonymous"></script>
</body>
</html>

이 파일은 부트스트랩을 사용하여 애플리케이션 이미지에서 컨테이너를 실행할 때 카드를 표시하는 웹 페이지를 만듭니다. 이 페이지를 사용하여 컨테이너가 실행 중인지 확인합니다.

이미지 정의

현재 폴더 아래에 Dockerfile이라는 파일을 만들고 다음 지침을 복사하여 파일에 붙여넣습니다.

FROM nginx:1.22.0-alpine
COPY . /usr/share/nginx/html

FROM - 후속 지침을 사용하여 사용자 정의 이미지를 생성할 기본 이미지를 설정합니다. 이 경우 기본 이미지를 Nginx로 설정하고 Nginx의 경량 버전을 가져오기 위해 alpine을 사용했습니다.
COPY - 현재 디렉토리의 파일과 폴더를 이미지의 파일 시스템 위치로 복사합니다. 이 경우 현재 디렉토리의 모든 파일을 /src/share/nginx/html에 복사했습니다.

파일 작성을 사용하여 컨테이너 정의

현재 폴더 아래에 compose.yaml이라는 파일을 만들고 다음 지침을 복사하여 파일에 붙여넣습니다.

services:
  web-app:
    restart: on-failure
    build: ./
    hostname: web-app-service
    ports:
      - '80:80'

이 파일은 컨테이너의 포트 80에서 수신 대기하도록 호스트의 포트 80을 노출하는 web-app이라는 서비스를 정의합니다. 이 파일은 터미널의 컨테이너보다 컨테이너를 관리하는 더 쉬운 방법을 제공합니다.

이미지 빌드 및 컨테이너 실행

이미지를 빌드하는 것은 이번이 처음이므로 기본 이미지를 가져와서 Dockerfile에 정의된 지침을 사용하여 사용자 지정 이미지를 만드는 데 사용합니다. compose.yaml 파일에 정의된 컨테이너도 생성되어 네트워크에 추가됩니다.

컴퓨터에서 키보드 단축키 ALT+F12를 사용하여 새 터미널 창을 열고 아래 명령을 실행하여 이미지를 빌드하고 여기에서 컨테이너를 실행합니다.

~/WebstormProjects/docker-compose-no-cache$ docker compose up -d

이 명령은 compose.yaml 파일을 실행하여 docker-compose-no-cache_web-app라는 이미지를 빌드하고 docker-compose-no-cache-web-app-1이라는 이름의 컨테이너도 실행합니다. 아래 그림과 같이.

 => CACHED [1/2] FROM docker.io/library/nginx:1.22.0-alpine@sha256:addd3bf05ec3c69ef3e8f0021ce1ca98e0eb21117b97ab8b64127e  0.0s
 => [2/2] COPY . /usr/share/nginx/html                                                                                     0.6s
 => exporting to image                                                                                                     0.8s
 => => exporting layers                                                                                                    0.6s
 => => writing image sha256:d72675b7a3e3a52dd27fe46f298dc30757382d837a5fbf36d8e36d646b5902d6                               0.1s
 => => naming to docker.io/library/docker-compose-no-cache_web-app                                                         0.1s

Use 'docker scan' to run Snyk tests against images to find vulnerabilities and learn how to fix them
[+] Running 2/2
 ⠿ Network docker-compose-no-cache_default      Created                                                                    0.3s
 ⠿ Container docker-compose-no-cache-web-app-1  Started

컨테이너가 실행 중인지 확인하려면 브라우저를 열고 localhost:80(http://localhost/#)에 대한 요청을 발행하십시오. index.html 페이지에서 정의한 카드가 브라우저에 표시됩니다.

동일한 터미널 창을 사용하여 아래 명령을 실행하여 사용자 지정 이미지가 생성되었는지 확인합니다.

~/WebstormProjects/docker-compose-no-cache$ docker image ls

출력:

REPOSITORY                        TAG       IMAGE ID       CREATED         SIZE
docker-compose-no-cache_web-app   latest    d72675b7a3e3   8 minutes ago   23.5MB

캐시로 이미지 재구성

캐시로 기존 이미지를 다시 빌드하고 컨테이너를 실행하려면 먼저 docker compose down 명령을 사용하여 기존 컨테이너를 중지하고 제거해야 합니다.

캐시로 도커 이미지를 다시 빌드한다는 것은 현재 컨테이너를 재사용하여 새 컨테이너를 만드는 것을 의미합니다. 동일한 터미널 창을 사용하여 다음 명령을 실행하여 캐시가 있는 기존 이미지를 다시 빌드합니다.

~/WebstormProjects/docker-compose-no-cache$ docker compose build

이 명령은 기존 이미지를 사용하여 새 이미지를 다시 빌드하고 docker compose up -d를 사용하여 컨테이너를 실행할 수 있습니다.

기존 이미지를 재사용하여 새 컨테이너를 생성하는지 확인하려면 다음 명령을 실행하고 이전 섹션에서 생성한 이미지 외에 다른 이미지가 없음에 유의하십시오.

~/WebstormProjects/docker-compose-no-cache$ docker image ls

출력:

REPOSITORY                        TAG       IMAGE ID       CREATED         SIZE
docker-compose-no-cache_web-app   latest    d72675b7a3e3   8 minutes ago   23.5MB

캐시 없이 이미지 재생성

캐시 없이 이미지를 재구성한다는 것은 이전 이미지를 재사용하지 않고 새 이미지를 생성한다는 의미입니다. docker build 명령을 사용하여 이미지를 빌드할 때 --no-cache 명령을 추가하여 이를 달성할 수 있습니다.

동일한 터미널 창을 사용하여 다음 명령을 실행하여 캐시 없이 이미지를 다시 빌드합니다. docker compose down 명령을 사용하여 실행 중인 컨테이너가 제거되었는지 확인합니다.

~/WebstormProjects/docker-compose-no-cache$ docker compose build --no-cache

이 명령은 이전 이미지가 재사용되지 않음을 의미하는 캐시 없이 새 이미지를 다시 빌드합니다. 이전 이미지가 현재 이미지를 만드는 데 재사용되지 않았는지 확인하려면 다음 명령을 실행하고 이전 이미지에 <none>으로 표시된 이름이 없음에 유의하십시오.

새 이미지는 이전 이미지의 이름을 사용합니다.

~/WebstormProjects/docker-compose-no-cache$ docker image ls

출력:

docker-compose-no-cache_web-app   latest    f111dde0e704   3 seconds ago    23.5MB
<none>                            <none>    1c05a46fe049   13 minutes ago   23.5MB

이전 이미지와 새 이미지는 같은 이름을 가질 수 없으므로 현재 이미지는 이전 이미지의 이름을 사용하고 이전 이미지는 이름이 없음을 표시하기 위해 none으로 표시됩니다.

결론

Docker Compose를 사용하여 새 이미지에서 컨테이너를 다시 만드는 방법을 배웠습니다. 이를 구현하기 위해 캐시가 있는 이미지를 다시 빌드하는 방법과 캐시가 없는 이미지를 다시 빌드하는 방법을 배웠습니다.

David Mbochi Njonge avatar David Mbochi Njonge avatar

David is a back end developer with a major in computer science. He loves to solve problems using technology, learning new things, and making new friends. David is currently a technical writer who enjoys making hard concepts easier for other developers to understand and his work has been published on multiple sites.

LinkedIn GitHub

관련 문장 - Docker Compose