반응형

목차

  1. 도커 이미지 빌드 방식
  2. 도커 이미지 빌드 과정 예시
  3. 이미지 빌드 특징
  4. 도커 이미지 레이어
  5. Dockerfile을 이용한 이미지 빌드 vs 수동 빌드

이전 도커 명령어를 다루는 과정에서 이미지 빌드에 대해 설명한 바 있습니다. 이에 대한 내용을 좀 더 자세히 다뤄보려고 합니다. 실습도 중요하지만, 단순히 타이핑만 하는 것 보다 원리를 알고 사용하면 더 좋으니까 말이죠. 도커 명령어에 대해 자세히 알고 싶으시다면 다음 페이지를 이용하시면 되겠습니다.

 

[Docker] 다양한 Docker관련 명령어와 Dockerfile 작성 팁

목차 명령어와 옵션, 활용 예시 Dockerfile이란? Dockerfile 작성 팁 Dockerfile 작성 예시 도커는 이전 Container 시리즈에서 다룬 적이 있으니 Docker에 대해 알고 싶으시다면 다음 페이지에 접속해 보시는

easyitwanner.tistory.com


도커 이미지 빌드 방식

Dockerfile은 Docker 이미지를 빌드하기 위한 일련의 지침이 포함된 스크립트입니다. Dockerfile을 만드는 방법에는 여러 가지가 있습니다.

  1. Dockerfile 수동 생성
    Vim, Nano 또는 Notepad와 같은 텍스트 편집기를 사용하여 Dockerfile을 수동으로 생성할 수 있습니다. 새 파일을 열고 Dockerfile과 같은 이름을 지정하고 올바른 형식으로 지침을 추가하기만 하면 됩니다.

  2. Dockerfile 생성기 사용
    Dockerfile 생성기와 같은 일부 도구는 운영 체제 유형, 프로그래밍 언어, 버전 및 기타 종속성과 같은 특정 구성 세부 정보를 기반으로 Dockerfile을 자동으로 생성할 수 있습니다.

  3. 기본 이미지 사용
    Docker Hub에서 사용할 수 있는 기존 기본 이미지를 사용하여 Dockerfile을 생성할 수도 있습니다. 기본 이미지는 애플리케이션을 실행하기 위한 최소한의 요구 사항을 포함하는 최소한의 이미지입니다.

  4. 타사 도구 사용
    Docker 이미지를 생성할 수 있는 Packer, Ansible 및 Chef와 같은 여러 타사 도구가 있습니다. 이러한 도구는 Dockerfile 생성을 자동화하고 이미지 구성을 관리할 수도 있습니다.

  5. Dockerfile 템플릿 사용
    Dockerfile 템플릿은 Dockerfile 생성에 대한 구조화된 접근 방식을 제공합니다. Cookiecutter와 같은 도구를 사용하여 표준 지침을 포함하고 사용자 지정을 허용하는 템플릿을 만들 수 있습니다.


Dockerfile을 만드는 데 사용되는 방법에 관계없이 빌드 프로세스 중에 문제를 방지하려면 파일이 올바른 구문과 구조를 따르는지 확인하는 것이 중요합니다.


도커 이미지 빌드 과정 예시
  1. Dockerfile 만들기
    첫 번째 단계는 Docker 이미지를 빌드하기 위한 일련의 지침이 포함된 텍스트 파일인 Dockerfile을 만드는 것입니다. Dockerfile은 무엇보다도 기본 이미지를 지정하고 환경 변수를 설정하며 파일을 이미지에 복사합니다.

  2. 터미널 열기
    로컬 컴퓨터에서 터미널을 열고 Dockerfile이 있는 디렉터리로 이동합니다.

  3. docker build 명령 실행
    Dockerfile에서 이미지를 빌드하려면 적절한 옵션과 함께 docker build 명령을 실행합니다. 예를 들어 docker build -t myimage:1.0 .은 현재 디렉터리의 Dockerfile을 사용하여 myimage:1.0 태그가 지정된 이미지를 빌드합니다.

  4. Docker는 Dockerfile을 읽습니다
    docker build 명령을 실행하면 Docker는 Dockerfile을 한 줄씩 읽고 각 명령을 실행합니다.

  5. 기본 이미지 다운로드
    Dockerfile에 지정된 기본 이미지를 다운로드하여 Docker가 시작됩니다. 이것이 이미지 구축의 출발점입니다.

  6. Dockerfile의 각 명령 실행
    그런 다음 Docker는 패키지 설치 또는 파일 복사와 같은 Dockerfile의 각 명령을 실행합니다.

  7. 새 이미지 만들기
    Dockerfile의 모든 지침이 실행되면 Docker가 새 이미지를 만듭니다.

  8. 새 이미지 저장
    새 이미지는 Docker의 로컬 이미지 레지스트리에 저장됩니다. docker images 명령을 사용하여 로컬 컴퓨터의 모든 이미지 목록을 볼 수 있습니다.

  9. 새 이미지 사용
    이미지가 빌드되면 docker run 명령을 사용하여 컨테이너를 실행하는 데 사용할 수 있습니다. 예를 들어 docker run -d -p 80:80 myimage:1.0은 포트 80에서 myimage:1.0 이미지를 사용하여 컨테이너를 시작합니다.

  10. 이미지를 레지스트리로 푸시(선택 사항)
    이미지를 다른 사람과 공유하려는 경우 Docker 허브 또는 프라이빗 레지스트리와 같은 레지스트리로 이미지를 푸시할 수 있습니다. 이렇게 하면 다른 사람이 이미지를 다운로드하고 사용할 수 있습니다.


전반적으로 docker build 명령은 사용자 정의 Docker 이미지를 생성하기 위한 강력한 도구입니다. 위에서 설명한 단계를 따르면 초보자도 Docker 이미지를 만들고 사용하여 애플리케이션을 배포할 수 있습니다.


이미지 빌드 특징

빌드 프로세스는 도커 클라이언트가 수행하지 않습니다. 그 대신 디렉터리의 전체 콘텐츠가 도커 데몬에 업로드되고 그곳에서 이미지가 빌드됩니다. 또한, 도커 클라이언트와 데몬은 같은 머신에 있을 필요는 없습니다.

 

리눅스가 아닌 OS에서 도커를 사용하는 경우 도커 클라이언트는 호스트 OS에 위치하고, 데몬은 가상머신 내부에서 실행됩니다. 빌드 디렉터리의 모든 파일이 데몬에 업로드돼야 하기 때문에 데몬이 로컬로 실행 중이지 않은 상황에서 큰 파일이 다수 포함되면 업로드 시간이 오래 걸릴 수 있습니다. 빌드 프로세스 동안 이미지가 사용자 컴퓨터에 저장돼 있지 않다면, 도커는 기본 이미지를 퍼블릭 이미지 리포지터리(도커 허브)에서 가져옵니다.


도커 이미지 레이어

Docker 이미지는 기본적으로 특정 시점의 파일 시스템 스냅샷인 여러 레이어로 구성됩니다. 각 레이어는 해당 이미지를 구성하는데 필요한 파일이나 디렉토리, 설정, 라이브러리 등의 정보를 담고 있고, 새 파일 추가 또는 기존 파일 수정과 같이 파일 시스템에 대한 특정 변경 사항을 나타냅니다.

docker build 명령을 사용하여 Docker 이미지를 빌드할 때 Dockerfile의 각 행은 새 레이어를 나타냅니다. 예를 들어 Dockerfile에 패키지를 설치하기 위한 RUN 명령이 포함된 경우 Docker는 해당 패키지가 설치된 새 레이어를 생성합니다. Dockerfile에 RUN 명령이 여러 개 있으면 각각 새 레이어를 만듭니다. 이 때 이전 레이어의 내용은 그대로 유지되고 새로운 레이어에 추가됩니다.

Docker 이미지 레이어의 중요한 기능 중 하나는 변경할 수 없다는 것입니다. 즉, 일단 생성되면 변경할 수 없습니다. 이는 Docker 이미지 작업에 여러 가지 의미가 있습니다.

  • 이미지 간에 레이어 공유 가능
    동일한 기본 이미지에서 여러 이미지를 빌드하는 경우 동일한 레이어를 재사용할 수 있으므로 시간과 디스크 공간을 절약할 수 있습니다.

  • 레이어를 캐시할 수 있음
    레이어는 변경할 수 없기 때문에 Docker는 레이어를 로컬로 캐시하고 변경되지 않은 경우 재사용할 수 있습니다. 이렇게 하면 동일한 레이어를 사용하는 후속 이미지의 빌드 프로세스 속도를 높일 수 있습니다.

  • 레이어 검사 가능
    docker history 명령을 사용하여 Docker 이미지를 구성하는 레이어를 검사할 수 있습니다. 이는 이미지 빌드 방법을 이해하고 문제를 해결하는 데 유용할 수 있습니다.

Docker 이미지는 레이어화된 파일 시스템을 사용하므로 이미지를 효율적으로 저장하고 배포할 수 있습니다. 이미지를 업데이트할 때는 변경된 부분만 새로운 레이어로 추가하므로 이전 레이어는 그대로 유지됩니다. 이를 통해 이미지의 용량이 크게 감소하고 더욱 빠른 배포가 가능해집니다. 각 레이어는 별도의 파일로 저장되며 레이어는 런타임에 결합되어 컨테이너의 최종 파일 시스템을 생성합니다.


하지만 이러한 레이어 구조는 이미지가 커질수록 관리가 어려워지기도 합니다. 각 레이어마다 수정이 필요한 경우 해당 레이어를 수정하거나 새로운 레이어를 추가해야 하기 때문입니다. 따라서 이미지를 설계할 때는 레이어 구조와 관련된 특성을 고려하여 효율적인 구성을 고민해야 합니다.


Dockerfile을 이용한 이미지 빌드 vs 수동 빌드

Dockerfile을 사용하여 이미지를 빌드할 때 Dockerfile에 이미지를 생성하라는 명령을 사용자가 지정하면 Docker가 이를 읽고 실행하여 이미지를 생성하는 선언적 방식입니다. 동일한 Dockerfile을 사용하여 동일한 이미지를 여러 번 생성할 수 있으므로 이 방법은 반복 가능합니다. 또한 Git과 같은 소스 제어 시스템에서 Dockerfile의 변경 사항을 추적할 수 있으므로 이미지 생성 프로세스의 버전 제어가 가능합니다. Dockerfile을 사용하면 조건문 또는 인수를 사용하여 이미지의 차이점을 지정하여 단일 소스에서 여러 이미지를 만들 수 있습니다. 그러나 이 방법을 사용하려면 사용자가 Dockerfile 구문 및 모범 사례에 대한 지식이 있어야 합니다.

반면 수동 빌드는 실행 중인 컨테이너에서 명령을 수동으로 실행한 다음 변경 사항을 커밋하여 이미지를 생성하여 이미지를 생성하는 것입니다. 이 방법을 사용하면 사용자가 특정 종속성 또는 구성을 수동으로 설치할 수 있으므로 이미지 생성을 보다 세밀하게 제어할 수 있습니다. 그러나 이 방법은 이미지 생성 단계가 기록되지 않고 버전 제어가 쉽게 구현되지 않기 때문에 쉽게 반복할 수 없습니다. 또한 더 많은 수동 작업이 필요하며 사용자가 필요한 명령에 익숙하지 않은 경우 오류가 발생하기 쉽습니다.

정리하면, Dockerfile을 사용하여 이미지를 빌드하면 이미지 생성을 위한 반복 가능하고 버전 제어가 가능한 선언적 방법을 제공하는 반면, 수동 빌드는 보다 세밀한 제어가 가능하지만 쉽게 반복할 수 없고 버전 제어가 부족합니다. 초보자의 경우 더 간단하고 표준화된 접근 방식인 Dockerfile을 사용하여 이미지 빌드부터 시작하는 것이 좋습니다.


반응형