Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- ERD
- 도커
- viewsets
- SQL
- 연습
- git
- 파이썬
- 아티클 스터디
- CS
- docker
- NoSQL
- github
- 티스토리챌린지
- Wil
- nginx
- 세션(Session)
- django
- 코딩테스트
- flask
- Python
- Til
- 장고
- 오블완
- Doker
- web
- JWT
- redis
- 개발공부
- 자료구조
- 쿠키(cookie)
Archives
- Today
- Total
SteadyDrills
도커 파일 구성 본문
241216
도커 파일 (Dockerfile)
Dockerfile은 Docker 이미지 빌드 과정의 설명서(Script) 역할을 하며, Docker는 Dockerfile에 정의된 명령어를 단계적으로 읽고 실행하여 최종적으로 이미지를 생성한다. 또한 이 이미지를 통해 애플리케이션이 동작하는 컨테이너를 실행함으로써 도커는 격리된 가상환경을 제공한다.
주요 명령어
FROM | 필수 | 베이스 이미지를 지정. 모든 Dockerfile은 반드시 FROM 명령어로 시작. |
CMD | 필수 | 컨테이너 실행 시 기본으로 실행할 명령을 지정. |
ENTRYPOINT | 필수 (CMD 대체) |
CMD 대신 ENTRYPOINT를 사용해 컨테이너의 기본 동작을 설정할 수 있음. |
WORKDIR | 생략 가능 | 작업 디렉터리를 설정. 생략 시 기본 디렉터리는 /. |
COPY | 생략 가능 | 로컬 파일을 컨테이너로 복사. 생략 시 컨테이너에 필요한 파일이 없을 수 있음. |
ADD | 생략 가능 | 파일 복사와 URL 다운로드. 잘 사용되지 않음. COPY로 대체 가능. |
RUN | 생략 가능 | 빌드 시 필요한 명령어를 실행. 생략하면 의존성 설치가 누락될 수 있음. |
EXPOSE | 생략 가능 | 컨테이너에서 외부로 노출할 포트를 지정. 생략해도 동작하지만 명시적 포트 노출 설정이 필요. |
ENV | 생략 가능 | 환경 변수를 설정. 생략하면 기본값 사용 또는 수동 설정 필요. |
명령어의 중요도 및 상세설명
필수 명령어
(1) FROM
- 설명: Dockerfile은 항상 FROM 명령어로 시작해야 한다.
- 이유: Docker 이미지는 항상 베이스 이미지를 기반으로 생성되기 때문이다. 만약 특정 베이스 이미지가 없다면 FROM scratch를 사용해 빈 이미지를 기반으로 작업할 수 있다.
- 예시:
# 파이썬 3.10 경량화 버전
FROM python:3.10-slim
(2) CMD 또는 ENTRYPOINT
- 설명: CMD나 ENTRYPOINT 중 하나는 포함되어야 한다.
- 이유: 컨테이너가 실행될 때 수행할 기본 명령을 지정해야 컨테이너가 제대로 동작하기 때문이다.
- 예시:
CMD ["python", "app.py"] or ENTRYPOINT ["python", "app.py"]
생략 가능한 명령어
Dockerfile에 포함하지 않아도 이미지를 빌드하고 컨테이너를 실행할 수 있다. 그러나 특정 작업을 수행하거나 설정을 위해 필요로 한다.
(1) WORKDIR
- 설명: 컨테이너 내부에서 작업 디렉터리를 설정하는 명령어.
- 생략 시: 기본적으로 루트 디렉터리(/)에서 작업한다.
- 예시:
WORKDIR /app
(2) COPY
- 설명: 로컬 파일을 컨테이너로 복사.
- 생략 시: 애플리케이션 파일이 포함되지 않으므로 컨테이너가 제대로 동작하지 않을 수 있다.
- 예시:
COPY . /app
(3) ADD
- 설명: COPY와 비슷하지만 잘 사용되지 않는다. 단순 파일을 복제하는 것은 copy를 사용하고, 압축 해제가 필요한 파일이나 url을 통한 다운로드가 필요한 경우에만 사용된다.
- 생략 시: COPY로 대체 가능.
- 예시:
ADD https://example.com/file.tar.gz /data/
#OR
ADD software.tar.gz /opt/software/
#압축 해제를 명시적으로 제어하고 싶을 경우
COPY model.tar.gz /app/
RUN tar -xzvf /app/model.tar.gz -C /app/
(4) RUN
- 설명: 이미지를 빌드할 때 필요한 명령어를 실행한다. 보통 패키지 설치나 설정 파일 준비를 위해 사용한다.
- 생략 시: 필요한 의존성이 포함되지 않을 수 있다.➡️오류를 야기 할 수 있다.
- 예시:
RUN pip install -r requirements.txt
(5) EXPOSE
- 설명: 컨테이너에서 외부로 노출할 포트를 정의.
- 생략 시: 컨테이너가 동작하지만, 포트를 명시적으로 문서화하지 않는다. 대신 docker run 명령에서 수동으로 포트를 지정해야 한다.
- 예시:
EXPOSE 8000
(6) ENV
- 설명: 컨테이너 환경 변수를 설정합니다.
- 생략 시: 환경 변수를 수동으로 설정하거나 기본값으로 동작할 수 있다.
- 예시:
ENV DJANGO_SETTINGS_MODULE=myproject.settings
예시 장고 도커 파일
# Dockerfile
#베이스 이미지 설정
FROM python:3.12
# 작업 디렉토리 설정
WORKDIR /usr/src/app
# 의존성 파일 복사
COPY requirements.txt ./
# 의존성 설치
RUN pip install --no-cache-dir -r requirements.txt
# 애플리케이션 코드 복사
COPY . .
# 포트 설정
EXPOSE 8000
# Django 서버 실행
CMD ["python", "manage.py", "runserver", "0.0.0.0:8000"]
*RUN 명령어에 pip install --no-cache-dir 옵션은?
- 설명: PIP 명령어에 사용되는 옵션으로, 패키지를 설치할 때 캐시 디렉터리를 사용하지 않도록 설정.
- 역할: PIP는 기본적으로 설치 과정에서 패키지의 압축 파일(.whl 파일 등)을 캐싱하여, 나중에 다시 사용할 때 다운로드 없이 설치 시간을 단축할 수 있도록 한다. 하지만 도커의 환경에서는 기능이 필요 없으므로 --no-cache-dir 옵션을 사용해 캐시 파일을 생성하지 않도록 하여 이미지 크기를 줄인다.
- 왜 --no-cache-dir가 중요한가?
- 이미지 크기 최적화:
- Docker 이미지는 레이어(layer) 기반으로 작동 . 불필요한 캐시 파일이 남아 있으면 최종 이미지 크기가 커질 수 있다.
- 보안 및 재사용성:
- 캐시 파일이 남아 있으면 민감한 데이터가 포함될 가능성이 있음.
- 캐시 파일 없이 설치를 진행하면 재사용 가능한 경량 이미지 생성이 가능.
- 이미지 크기 최적화:
참조
https://docs.docker.com/reference/dockerfile/#dockerfile-examples
Dockerfile reference
Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.
docs.docker.com
https://www.docker.com/blog/containerized-python-development-part-1/
Containerized Python Development - Part 1 | Docker
Developing Python projects in local environments can get pretty challenging if more than one project is being developed at the same time. Bootstrapping a project may take time as we need to manage versions, set up dependencies and configurations for it. Be
www.docker.com
'웹개발' 카테고리의 다른 글
레디스 명령어 모음 (0) | 2024.12.23 |
---|---|
장고의 세션 저장 원리 (0) | 2024.12.19 |
Docker 기초 명령어 정리 (0) | 2024.12.13 |
WSL(Windows Subsystem for Linux)란? (0) | 2024.12.10 |
도커 초기 설정 (0) | 2024.12.05 |