새소식

장비 사용 설명서

Docker를 이용해서 개발 환경 이미지로 굽기

  • -

 

현재 만들고 있는 패키지들은 시스템 설치 패키지에 큰 Dependency를 가지고 있습니다. 디펜던시를 맞춰주는 데만 반나절 이상 소요될 정도이므로, 이 환경 자체를 이미지로 만들어서 이 다음부터는 Docker Container로 접속할 수 있도록 하려고 합니다. 

 

환경 설정

제가 재현하고자 하는 시스템의 상세는 다음과 같습니다. 

  • Ubuntu 22.04
  • gRPC
  • rknn-toolkit-lite2
  • OpenCV
  • CMake

등등...

 

Dockerfile 만들기

 

Dockerfile은 도커 이미지를 생성하기 위한 텍스트 파일입니다. 이 파일은 이미지를 어떻게 구축할 지에 대한 정보를 포함하고 있고, 일관된 환경을 재현할 수 있도록 해 줍니다. 

 

Dockerfile을 만드는 데는 크게 두 가지 방식이 있습니다. 

 

  1. Dockerfile을 이용한 단계별 구축 방식
    • 모든 설치 과정과 설정을 명시적으로 기술
    • 재현 가능하고 버전 관리가 용이
    • 이미지 크기 최적화 가능
  2. 기존 시스템을 복사하는 방식
    • 현재 시스템의 상태를 그대로 이미지화
    • 빠르고 간단하게 현재 환경 복제 가능
    • 'docker commit' 명령어 사용

Dockerfile을 이용한 단계별 구축 방식은 더 작고 최적화된 이미지를 만들 수 있지만 모든 단계를 명시해야 한다는 번거로움과 패키지를 새로 컴파일하는 데 시간이 오래 걸린다는 단점이 있고, 시스템 복사 방식은 빠르고 간단하지만 이미지의 크기가 매우 클 수 있으며 불필요한 파일이나 설정도 포함될 수 있다는 단점이 있습니다. 

 

Dockerfile을 이용하여 도커 이미지 만들기

Dockerfile은 Docker 이미지를 생성하기 위한 텍스트 파일입니다. 이 파일을 이용해서 도커 이미지를 어떻게 구축할 것인지에 대한 상세한 사항을 지정할 수 있습니다. 

 

Dockerfile 주요 명령어

  • FROM : 기본 이미지를 지정
  • RUN : 커맨드를 실행
  • COPY 또는 ADD : 파일을 이미지에 추가
  • WORKDIR : 작업 디렉토리 설정
  • ENV : 환경 변수 설정
  • EXPOSE : 포트 노출 
# Ubuntu 22.04 기본 이미지 선택
FROM ubuntu:22.04 as base

# 환경 변수 설정
ENV DEBIAN_FRONTEND=noninteractive
ENV MY_INSTALL_DIR=/root/.local
ENV PATH="$MY_INSTALL_DIR/bin:$PATH"

# 시스템 업데이트 및 기본 도구 설치
RUN apt-get update && apt-get upgrade -y && \
    apt-get install -y \
    sudo \
    wget \
    git \
    build-essential \
    autoconf \
    libtool \
    pkg-config \
    python3-pip \
    libxslt1-dev \
    zlib1g \
    zlib1g-dev \
    libglib2.0-0 \
    libsm6 \
    libgl1-mesa-glx \
    libprotobuf-dev \
    gcc \
    libssl-dev \
    libjpeg-dev \
    libpng-dev \
    libtiff-dev \
    libavcodec-dev \
    libavformat-dev \
    libswscale-dev \
    libv4l-dev \
    libxvidcore-dev \
    libx264-dev \
    libgtk-3-dev \
    libatlas-base-dev \
    gfortran \
    python3-dev 
    
FROM base as builder
RUN mkdir -p /root/libs/rknn
WORKDIR /root/libs/rknn

# CMake 3.19.6 설치
RUN wget https://github.com/Kitware/CMake/releases/download/v3.19.6/cmake-3.19.6.tar.gz && \
    tar -zxvf cmake-3.19.6.tar.gz && \
    cd cmake-3.19.6 && \
    ./bootstrap && \
    make -j$(nproc) && \
    make install && \
    cd .. && \
    rm -rf cmake-3.19.6 cmake-3.19.6.tar.gz
    
# gRPC 설치
RUN cd /root/libs && \
    git clone --recurse-submodules -b v1.64.0 --depth 1 --shallow-submodules https://github.com/grpc/grpc && \
    cd grpc && \
    mkdir -p cmake/build && \
    cd cmake/build && \
    cmake -DgRPC_INSTALL=ON \
          -DgRPC_BUILD_TESTS=OFF \
          -DCMAKE_INSTALL_PREFIX=$MY_INSTALL_DIR \
          ../.. && \
    make -j 4 && \
    make install && \
    cd ../../..

# RKNN 설치
RUN pip3 install protobuf psutil scipy tqdm opencv-python fast-histogram numpy onnx onnxruntime torch


RUN mkdir -p /root/libs/rknn && \
    cd /root/libs/rknn && \
    git clone https://github.com/airockchip/rknn-toolkit2.git && \
    # pip3 install -r rknn-toolkit2/rknn-toolkit2/packages/requirements_cp310-2.1.0.txt && \
    # sed '/tensorflow/d' rknn-toolkit2/rknn-toolkit2/packages/requirements_cp310-2.1.0.txt > requirements_without_tf.txt && \
    # pip3 install -r requirements_without_tf.txt && \
    pip3 install rknn-toolkit2/rknn-toolkit-lite2/packages/rknn_toolkit_lite2-2.1.0-cp310-cp310-linux_aarch64.whl && \
    cp rknn-toolkit2/rknpu2/runtime/Linux/rknn_server/aarch64/usr/bin/rknn_server /usr/bin/ && \
    chmod 777 /usr/bin/rknn_server && \
    cp rknn-toolkit2/rknpu2/runtime/Linux/librknn_api/aarch64/librknnrt.so /usr/lib && \
    chmod 777 /usr/lib/librknnrt.so
    

# OpenCV 4.8.0 설치
RUN mkdir -p /root/libs && \
    cd /root/libs && \
    git clone https://github.com/opencv/opencv.git && \
    git clone https://github.com/opencv/opencv_contrib.git && \
    cd opencv && \
    git checkout 4.8.0 && \
    cd ../opencv_contrib && \
    git checkout 4.8.0 && \
    cd ../opencv && \
    mkdir build && \
    cd build && \
    cmake -D CMAKE_BUILD_TYPE=RELEASE \
        -D CMAKE_INSTALL_PREFIX=/root/libs/opencv_install \
        -D INSTALL_C_EXAMPLES=ON \
        -D INSTALL_PYTHON_EXAMPLES=ON \
        -D OPENCV_GENERATE_PKGCONFIG=ON \
        -D OPENCV_EXTRA_MODULES_PATH=/root/libs/opencv_contrib/modules \
        -D BUILD_EXAMPLES=ON .. && \
    make -j$(nproc) && \
    make install

FROM builder as final

# 코드 COPY 혹은 git clone

# gRPC 포트 
EXPOSE 50051

WORKDIR /root/libs/grpc/examples/cpp/inference_idmap/cmake/build
RUN chmod 755 ./server
ENTRYPOINT ["./server"]

# 기본 쉘 
CMD ["/bin/bash"]

 

이렇게 만든 DockerFile이 위치한 폴더에서, 다음과 같은 커맨드를 실행합니다. 

 

sudo docker build -t my_docker_image:v1 .

 

여기서 . 은 현재 디렉토리를 빌드 컨텍스트로 사용한다는 의미입니다. 소스코드를 도커 이미지에 포함시키려면 DockerFile에서 git clone 혹은 COPY 명령어를 사용해야 합니다. 

 

이미지 빌드가 성공적으로 완료되면 sudo docker images 명령어로 생성된 이미지를 확인할 수 있습니다. 

 

 

Docker Cache 

 

도커는 Dockerfile 명령어마다 레이어를 생성하고, 이전에 빌드된 레이어를 캐시로 사용하게 됩니다. 만약 특정 명령어와 그 이전의 모든 레이어가 변경되지 않았다면 도커는 캐시된 레이어를 사용합니다. 

 

만약 중간에 뭔가를 수정해서 바꿔야 한다면, 

 # 캐시 무효화를 위한 더미 명령어
RUN echo "Cache busting on $(date)"

 

이런 식으로 더미 명령어를 실행해서 이후의 명령어들이 항상 새로 실행될 수 있도록 할 수 있습니다. 

 

Docker run

 

만들어진 이미지로 docker container를 실행하려면 다음과 같은 명령어를 실행합니다. 

sudo docker run -t -i \
    --name inference_server \
  --privileged \
  -v /dev/bus/usb:/dev/bus/usb \
  -p 50051:50051 \
  infboard_server:v2 \
  /bin/bash

 

도커 컨테이너에 재접속하고 싶을 경우 

$ sudo docker start inference_server
$ sudo docker exec -it inference_server /bin/bash

 

이와 같이 재접속합니다. 

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.