오늘은 17주차 주간 학습정리와 지난 강의에 이어서 docker를 배웠다.
학습 정리로 월~금 동안 매일
복습, 과제, 피어세션, 회고 정리했고 아래 링크 달았습니다.
Docker 이미지를 생성하기 위한 설정 파일
FROM python:3.9-slim # FROM 베이스 이미지 지정. 이미지이름:태그
WORKDIR /app # WORKDIR 작업 디렉토리 (컨테이너 경로) 설정
COPY requirements.txt . # COPY 로컬디렉토리(파일) 컨테이너디렉토리(파일) 컨테이너로 파일 복사
COPY src ./src
RUN pip install --no-cache-dir -r requirements.txt # RUN 실행할 리눅스 명령어. '\'를이용해 여러 줄 동시 실행 가능
ENV APP_ENV=production # 환경변수 이름=값
EXPOSE 5000 # 컨테이너 외부에 노출할 포트 지정
CMD ["python", "src/main.py"] # CMD ["실행할명령어", "인자"] 이미지기반으로 컨테이너 만들 때 실행할 명령어
```[9]
docker build -t 이미지이름:태그 dockerfile경로
이미지파일을 업로드할 수 있는 원격 저장소
Dockerhub, GCP GCR. AWS ECR 등이 있다.
미지정시 도커허브 사용
새 이미지를 태그한 뒤 도커허브에 push.
Dockerhub에 올릴 이미지 이름은 "계정ID/이미지이름" 형태여야한다.
docker tag 기존이미지:태그 새이미지이름:태그
docker push 새이미지이름:태그
작은 size의 base image 사용하기
python같은경우 표준보다 slim, alpine이 용량이 작다.
Multi Stage Build
빌드엔 필요하지만 최종 컨테이너 이미지에는 필요없는 내용을 제외해 이미지 생성
빌드 환경과 실행 환경을 분리해 최종 이미지 크기를 줄인다.
COPY --from 옵션으로 실행 이미지로 전달이 가능하다
# Build stage
FROM python:3.9 AS builder
WORKDIR /app
# 필수 시스템 라이브러리 설치
RUN apt-get update && apt-get install -y \
build-essential \
curl \
software-properties-common \
&& rm -rf /var/lib/apt/lists/*
COPY requirements.txt .
RUN pip install --user -r requirements.txt
# --user를 하면 /root/.local에 저장됨
# Runtime stage
FROM python:3.9-slim AS runtime
WORKDIR /app
# 최소한의 시스템 라이브러리만 설치
RUN apt-get update && apt-get install -y \
libgomp1 \
&& rm -rf /var/lib/apt/lists/*
# Python 패키지 복사
# 아래에서 --from builder가 위에서 설치한 걸
COPY --from=builder /root/.local /root/.local
COPY ./src .
COPY ./models ./models
ENV PYTHONPATH=/root/.local/lib/python3.9/site-packages
ENV PATH=/root/.local/bin:$PATH
CMD ["python", "app.py"]
여러 컨테이너를 통합적으로 관리하고 운영하기 위한 도구
여러 컨테이너의 설정을 YAML 파일(docker-compose.yml
) 하나로 정의하여 관리
여러 컨테이너의 실행 순서와 의존도를 관리할 수 있다.
실행 명령어
docker-compose up -d
: 도커 컴포즈 실행. -d는 백그라운드 실행
docker-compose down : 서비스 중단 후 컨테이너 제거
docker-compose logs 서비스명 : 로그확인
docker-compose.yml 파일 예시
version: '3.1' # 도커 컴포즈 버전
services: # 실행할 컨테이너 정의. 각 서비스는 하나의 컨테이너
db:
image: mysql:8.0
ports:
- "3306:3306"
environment:
- MYSQL_ROOT_PASSWORD=rootpassword
- MYSQL_DATABASE=myapp
- MYSQL_USER=user
- MYSQL_PASSWORD=password
volumes: # 볼륨 정의
- mysql_data:/var/lib/mysql
- ./init.sql:/docker-entrypoint-initdb.d/init.sql
command: --default-authentication-plugin=mysql_native_password
networks:
- backend
web:
build: .
ports:
- "5000:5000"
environment:
- MYSQL_HOST=db
- MYSQL_USER=user
- MYSQL_PASSWORD=password
- MYSQL_DATABASE=myapp
depends_on: # db 실행 후 실행된다는 뜻
- db
volumes:
- ./src:/app/src
networks:
- backend
restart: always # 컨테이너 재실행 정책