Home Docker 실습
Post
Cancel

Docker 실습

Docker 설치

다운로드 url: https://www.docker.com/products/docker-desktop/

실습

ultralytics/ultralytics

QuickStart url: https://docs.ultralytics.com/quickstart/#conda-docker-image

  • Dockerfile: GPU image recommended for training.
  • Dockerfile-arm64: Optimized for ARM64 architecture, allowing deployment on devices like Raspberry Pi and other ARM64-based platforms.
  • Dockerfile-cpu: Ubuntu-based CPU-only version suitable for inference and environments without GPUs.
  • Dockerfile-jetson: Tailored for NVIDIA Jetson devices, integrating GPU support optimized for these platforms.
  • Dockerfile-python: Minimal image with just Python and necessary dependencies, ideal for lightweight applications and development.
  • Dockerfile-conda: Based on Miniconda3 with conda installation of ultralytics package.
1
2
3
4
5
6
7
8
# Set image name as a variable
t=ultralytics/ultralytics:latest

# Pull the latest ultralytics image from Docker Hub
sudo docker pull $t

# Run the ultralytics image in a container with GPU support
`docker run -it --ipc=host docker.io/ultralytics/ultralytics:latest`

Docker run option 설명

  • -it
    • -i 옵션은 컨테이너의 표준 입력(STDIN)을 열어두어 대화형으로 만들고,
    • -t 옵션은 가상 터미널(TTY)을 할당
    • 함께 사용할 경우 -it는 컨테이너와의 대화형 세션을 가능하게 해주어 사용자가 컨테이너 내부에서 셸을 사용할 수 있도록 함
  • --ipc=host
    • --ipc 옵션은 IPC(Inter-Process Communication) 네임스페이스 설정
    • host를 설정함으로써, 컨테이너는 호스트의 IPC 네임스페이스를 사용. 즉, 컨테이너는 호스트 시스템의 메모리 공간과 세마포어 등 IPC 자원을 공유하게 됨
    • 이는 성능상의 이유로, 특히 고성능 컴퓨팅 작업이나 병렬 처리 작업을 할 때 컨테이너 간 통신이 필요할 경우 유용
  • docker.io/ultralytics/ultralytics:latest
    • 이 부분은 실행하려는 도커 이미지를 지정
    • docker.io: 도커 허브의 도메인
    • ultralytics/ultralytics: 사용자/리포지토리의 이름으로, 여기서 ultralytics는 사용자 혹은 조직의 이름이며, 두 번째 ultralytics는 이미지의 이름
    • :latest는 이미지의 태그
    • latest 태그는 해당 리포지토리의 최신 버전 이미지를 가리킴. 태그를 지정하지 않으면 기본적으로 latest 태그가 사용

      cpu 만 사용하는 docker로 실행하였다

GPU를 위해 NVIDIA 설치 사이트

https://docs.nvidia.com/datacenter/cloud-native/container-toolkit/latest/install-guide.html

노트

Ultralytics Dockerfile

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
# Ultralytics YOLO 🚀, AGPL-3.0 license
# Builds ultralytics/ultralytics:latest image on DockerHub https://hub.docker.com/r/ultralytics/ultralytics
# Image is CUDA-optimized for YOLOv8 single/multi-GPU training and inference

# Start FROM PyTorch image https://hub.docker.com/r/pytorch/pytorch or nvcr.io/nvidia/pytorch:23.03-py3
FROM pytorch/pytorch:2.1.0-cuda12.1-cudnn8-runtime
RUN pip install --no-cache nvidia-tensorrt --index-url https://pypi.ngc.nvidia.com

# Downloads to user config dir
ADD https://ultralytics.com/assets/Arial.ttf https://ultralytics.com/assets/Arial.Unicode.ttf /root/.config/Ultralytics/

# Install linux packages
# g++ required to build 'tflite_support' and 'lap' packages, libusb-1.0-0 required for 'tflite_support' package
RUN apt update \
    && apt install --no-install-recommends -y gcc git zip curl htop libgl1 libglib2.0-0 libpython3-dev gnupg g++ libusb-1.0-0

# Security updates
# https://security.snyk.io/vuln/SNYK-UBUNTU1804-OPENSSL-3314796
RUN apt upgrade --no-install-recommends -y openssl tar

# Create working directory
WORKDIR /usr/src/ultralytics

# Copy contents
# COPY . /usr/src/ultralytics  # git permission issues inside container
RUN git clone https://github.com/ultralytics/ultralytics -b main /usr/src/ultralytics
ADD https://github.com/ultralytics/assets/releases/download/v0.0.0/yolov8n.pt /usr/src/ultralytics/

# Install pip packages
RUN python3 -m pip install --upgrade pip wheel
RUN pip install --no-cache -e ".[export]" albumentations comet pycocotools pytest-cov

# Run exports to AutoInstall packages
RUN yolo export model=tmp/yolov8n.pt format=edgetpu imgsz=32
RUN yolo export model=tmp/yolov8n.pt format=ncnn imgsz=32
# Requires <= Python 3.10, bug with paddlepaddle==2.5.0 https://github.com/PaddlePaddle/X2Paddle/issues/991
RUN pip install --no-cache paddlepaddle==2.4.2 x2paddle
# Fix error: `np.bool` was a deprecated alias for the builtin `bool` segmentation error in Tests
RUN pip install --no-cache numpy==1.23.5
# Remove exported models
RUN rm -rf tmp

# Set environment variables
ENV OMP_NUM_THREADS=1
# Avoid DDP error "MKL_THREADING_LAYER=INTEL is incompatible with libgomp.so.1 library" https://github.com/pytorch/pytorch/issues/37377
ENV MKL_THREADING_LAYER=GNU


# Usage Examples -------------------------------------------------------------------------------------------------------

# Build and Push
# t=ultralytics/ultralytics:latest && sudo docker build -f docker/Dockerfile -t $t . && sudo docker push $t

# Pull and Run with access to all GPUs
# t=ultralytics/ultralytics:latest && sudo docker pull $t && sudo docker run -it --ipc=host --gpus all $t

# Pull and Run with access to GPUs 2 and 3 (inside container CUDA devices will appear as 0 and 1)
# t=ultralytics/ultralytics:latest && sudo docker pull $t && sudo docker run -it --ipc=host --gpus '"device=2,3"' $t

# Pull and Run with local directory access
# t=ultralytics/ultralytics:latest && sudo docker pull $t && sudo docker run -it --ipc=host --gpus all -v "$(pwd)"/datasets:/usr/src/datasets $t

# Kill all
# sudo docker kill $(sudo docker ps -q)

# Kill all image-based
# sudo docker kill $(sudo docker ps -qa --filter ancestor=ultralytics/ultralytics:latest)

# DockerHub tag update
# t=ultralytics/ultralytics:latest tnew=ultralytics/ultralytics:v6.2 && sudo docker pull $t && sudo docker tag $t $tnew && sudo docker push $tnew

# Clean up
# sudo docker system prune -a --volumes

# Update Ubuntu drivers
# https://www.maketecheasier.com/install-nvidia-drivers-ubuntu/

# DDP test
# python -m torch.distributed.run --nproc_per_node 2 --master_port 1 train.py --epochs 3

# GCP VM from Image
# docker.io/ultralytics/ultralytics:latest

만약 프로젝트 Dockerfile을 만든다면, FROM ultralytics/ultralytics로 시작하여 Dockerfile을 작성하면 될것 같다

Mount

호스트 시스템의 파일 또는 디렉토리를 컨테이너 내부의 파일시스템에 연결하는 것을 의미

  1. 볼륨(Volume) 마운트:

    • 볼륨은 도커 호스트에 의해 관리되는 데이터의 저장소입니다. 볼륨은 컨테이너가 삭제되어도 남아있고, 여러 컨테이너가 동시에 볼륨을 마운트하여 사용할 수 있습니다.
    • 볼륨을 사용하면 호스트 파일시스템의 특정 위치에 종속되지 않으므로, 휴대성과 보안에 유리합니다.
    • 예: docker run -v my_volume:/path/in/container ...
  2. 바인드 마운트:

    • 호스트 시스템의 어떤 파일이나 디렉토리를 컨테이너에 마운트합니다. 바인드 마운트는 호스트 시스템의 특정 경로를 대상으로 하며, 개발 환경에서 코드를 빠르게 반영하기 위해 자주 사용됩니다.
    • 바인드 마운트는 볼륨 마운트보다 호스트에 더 강하게 결합되어 있어, 파일시스템의 경로에 의존합니다.
    • 예: docker run -v /path/on/host:/path/in/container ...
  3. tmpfs 마운트:

    • 호스트의 메모리에 저장되는 일시적인 파일시스템을 컨테이너에 마운트합니다. 컨테이너가 종료되면, tmpfs에 저장된 데이터는 삭제됩니다. 이 방법은 민감한 정보를 처리할 때 유용합니다.
    • 예: docker run --tmpfs /path/in/container ...

마운트를 사용할 때의 몇 가지 주의사항:

  • 볼륨 마운트는 호스트에 종속되지 않아 여러 도커 호스트에서 볼륨을 쉽게 공유할 수 있습니다.
  • 바인드 마운트는 호스트 시스템의 구체적인 경로를 컨테이너에 연결하므로, 개발 환경에서는 편리하지만 배포 환경에서는 볼륨 마운트를 사용하는 것이 좋습니다.
  • 도커 컴포즈(Docker Compose)를 사용하면 볼륨과 바인드 마운트를 더 선언적으로 관리할 수 있습니다.

컨테이너에 마운트를 추가하는 전형적인 docker run 명령은 다음과 같습니다:

bashCopy code

docker run -v type=volume,source=my_volume,target=/path/in/container ...

혹은 바인드 마운트를 사용할 때는 다음과 같이 사용할 수 있습니다:

bashCopy code

docker run -v /path/on/host:/path/in/container ...

이렇게 마운트를 사용하면, 컨테이너 내부의 /path/in/container에 호스트의 /path/on/host가 연결되어, 컨테이너에서 해당 경로를 통해 파일을 읽고 쓸 수 있게 됩니다.

This post is licensed under CC BY 4.0 by the author.

차량 블랙박스 영상속 도로 교통 법규 위반 차량 감지

딥러닝 영상처리