ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Mac OS에서 Linux 환경에 구동 가능한 컨테이너 이미지 만들기
    Kubernetes 2024. 8. 15. 10:47
    728x90

    맥북은 기본적으로 macOS를 사용하며, 이와 같은 환경에서 생성된 Docker 이미지를 리눅스 환경에서도 정상적으로 동작하게 만드는 방법을 살펴보겠습니다.

    1. Docker Desktop 사용

    맥북에서 Docker Desktop을 사용하면, Docker는 자동으로 리눅스 컨테이너를 실행할 수 있는 리눅스 기반의 가상 머신(일반적으로 Docker Desktop VM 또는 HyperKit을 통해)을 사용합니다. 이 가상 환경은 리눅스와 동일한 커널을 사용하기 때문에, 맥북에서 생성한 Docker 이미지는 리눅스 머신에서 그대로 사용할 수 있습니다.

    2. 리눅스 기반의 Docker 이미지를 사용

    맥북에서 이미지를 빌드할 때, 반드시 리눅스 기반의 베이스 이미지를 사용해야 합니다. 예를 들어, node:18-alpine, ubuntu, debian 등의 이미지를 사용하는 것이 일반적입니다.

    3. 멀티 아키텍처 지원 확인

    컨테이너 이미지가 여러 아키텍처를 지원해야 하는 경우, Docker의 buildx 기능을 사용하여 멀티 아키텍처 이미지를 빌드할 수 있습니다. 이렇게 하면 ARM 기반의 맥북과 x86_64 기반의 리눅스 모두에서 사용할 수 있는 이미지를 생성할 수 있습니다.

    4. Dockerfile 작성 예시

    다음은 리눅스 기반의 Node.js 애플리케이션을 위한 Dockerfile 예시입니다.

    # Use a lightweight Linux-based Node.js image
    FROM node:18-alpine
    
    # Set the working directory in the container
    WORKDIR /usr/src/app
    
    # Copy package.json and package-lock.json
    COPY package*.json ./
    
    # Install dependencies
    RUN npm install --production
    
    # Copy application code
    COPY . .
    
    # Expose the application port
    EXPOSE 3000
    
    # Start the application
    CMD ["node", "app.js"]

    5. 멀티 아키텍처 빌드 (Optional)

    만약 ARM 기반의 맥북에서 x86_64 리눅스용 이미지를 빌드하려면, docker buildx를 사용할 수 있습니다.

     

    1. buildx 활성화:

    docker buildx create --use

     

    2. 멀티 아키텍처 이미지 빌드:

    docker buildx build --platform linux/amd64,linux/arm64 -t myapp:latest .

    이 명령은 x86_64와 ARM64 아키텍처 모두에서 실행 가능한 이미지를 생성합니다.

     

     

    맥북에서 리눅스 머신에서 동작할 수 있는 Docker 이미지를 생성하려면 리눅스 기반 이미지를 사용하고, 필요시 docker buildx를 사용하여 멀티 아키텍처 이미지를 생성할 수 있습니다. 이렇게 생성된 이미지는 리눅스 환경에서 문제없이 작동합니다.

     


    (참고)

    Q. 멀티 아키텍처 빌드를 하면 빌드 이미지 크기가 커지는건가요?
    멀티 아키텍처 빌드를 한다고 해서 개별 이미지의 크기가 커지지는 않습니다.

     

    멀티 아키텍처 빌드를 사용하면 동일한 Docker 이미지 태그에 여러 아키텍처용 이미지를 포함하게 되지만, 각 아키텍처별 이미지는 서로 독립적으로 저장됩니다. 이는 이미지 크기에 대한 몇 가지 중요한 점을 의미합니다:

    1. 이미지 크기

    • 개별 아키텍처 이미지: 각각의 아키텍처(x86_64, ARM64 등)별로 생성된 이미지는 서로 별개로 저장되며, 각각의 이미지 크기는 해당 아키텍처에 맞게 최적화됩니다.
    • 다중 아키텍처 이미지: docker buildx build로 생성된 멀티 아키텍처 이미지는 사실상 여러 개의 개별 이미지를 묶은 메타데이터입니다. 사용자가 Docker Hub 또는 다른 레지스트리에서 이미지를 풀(pull)할 때, 사용 중인 머신의 아키텍처에 맞는 이미지가 자동으로 선택됩니다.

    2. 레지스트리 저장 방식

    • 멀티 아키텍처 이미지를 Docker Hub 같은 컨테이너 레지스트리에 푸시할 경우, 각 아키텍처에 맞는 이미지는 별도로 저장되며, 사용자는 필요한 아키텍처 이미지(예: linux/amd64, linux/arm64)만 다운로드합니다.
    • 이 방식 덕분에 클라이언트는 필요 없는 아키텍처의 이미지를 다운로드하지 않기 때문에, 실제로 사용하는 시스템에서는 불필요한 공간을 차지하지 않습니다.

    3. 메타데이터 크기

    • 멀티 아키텍처 이미지를 관리하는 메타데이터는 매우 작습니다. 이 메타데이터는 각 아키텍처별 이미지를 어떻게 접근할지 정의하는 정도의 정보만 담고 있습니다.

    4. 실제 이미지 크기

    • 최종적으로 이미지 크기는 빌드된 개별 아키텍처 이미지의 크기와 동일합니다. 여러 아키텍처를 지원한다고 해서 개별 이미지의 크기가 커지지는 않습니다.

    예시

    • 만약 linux/amd64 아키텍처용 이미지가 200MB이고, linux/arm64 아키텍처용 이미지가 210MB라면, 이 두 이미지를 포함하는 멀티 아키텍처 이미지는 개별적으로 200MB와 210MB 크기로 저장됩니다.
    • 클라이언트가 이 이미지를 풀(pull)할 때는 해당 클라이언트의 아키텍처에 맞는 200MB 또는 210MB의 이미지 하나만 다운로드하게 됩니다.

     

    멀티 아키텍처 빌드를 한다고 해서 개별 이미지의 크기가 커지지는 않습니다. 빌드된 각 아키텍처 이미지는 독립적으로 저장되며, 사용자는 필요한 아키텍처에 맞는 이미지만 다운로드하게 됩니다. 이는 디스크 공간을 절약하고, 이미지 전송 시간을 최소화하는 데 도움을 줍니다.

     
    728x90
Designed by Tistory.