본문 바로가기
Docker

[Docker] Dockerfile 작성을 통한 Docker Pytorch 환경 구성

by yongee97 2026. 1. 24.

* 목표

- 특정 pytorch 버전이 적용된 Docker 환경을 구성합니다.

- 파이토치 뿐 아니라 다양한 필요한 패키지들을 사용하기 위해 Dockerfile을 작성합니다.

- 이번 포스트에서는 cuda 12.6, cudnn 9와 pytorch 2.9.1 로 구성된 도커 이미지를 직접 Dockerfile로 구성하겠습니다.

 

* 용어 정리

 

  • Dockerfile: 도커 이미지를 만드는 “레시피”
  • Image(이미지): 실행 가능한 파일시스템 스냅샷(템플릿)
  • Build(빌드): Dockerfile에서 Image를 생성
  • Container(컨테이너): Image를 실행한 인스턴스
  • Run(실행): Image를 통해 Container를 생성하고 프로세스를 실행

 

 

1. 도커 설치

1.1 오래된 버전 도커/충돌 패키지 제거

 sudo apt remove $(dpkg --get-selections docker.io docker-compose docker-compose-v2 docker-doc podman-docker containerd runc | cut -f1)

 

1.2 도커 설치를 위한 레포지토리 설정

# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc

# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Signed-By: /etc/apt/keyrings/docker.asc
EOF

sudo apt update

 

1.3 도커 설치

 sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

 

1.4 정상 설치 여부 확인

 sudo docker run hello-world

 

도커 정상 설치 시의 화면

 

2. NVIDIA Container Toolkit 설치

- 도커 환경 내부에서 GPU를 사용하기 위해 설치가 필요합니다.

- NVIDIA Container Toolkit은 컨테이너가 호스트 GPU를 사용할 수 있도록 런타임을 구성합니다.

- 만약 도커 내부에서 NVIDIA GPU를 사용하지 않을 예정이라면 생략하셔도 됩니다.

- 실행 전, nvidia 드라이버가 로컬 PC에 설치되어 있어야 합니다.

 

2.1 prerequisites 설치 및 레포지토리 설정

sudo apt-get update && sudo apt-get install -y --no-install-recommends curl gnupg2
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \
  && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \
    sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \
    sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list

 

2.2 NVIDIA Container Toolkit 설치

- 공식 Document에서는 특정 버전을 명시한 채 설치하는 방법을 안내하고 있으나, 반드시 그 버전이 필요한 것이 아니라면 아래의 명령어로 설치하셔도 무방합니다.

sudo apt-get install -y nvidia-container-toolkit

 

2.3 도커 재설정

sudo nvidia-ctk runtime configure --runtime=docker
sudo systemctl restart docker

 

2.4 Docker의 그래픽 드라이버 인식 여부 확인

- 추후 구성할 환경인 pytorch 2.9.1, cuda 12.6 환경의 컨테이너를 가져와서 정상 설치 여부를 확인합니다.

- 아래 명령어를 입력하여 도커가 그래픽 드라이버를 인식하는지 확인합니다.

1) 대응하는 이미지를 다운로드하고

2) 그 이미지로 컨테이너를 생성한 다음

3) 컨테이너에서 nvidia-smi 명령어를 입력하여 Host의 그래픽 드라이버 정보를 출력합니다.

- 이때 nvidia-smi의 Driver Version 및 CUDA Version 표기는 Host 드라이버 기준 CUDA 상한이며, 이보다 높은 CUDA 는 사용할 수 없습니다.

docker run --rm --gpus all pytorch/pytorch:2.9.1-cuda12.6-cudnn9-runtime nvidia-smi

host PC의 그래픽 드라이버가 나오면 성공

 

2.5 Container 내에서 GPU 인식 여부 확인

- 아래 명령어를 입력하여 Container가 GPU를 인식할 수 있는지 확인합니다.

- True, 현재 그래픽 카드를 출력하면 성공입니다.

docker run --rm --gpus all pytorch/pytorch:2.9.1-cuda12.6-cudnn9-runtime python -c "import torch; print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'no-gpu')"

Container 내에서 GPU 인식 여부 확인

 

 

3. Docker Container 구성

3.1 Dockerfile 작성

- 임의의 프로젝트 폴더를 하나 생성하고, 편집기를 통해 Dockerfile이라는 파일을 만들어서 열어줍니다.

mkdir torch_container
cd torch_container
vi Dockerfile

 

Dockerfile 내에는 아래 내용을 복사해서 붙여넣습니다.

FROM pytorch/pytorch:2.9.1-cuda12.6-cudnn9-runtime
WORKDIR /root
COPY requirements.txt /app/
RUN --mount=type=cache,target=/root/.cache/pip \
  python -m pip install --upgrade pip && \
  python -m pip install -r /app/requirements.txt
COPY entrypoint.sh /usr/local/bin/entrypoint.sh
RUN chmod +x /usr/local/bin/entrypoint.sh
ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]
CMD ["bash"]

 

* FROM pytorch/pytorch:2.9.1-cuda12.6-cudnn9-runtime

- 앞서 사용한, 희망하는 pytorch 및 cuda 버전의 도커 이미지를 가져옵니다. 

- 원하는 파이토치/쿠다 버전이 있을 경우 변경해도 무방합니다.

 

* COPY requirements.txt .

- 로컬 PC의 현재 경로인 torch_container 폴더의 requirements.txt 파일을 이미지 내부의 /app/requirements.txt로 복사합니다.

- requirements.txt 파일은 아래에서 작성할 예정입니다.

 

* RUN --mount=type=cache,target=/root/.cache/pip \
  python -m pip install --upgrade pip && \
  python -m pip install -r /app/requirements.txt

- pip를 업데이트한 다음, requirements.txt에 명시된 파이썬 라이브러리를 설치합니다.

- RUN --mount=type=cache,target=/root/.cache/pip 는 Docker BuildKit 전용 문법으로, pip 설치 시 발생하는 캐시를 이미지가 아닌 빌더 캐시에 남겨서 이미지 크기 증가 없이 캐시의 재사용을 가능하게 해주는 기능입니다.

 

* COPY entrypoint.sh /usr/local/bin/entrypoint.sh
* RUN chmod +x /usr/local/bin/entrypoint.sh

- 현재 폴더에 있는 entrypoint.sh 파일을 이미지 내로 집어넣고 실행가능하도록 권한을 부여합니다.

- entrypoint.sh 파일은 아래에서 작성할 예정입니다.

 

* ENTRYPOINT ["/usr/local/bin/entrypoint.sh"]

- entrypoint.sh 파일을 도커 이미지의 ENTRYPOINT로 지정합니다.

- ENTRYPOINT는 이 컨테이너가 실행될 때 입력된 명령어에 무관하게 기본으로 실행되는 커맨드를 지정하는 설정입니다.

 

* CMD ["bash"]

- Dockerfile에서 CMD는 도커  컨테이너 실행 시 명령어가 입력되지 않은 경우 ENTRYPOINT 명령 이후 기본적으로 실행되는 명령을 지정합니다.

- 여기선 bash를 실행합니다.

- 추가 명령어 없이 기본 실행 시 entrypoint.sh bash가 차례로 실행되며

- python ... 명령어를 입력 시 entrypoint.sh python ... 명령어가 실행됩니다.

 

 

3.2 requirements.txt 작성

- Dockerfile과 비슷하게 requirements.txt 파일을 편집기로 열어줍니다.

- 그리고 아래 내용을 붙여넣습니다.

- 현재는 예시를 위해 opencv-python, PyYAML만 설치하며, 필요한 패키지가 있을경우 추가로 명시하시면 됩니다.

opencv-python==4.10.0.84
PyYAML==6.0.2

 

 

3.3 entrypoint.sh 작성

- 마찬가지로 entrypoint.sh 파일을 편집기로 열어서 아래 내용을 붙여넣습니다.

#!/usr/bin/env bash
cat<<'EOF'
[Pytorch Container]
EOF
exec "$@"

 

- 이 entrypoint.sh에서는 [Pytorch Container]를 출력한 다음, CMD로 들어온 명령을 실행하게 됩니다.

 

3.4 Dockerfile 빌드

- 아래 명령어를 통해  도커파일을 빌드합니다.

docker build -t my_torch_image:v0.1 .

도커 이미지 빌드 성공 시 결과화면

 

3.5 도커 컨테이너 실행

docker run --rm -it --gpus all my_torch_image:v0.1

 

4. 로컬 환경에서의 파이썬 코드를 컨테이너 내부로 볼륨 마운트

- 볼륨 마운트란 컨테이너 안에 호스트 PC의 폴더를 그대로 연결하여 컨테이너가 그 폴더를 자기 폴더처럼 읽고 쓰게 하는 것입니다

 

4.1 테스트를 위한 임시 코드 작성

- 3.5에서 실행한 컨테이너는 종료합니다.

- 아래 명령어를 통해 파이썬 코드를 넣을 디렉터리를 만들고 그 안에 파일을 하나 생성합니다.

mkdir scripts && cd scripts
vi test.py

 

test.py

import torch
print('torch:', torch.__version__)
print('torch built with cuda:', torch.version.cuda)
print('cudnn:', torch.backends.cudnn.version())
print('cuda available:', torch.cuda.is_available())

 

4.2 해당 폴더를 컨테이너에 마운트 수행

- 아래 명령어를 실행하면 루트(~) 폴더에 scripts 폴더 생성을 확인할 수 있습니다.

docker run --rm -it --gpus all \
-v ./scripts:/root/scripts \
my_torch_image:v0.1

scripts 폴더가 마운트

 

4.3 파이썬 코드 실행하여 도커 컨테이너에서의 torch, cuda 버전 확인

- 아래 명령어를 통해 파이썬 코드를 실행하여 도커 컨테이너 내부 torch, cuda 버전을 확인합니다.

# inside docker container
python3 scripts/test.py

- 만약 동일한 파일을 로컬 환경에서 실행한다면, 아래와 같이 torch, cuda 버전이 다른 것을 확인할 수 있습니다.

로컬 환경에서 동일한 파일을 실행한 결과 cuda 버전이 상이

 

* 결론

- 파이토치 도커 컨테이너 환경을 구성하였습니다.

- 도커 컨테이너 안에서 파이썬 파일을 실행하여 원하는 pytorch, cuda 버전이 적용됨을 확인하였습니다.

 

 

* 폴더 내 최종 산출물 리스트

 

* Reference

도커 설치 방법

https://docs.docker.com/engine/install/ubuntu/

 

Ubuntu

Jumpstart your client-side server applications with Docker Engine on Ubuntu. This guide details prerequisites and multiple methods to install Docker Engine on Ubuntu.

docs.docker.com

NVIDIA Container Toolkit 설치 방법

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

 

Installing the NVIDIA Container Toolkit — NVIDIA Container Toolkit

Note There is a known issue on systems where systemd cgroup drivers are used that cause containers to lose access to requested GPUs when systemctl daemon reload is run. Refer to the troubleshooting documentation for more information.

docs.nvidia.com

 

'Docker' 카테고리의 다른 글

Jenkins Master 및 agent 도커로 실행  (0) 2024.11.03
[Docker] connect: permission denied Error  (0) 2023.06.29
Docker 사용 방법  (0) 2023.04.23
Use ROS in Docker 도커 환경에서 ROS 실행  (0) 2023.04.05