Docker를 이용해서 개발 환경 이미지로 굽기
- -
현재 만들고 있는 패키지들은 시스템 설치 패키지에 큰 Dependency를 가지고 있습니다. 디펜던시를 맞춰주는 데만 반나절 이상 소요될 정도이므로, 이 환경 자체를 이미지로 만들어서 이 다음부터는 Docker Container로 접속할 수 있도록 하려고 합니다.
환경 설정
제가 재현하고자 하는 시스템의 상세는 다음과 같습니다.
- Ubuntu 22.04
- gRPC
- rknn-toolkit-lite2
- OpenCV
- CMake
등등...
Dockerfile 만들기
Dockerfile은 도커 이미지를 생성하기 위한 텍스트 파일입니다. 이 파일은 이미지를 어떻게 구축할 지에 대한 정보를 포함하고 있고, 일관된 환경을 재현할 수 있도록 해 줍니다.
Dockerfile을 만드는 데는 크게 두 가지 방식이 있습니다.
- Dockerfile을 이용한 단계별 구축 방식
- 모든 설치 과정과 설정을 명시적으로 기술
- 재현 가능하고 버전 관리가 용이
- 이미지 크기 최적화 가능
- 기존 시스템을 복사하는 방식
- 현재 시스템의 상태를 그대로 이미지화
- 빠르고 간단하게 현재 환경 복제 가능
- '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
이와 같이 재접속합니다.
'장비 사용 설명서' 카테고리의 다른 글
ROS Melodic에서 cvBridge error - ImportError: dynamic module does not define module export function (0) | 2024.10.30 |
---|---|
Nvidia Orin NX에 Jetpack 6.0 설치하기 : default ip is not available 문제 해결 (0) | 2024.07.02 |
YDLiDAR 을 ROS 에서 사용하기 (0) | 2024.02.04 |
Linux 에서 Azuer Kinect 사용하기 (0) | 2024.02.04 |
Realsense RGB-D 카메라 파이썬으로 사용하기 (0) | 2024.02.04 |
소중한 공감 감사합니다