Dockerfile tips and tricks: Difference between revisions
Jump to navigation
Jump to search
(Add categories: Network, Reference) |
(Phase 6.1: LLM-Optimized Wiki Template migration) |
||
| Line 1: | Line 1: | ||
== | = Dockerfile tips and tricks = | ||
{{Status | |||
|status=Draft | |||
|owner=Knowledge Agent | |||
|last_update=2026-07-16 | |||
|review=Pending | |||
}} | |||
{{TOC}} | |||
== | == 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 == | |||
{| class="wikitable" | |||
! 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) === | |||
<syntaxhighlight lang="bash"> | |||
FROM ubuntu:20.04 | FROM ubuntu:20.04 | ||
ARG DEBIAN_FRONTEND=noninteractive | ARG DEBIAN_FRONTEND=noninteractive | ||
| Line 21: | Line 92: | ||
ENV NVIDIA_VISIBLE_DEVICES all | ENV NVIDIA_VISIBLE_DEVICES all | ||
ENV NVIDIA_DRIVER_CAPABILITIES compute,utility | ENV NVIDIA_DRIVER_CAPABILITIES compute,utility | ||
</syntaxhighlight> | </syntaxhighlight> | ||
== | === Root 비밀번호 설정 === | ||
== | |||
<syntaxhighlight lang="bash"> | <syntaxhighlight lang="bash"> | ||
# 이미지 빌드 시 | |||
RUN echo 'root:Docker!' | chpasswd | RUN echo 'root:Docker!' | chpasswd | ||
RUN echo 'Docker!' | passwd --stdin root | # 또는 | ||
RUN echo 'Docker!' | passwd --stdin root | |||
# 실행 중인 컨테이너에서 | |||
docker exec -itu 0 {container} passwd | |||
# 3rd party 이미지에서 root로 로그인 | |||
docker container exec -u 0 -it mycontainer bash | |||
</syntaxhighlight> | </syntaxhighlight> | ||
=== Docker requests 버전 충돌 해결 === | |||
< | <syntaxhighlight lang="bash"> | ||
pip install -U urllib3 requests==<right_version> | |||
</syntaxhighlight> | |||
=== NAT chain 오류 해결 === | |||
<syntaxhighlight lang="bash"> | |||
sudo apt update && sudo apt upgrade && sudo systemctl restart docker.service | |||
</syntaxhighlight> | |||
--- | |||
== | == 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 == | ||
{| class="wikitable" | {| class="wikitable" | ||
| | ! 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 == | |||
* [https://stackoverflow.com/questions/75713844/ Failed to create NAT chain Docker] | |||
* [https://kmg.group/posts/2022-05-23-docker-stop-containers-with-signals/ Container stop signals] | |||
* [https://linuxhandbook.com/setup-opencl-linux-docker/ OpenCL in Docker] | |||
* [https://www.pugetsystems.com/labs/hpc/ 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]] | |||
--- | |||
[[Category: | [[Category:Linux]] | ||
[[Category:Guide]] | |||
Revision as of 14:49, 16 July 2026
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
---