콘텐츠로 이동






2.packer로 이미지 생성하기

Packer로 이미지 생성하기

  1. 이번에는 Packer로 실제 이미지를 만들어보고, Dockerfile 방식과 어떤 차이가 있는지도 같이 살펴보겠습니다.
  2. Packer의 장점은 이미지 생성 과정에 패키지 설치나 설정 반영 같은 작업을 함께 넣을 수 있다는 점입니다.
    즉, 단순히 이미지만 만드는 것이 아니라, 원하는 상태를 코드로 정의해서 반복 생성할 수 있습니다.

이미지 생성 예제

  1. 아래는 Docker 이미지를 생성하는 간단한 Packer 예시입니다.

    packer {
      required_plugins {
        docker = {
          version = ">= 1.0.0"
          source  = "github.com/hashicorp/docker"
        }
      }
    }
    
    source "docker" "nginx" {
      image  = "ubuntu:22.04"
      commit = true
    }
    
    build {
      sources = ["source.docker.nginx"]
    
      provisioner "shell" {
        inline = [
          "apt-get update",
          "apt-get install -y nginx",
          "echo 'hello packer' > /var/www/html/index.html"
        ]
      }
    }
    
  2. 실행하기

    $ packer init .
    $ packer build .
    

    • 빌드가 끝나면 nginx가 포함된 새로운 Docker 이미지가 생성됩니다.

Dockerfile과 비교

  • Dockerfile 방식은 이미지 생성 자체에 집중합니다.
  • Packer는 이미지 생성 과정에 provisioning 단계를 붙여서 좀 더 자동화된 흐름으로 만들 수 있습니다.
항목 Dockerfile Packer
주 목적 컨테이너 이미지 빌드 이미지 생성 자동화
주 사용 대상 애플리케이션 컨테이너 이미지 VM 이미지, AMI, Docker 이미지 등
빌드 방식 레이어 기반 빌드 builder + provisioner 기반
설정 방식 Dockerfile 한 파일 중심 HCL 또는 JSON 템플릿 중심
장점 단순하고 익숙함, 빌드 속도가 빠름 여러 플랫폼에 동일한 방식 적용 가능, 이미지 생성 과정 자동화에 강함
확장성 컨테이너 중심 컨테이너 + VM + 클라우드 이미지까지 폭넓음
프로비저닝 RUN 명령으로 구성 shell, Ansible 등 다양한 프로비저너 사용 가능
결과물 Docker image Docker image, AMI, VM image 등
재현성 Dockerfile로 비교적 높음 템플릿 기반으로 높음
대표 활용 서비스 컨테이너 빌드 골든 이미지, 표준화된 VM/AMI 생성

이미지 push

  1. 이미지가 만들어졌으면 레지스트리에 등록할 수 있습니다.
  2. Docker 저장소를 사용하는 예시는 아래처럼 구성할 수 있습니다.

    source "docker" "nginx" {
      image  = "ubuntu:22.04"
      commit = true
      changes = [
        "EXPOSE 80"
      ]
    }
    
    build {
      sources = ["source.docker.nginx"]
    
      provisioner "shell" {
        inline = [
          "apt-get update",
          "apt-get install -y nginx",
          "echo 'hello packer' > /var/www/html/index.html"
        ]
      }
    
      post-processors {
        post-processor "docker-tag" {
          repository = "localhost:5000/my-nginx"
          tags       = ["v1"]
        }
      }
    }
    

  3. 이미지를 푸시하는 흐름은 보통 다음과 같습니다.

    1. Packer로 이미지 생성.
    2. 태그 지정.
    3. 레지스트리에 push.
    4. 다른 서버에서 pull 후 실행.
      $ docker push localhost:5000/my-nginx:v1
      

실행하기

  1. 생성된 이미지는 일반 Docker 이미지처럼 실행할 수 있습니다.
    $ docker run -d --name my-nginx -p 8080:80 localhost:5000/my-nginx:v1
    
    • 정상 실행 후 웹브라우저에서 확인하면 Packer로 만든 이미지가 동작하는 것을 볼 수 있습니다.

마무리 하며...

  1. Packer는 이미지 생성 자동화 도구입니다.
  2. Dockerfile보다 넓은 범위의 이미지 제작에 적합합니다.
  3. provisioning과 post-processing을 함께 넣을 수 있어 반복 작업에 강합니다.
  4. 이미지 빌드 후 레지스트리 등록과 실행까지 한 흐름으로 가져갈 수 있습니다.


back
perplexity에서 생성한 AI이미지



작성일: 2026년 7월 23일 ,  마지막 업데이트: 2026년 7월 23일