클라우드

[Docker] Docker 2. 이미지 생성

제익 2025. 4. 8. 18:22
반응형

1. Docker 이미지란?

애플리케이션 실행에 필요한 파일, 설정값을 포함한 패키지로, 이미지를 생성하는 방법은 아래와 같다

1. 도커 허브에 저장된 이미지를 다운받아 사용
2. dockerfile에 이미지 생성에 대한 내용 정의 후 빌드

3. 사용중인 컨테이너 커밋


 

1. 도커 허브에 저장된 이미지 다운 받는 법

말 그대로 도커 허브에 올라간 이미지를 pull 받아 사용하는 방법이다.

도커 허브 url : https://hub.docker.com/

  • 나는 apache/karaf 로 진행
  • pull 완료 화면

 

2. dockerfile로 이미지 빌드하는 법

로컬에 dockerfile을 만들고 이미지 빌드(dockerfile은 확장자 없음)

// 아파치 카라프 도커파일 내용

# 베이스 이미지로 Ubuntu 22.04 사용
FROM ubuntu:22.04

# 빌드 시 사용할 변수 정의
ARG RELEASE
ARG LAUNCHPAD_BUILD_ARCH

# 이미지 메타데이터 설정
LABEL org.opencontainers.image.ref.name=ubuntu
LABEL org.opencontainers.image.version=22.04

# Java 설치 관련 환경 변수 설정
ENV JAVA_HOME=/opt/java/openjdk
ENV PATH=/opt/java/openjdk/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV LANG=en_US.UTF-8 LANGUAGE=en_US:en LC_ALL=en_US.UTF-8

# 필수 패키지 설치 및 로케일 설정
RUN set -eux; \
    apt-get update; \
    DEBIAN_FRONTEND=noninteractive apt-get install -y --no-install-recommends \
    curl \
    wget \
    fontconfig \
    ca-certificates \
    p11-kit \
    tzdata \
    locales; \
    echo "en_US.UTF-8 UTF-8" >> /etc/locale.gen; \
    locale-gen en_US.UTF-8; \
    rm -rf /var/lib/apt/lists/*

# OpenJDK 11 설치
ENV JAVA_VERSION=jdk-11.0.22+7

RUN set -eux; \
    ARCH="$(dpkg --print-architecture)"; \
    case "${ARCH}" in \
    aarch64|arm64) \
        ESUM='46e2bff7d5f419ac7c2fad29e78bfacf49ead4a2de1aba73b6329128f6d1f707'; \
        BINARY_URL='https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jre_aarch64_linux_hotspot_11.0.22_7.tar.gz'; \
        ;; \
    amd64|i386:x86-64) \
        ESUM='3a0fec1b9ef38d6abd86cf11f6001772b086096b6ec2588d2a02f1fa86b2b1de'; \
        BINARY_URL='https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jre_x64_linux_hotspot_11.0.22_7.tar.gz'; \
        ;; \
    armhf|arm) \
        ESUM='a5ab40aa53ecd413a8af738e66855d423e64b5389f876a4825e2cbdb45e9cfb3'; \
        BINARY_URL='https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jre_arm_linux_hotspot_11.0.22_7.tar.gz'; \
        ;; \
    ppc64el|powerpc:common64) \
        ESUM='a6719f71217d0b6f931461acec465ca3a1eb0b0e94942fe165e27b30ecc341c2'; \
        BINARY_URL='https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jre_ppc64le_linux_hotspot_11.0.22_7.tar.gz'; \
        ;; \
    s390x|s390:64-bit) \
        ESUM='1662e73deb814814fe27239666c5bf2d989484821343f0a3629ffb03729044ce'; \
        BINARY_URL='https://github.com/adoptium/temurin11-binaries/releases/download/jdk-11.0.22%2B7/OpenJDK11U-jre_s390x_linux_hotspot_11.0.22_7.tar.gz'; \
        ;; \
    *) echo "Unsupported architecture: ${ARCH}"; exit 1 ;; \
    esac; \
    wget --progress=dot:giga -O /tmp/openjdk.tar.gz ${BINARY_URL}; \
    echo "${ESUM} */tmp/openjdk.tar.gz" | sha256sum -c -; \
    mkdir -p "$JAVA_HOME"; \
    tar --extract --file /tmp/openjdk.tar.gz --directory "$JAVA_HOME" --strip-components 1 --no-same-owner; \
    rm -f /tmp/openjdk.tar.gz; \
    find "$JAVA_HOME/lib" -name '*.so' -exec dirname '{}' ';' | sort -u > /etc/ld.so.conf.d/docker-openjdk.conf; \
    ldconfig; \
    java -Xshare:dump

# 설치 확인
RUN set -eux; \
    echo "Verifying installation..."; \
    java --version; \
    echo "Installation complete."

# Apache Karaf 설치 관련 환경 변수 설정
ENV KARAF_INSTALL_PATH=/opt
ENV KARAF_HOME=/opt/apache-karaf
ENV KARAF_EXEC=exec
ENV PATH=/opt/apache-karaf/bin:$PATH

# Karaf 배포 파일을 빌드 시 변수로 정의
ARG karaf_dist=NOT_SET

# Karaf 배포 파일 추가
ADD ./apache-karaf-4.4.6.tar.gz /opt

# Karaf 설치 경로 심볼릭 링크 설정
RUN set -x && ln -s $KARAF_INSTALL_PATH/apache-karaf* $KARAF_HOME

# 사용될 포트 노출
EXPOSE 1099 44444 8101 8181 9999

# Karaf 실행
CMD ["karaf", "run"]

참고로
"ADD ./apache-karaf-4.4.6.tar.gz /opt"
내용 처럼 해당 위치에 해당 파일이 있어야함

  • 파일 생성 완료되면 도커파일 빌드
    : 도커파일 위치에서 커맨드 실행

 

3. 컨테이너 커밋

이미지를 이용해 컨테이너를 찍어 사용하다보면 여러 설정이 추가되기도 하는데, 그 상태 그대로 다시 이미지로 만들어 사용하는 방법

나는 karaf에 번들 추가 후 이미지로 커밋함

  1. 위에서 만들어 논 카라프 이미지 실행

옵션들
-p : 포트 설정 옵션
-i : 컨테이너 시작하면서 카라프 콘솔 들어가기
--name : 컨테이너 명칭

  • 일단 웹 콘솔 확인할 수 있게 http, webconsole 번들 부터 인스톨

    • 그럼 웹 콘솔로 카라프 접속 가능카라프 접속 가능
    • 그런데 초기 계정 karaf/karaf 설정이 주석 걸려있음..
    • exec으로 컨테이너 쉘 접속해서 설정 추가해야함
    • 유저 설정 파일은
      /opt/apache-karaf-4.4.4/etc/users.properties
      • nano명령어로 파일 열어서 주석 해제
        (nano는 apt update -> apt install nano 후 사용 가능)
      • 맨 밑에 두줄 주석 해제!
      • 완료!
    • 이제 설정끝난 컨테이너를 이미지로 커밋
  • 그럼 해당 설정 완료된 카라프를 컨테이너로 생성해서 쓸수 있다! 포트만 충돌없이 설정하면 몇개든 만들 수 있다.

이전글 : [Docker] Docker 1. 개념과 용어

반응형

'클라우드' 카테고리의 다른 글

[Docker] Docker 1. 개념과 용어  (0) 2025.03.04