Dockerfile tips and tricks
Jump to navigation
Jump to search
Dockerfile tips and tricks
Overview
Docker 이미지 빌드 및 컨테이너 운영 시 유용한 팁과 트릭 모음. 버전 충돌 해결, GPU 설정, 성능 튜닝, 시그널 처리 등 실용적인 문제 해결 가이드.
Summary
- 무엇인가? Dockerfile 작성 및 Docker 컨테이너 운영 시 발생하는常见问题 해결 방법
- 왜 필요한가? Docker 환경 설정 오류, 버전 충돌, GPU 연산 문제 등을 빠르게 해결
- 언제 사용하는가? Docker 이미지 빌드, 컨테이너 실행, GPU/OpenCL 설정, 리소스 튜닝 시
---
Purpose
Dockerfile 작성 시 자주 발생하는 오류와 해결책, GPU/OpenCL 설정, 성능 튜닝, 컨테이너 종료 시그널 처리 등 실용적인 팁 제공
- Goal: Docker 환경 구축 및 운영 시 시간 절약 및 문제 해결 속도 향상
- Scope: Dockerfile 빌드 팁, GPU/OpenCL 설정, 리소스 튜닝, 시그널 처리
- Non-goals: Docker 기본 사용법 튜토리얼, Docker Compose 상세 설정
---
Key Concepts
| Topic | Description | Related |
|---|---|---|
| Version Conflict | Docker 패키지 간 의존성 충돌 해결 | Docker command workflow |
| OpenCL in Docker | 컨테이너 내 GPU/OpenCL 설정 | GPU Support |
| Resource Tuning | Docker 리소스 및 성능 최적화 | Docker container resource |
| Container Stop Signal | 컨테이너 종료 시 SIGTERM/SIGKILL 처리 | Docker command workflow |
---
Architecture
Docker 컨테이너는 호스트 OS의 커널을 공유하는 경량 가상화 환경. GPU/OpenCL 연산을 컨테이너 내에서 사용하려면 호스트의 NVIDIA 드라이버와 OpenCL 라이브러리를 컨테이너에 노출해야 함.
---
Workflow
- Dockerfile 기반 이미지 빌드
- 의존성 버전 충돌 시 pip install -U 로 해결
- GPU/OpenCL 설정 시 nvidia-container-toolkit 및 ICD 파일 구성
- 컨테이너 종료 시 SIGTERM → 10초 후 SIGKILL 기본 동작 확인
- ENTRYPOINT/STOPSIGNAL/docker-compose.yml stop_signal 설정으로 동작 커스터마이징
---
Configuration
OpenCL 설정 (Docker 내 GPU)
FROM ubuntu:20.04
ARG DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get -y upgrade \
&& apt-get install -y \
ocl-icd-libopencl1 \
opencl-headers \
clinfo \
;
RUN mkdir -p /etc/OpenCL/vendors && \
echo "libnvidia-opencl.so.1" > /etc/OpenCL/vendors/nvidia.icd
ENV NVIDIA_VISIBLE_DEVICES all
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility
Root 비밀번호 설정
# 이미지 빌드 시
RUN echo 'root:Docker!' | chpasswd
# 또는
RUN echo 'Docker!' | passwd --stdin root
# 실행 중인 컨테이너에서
docker exec -itu 0 {container} passwd
# 3rd party 이미지에서 root로 로그인
docker container exec -u 0 -it mycontainer bash
Docker requests 버전 충돌 해결
pip install -U urllib3 requests==<right_version>
NAT chain 오류 해결
sudo apt update && sudo apt upgrade && sudo systemctl restart docker.service
---
Examples
컨테이너 종료 시그널 처리
기본 동작:
- `docker stop` → ENTRYPOINT 프로세스에 SIGTERM 전송
- 10초 후 → SIGKILL 전송
커스터마이징:
- Dockerfile의 `STOPSIGNAL` 지시자 변경
- docker-compose.yml의 `stop_signal` 설정
- docker-compose.yml의 `stop_grace_period` 설정
예시 (php-fpm/nginx): SIGQUIT 사용 (SIGTERM 대신)
---
Best Practices
- 의존성 충돌 시 `pip install -U`로 최신 버전으로 업그레이드
- GPU/OpenCL 사용 시 `NVIDIA_VISIBLE_DEVICES`와 `NVIDIA_DRIVER_CAPABILITIES` 환경변수 필수 설정
- 컨테이너 종료 시 graceful shutdown을 위해 ENTRYPOINT에서 시그널 핸들러 구현
- Dockerfile에서 `ARG DEBIAN_FRONTEND=noninteractive`로 대시로그 상호작용 방지
---
Performance
| Setting | Impact | Notes |
|---|---|---|
| OpenCL ICD 설정 | GPU/OpenCL 연산 가능 | /etc/OpenCL/vendors/nvidia.icd 필수 |
| NVIDIA_DRIVER_CAPABILITIES | 컨테이너 내 GPU 접근 | compute,utility 권장 |
| stop_signal 설정 | graceful shutdown | php-fpm/nginx는 SIGQUIT 권장 |
---
Limitations
- Docker 7.0.0+는 requests>=2.26.0 필수
- NAT chain 오류 시 재부팅 대신 docker.service 재시작 필요
- 3rd party 이미지는 USER 설정이 override 될 수 있음 (-u 0 사용)
---
References
- Failed to create NAT chain Docker
- Container stop signals
- OpenCL in Docker
- How to Setup NVIDIA Docker and NGC Registry - Part 5
---
Related Pages
- Docker command workflow
- Docker container resource
- Docker library sharing from host to container
- GPU Support
- CUDA
---