해당 내용을 딥다이브 내용 정리입니다. 😶
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 <이미지_이름>
- 사용 이유:
- 포트 사용 문서화
- 컨테이너 간 통신 지원
- 자동 포트 매핑 가능
- 보안 강화 (미노출 포트 관리)
리소스 제한과 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
- 효과: 컨테이너 내부에서 권한을 최소화하여 보안을 강화합니다.
도커를 처음 접해 깊이 있는 발표를 하지 못해 아쉬웠지만, 이번 경험을 통해 배움의 필요성을 느꼈습니다. 앞으로 도커를 더 깊이 공부하고 다시 발표할 기회를 만들고 싶습니다. 😁
'카카오 부트캠프 > 내용 정리' 카테고리의 다른 글
말을 잘 전달하기 위한 핵심 방법 (1) | 2024.12.17 |
---|---|
Elastic Beanstalk 배포 에러 및 문제 해결 보고서 (1) | 2024.12.15 |
Docker 기본 개념과 실습 정리 (0) | 2024.12.11 |
Docker 이미지 빌드 중 발생한 에러와 해결 방법 정리 (2) | 2024.12.09 |
토스에서 Gateway를 어떻게 활용할까? (2) | 2024.12.05 |