카카오 부트캠프/내용 정리

Dockerfile 기초 문법 이해

BCSJH 2024. 12. 12. 22:49

해당 내용을 딥다이브 내용 정리입니다. 😶

Dockerfile이란?

Dockerfile은 Docker 이미지를 생성하기 위한 스크립트 파일로, 이미지 빌드에 필요한 명령들을 텍스트 형식으로 작성합니다. 이를 통해 개발 환경과 배포 환경의 차이로 인해 발생하는 문제를 최소화할 수 있습니다.

용어 설명
Docker 리눅스 컨테이너 기반 오픈소스 가상화 플랫폼
file 데이터를 저장하는 형식
Dockerfile 이미지 빌드 명령어가 포함된 텍스트 문서

가상 머신과 도커 컨테이너의 차이점

구분 도커 (Docker) 가상 머신 (Virtual Machine)
구조 애플리케이션 + 라이브러리 + 컨테이너 엔진 공유 게스트 OS + 애플리케이션
운영체제 호스트 OS의 커널을 공유 각 VM이 독립적인 게스트 OS 실행
리소스 사용량 경량화, 리소스 소비 적음 무겁고, 많은 CPU/메모리 필요
속도 빠른 시작과 실행 느린 부팅과 실행
격리 수준 애플리케이션 수준 격리 운영체제 수준 완전 격리
호환성 동일 커널 기반에서만 실행 가능 서로 다른 OS 간 호환 가능
사용 사례 CI/CD, 마이크로서비스, 애플리케이션 배포 OS 테스트, 다양한 OS 환경 시뮬레이션

💡 도커의 장점 애플리케이션 실행에 필요한 모든 환경을 포함하여 "한 번 빌드하면 어디서나 실행"을 실현할 수 있습니다.

Dockerfile의 기본 명령어

명령어 설명
FROM 베이스 이미지를 설정합니다.
RUN 이미지 빌드 시 실행할 명령어를 설정합니다.
CMD 컨테이너 실행 시 기본 실행 명령을 설정합니다.
ENTRYPOINT 고정된 명령 실행 및 추가 인수 전달을 설정합니다.
COPY 파일을 단순 복사합니다.
ADD 파일 복사와 URL 다운로드, 압축 해제를 지원합니다.
ENV 환경 변수를 설정합니다.
WORKDIR 기본 작업 디렉토리를 설정합니다.
EXPOSE 컨테이너의 네트워크 포트를 명시합니다.

CMD와 ENTRYPOINT 차이

  • CMD: 컨테이너 실행 시 기본 명령어를 설정합니다. 추가 인수 입력 시 CMD는 무시됩니다.
  • CMD ["echo", "Hello, world"]
  • ENTRYPOINT: 고정된 명령을 실행하며 추가 인수를 붙여 실행합니다.
  • ENTRYPOINT ["echo"] CMD ["Hello, World"]

COPY와 ADD 차이

구분 COPY ADD
기능 단순 복사 복사 + URL 다운로드 + 압축 해제
압축 파일 처리 지원하지 않음 자동 해제 지원 (.zip 제외)
URL 지원 지원하지 않음 URL에서 파일 다운로드 가능
사용 권장 단순 복사 필요 시 URL/압축 해제가 필요할 때

💡COPY를 선호하는 이유: 기능이 명확하고 단순 복사 작업에 적합하기 때문입니다.

EXPOSE와 포트 매핑

  • EXPOSE는 컨테이너 내부에서 사용하는 네트워크 포트를 명시적으로 선언합니다.
  • 외부 접근을 위해 호스트와 컨테이너 간 포트를 연결해야 합니다:
  • docker run -p 8080:8080 <이미지_이름>
  • 사용 이유:
    1. 포트 사용 문서화
    2. 컨테이너 간 통신 지원
    3. 자동 포트 매핑 가능
    4. 보안 강화 (미노출 포트 관리)

리소스 제한과 Non-root 사용

리소스 제한

컨테이너 자원은 cgroups(Control Groups)를 통해 관리됩니다.

CPU 제한

  • --cpus=<value>: CPU 코어 수 제한
  • --cpu-shares=<value>: CPU 우선순위 설정

메모리 제한

  • --memory=<value>: 메모리 사용량 제한
  • --memory-swap=<value>: 스왑 메모리 사용량 제한

디스크 I/O 제한

  • --device-read-bps, --device-write-bps: 디스크 읽기/쓰기 속도 제한

Non-root 유저 사용

  • 이유: Root 권한 사용 시 보안 취약점이 발생할 수 있습니다.
  • 방법: Dockerfile에서 USER 명령어를 사용하여 기본 사용자를 비-root 계정으로 설정합니다:
  • RUN useradd -m myuser USER myuser
  • 효과: 컨테이너 내부에서 권한을 최소화하여 보안을 강화합니다.

도커를 처음 접해 깊이 있는 발표를 하지 못해 아쉬웠지만, 이번 경험을 통해 배움의 필요성을 느꼈습니다. 앞으로 도커를 더 깊이 공부하고 다시 발표할 기회를 만들고 싶습니다. 😁