DevCourse TIL Day4 Week11 - k8s, docker

김태준·2023년 6월 18일
0

Data Enginnering DevCourse

목록 보기
50/93
post-thumbnail

✅ dockerignore란?

  • image build 시 추가하지 말아야 할 파일들이나 폴더들 지정
  • 앞선 다수의 컨테이너인 voting-application인 경우
*.pyc, project.lock.json, bin/, obj/, .vs/, node_modules/
  • 이외 고려사항
.git, .cache, logs/, *.md, **/*.class
  • dockerfile에서 COPY명령으로 불필요한 파일, 정보들이 이미지로 빌드되는 걸 막기위해 COPY명령으로 폴더별 일일이 작성하는 것도 좋은 해결 방법. (dockerignore 내용 보강)

추가로 타 플랫폼의 관련 예시로는 .gitignore, .npmignore, .eslintignore, .hgignore 등이 존재

✅ docker compose

다수의 container로 SW가 구성되는 경우 사용할 수 있는 Tool + 환경설정 파일.
-> 개별 관리보다 훨씬 생산성이 높음.
-> 환경설정 파일명은 docker-compose.yaml or .yml
-> 단 복잡도 상승하는 문제 (커맨드 수, 관리 등등)

yaml파일은 3개의 section으로 구성된다.

  • services : 프로그램 구성하는 서비스 지정 (각 서비스는 별개의 image, container실행), 각 서비스는 개별 dockerfile 가지거나 docker hub에서 이미지 다운로드되며 서비스 별 포트번호, 환경변수, 디스크 볼륨 등 지정 필요
  • volumes : 앞서 학습한 volumes (데이터 저장)
  • networks : 앞서 학습한 network

아래 코드는 docker-compose.yml 작성예시이다.

services:
  # 호스트명 (각 호스트는 별도의 포트번호 가짐)
  frontend:
    build: ./frontend
    ports:
      - 3000:3000
  # 호스트명 (각 호스트는 별도의 포트번호 가짐)
  backend:
    build: ./backend
    ports:
      - 3001:3001
    environment:
      DB_URL: mongodb://database/vidly
  # 호스트명 (각 호스트는 별도의 포트번호 가짐)
  database:
    image: mongo:4.0-xenial
    ports:
      - 27017:27017
    volumes:
      - vidly: /data/db
volumes:
  vidly:

🎈 docker compose command

image 빌드 생성 및 관리
docker-compose build : build 키로 지정된 것들 대상
docker-compose pull : hub에서 이미지 읽어옴
docker images : 각 개별 이미지 앞에 폴더이름을 prefix로 생성 (hub에서 읽은 것 제외)
docker-compose images : 컨테이너에 의해 실행되고 있는 이미지들 보여줌
docker-compose push : hub로 이미지 푸시
docker-compose up : #build->create->start

postgres 실행 시 아래 2개의 환경변수를 넘겨주어야 함

  • POSTGRES_USER: 'postgres'
  • POSTGRES_PASSWORD: 'postgres'

docker-compose.yaml로 voting-application 작성

# v2 and v3 are now combined!
# docker-compose v1.27+ required
# % docker-compose version
# Docker Compose version v2.15.1
services:
  vote:
    build: ./vote
    # use python rather than gunicorn for local dev
    command: python app.py
    ports:
      - "5001:80"

  result:
    build: ./result
    # use nodemon rather than node for local dev
    entrypoint: nodemon server.js
    ports:
      - "5002:80"

  worker:
    build: ./worker

  redis:
    image: redis:alpine
  
  db:
    image: postgres:15-alpine
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
    # 데이터 저장 volumes 추가
	volues:
      - db-data:/var/lib/postgrsql/data
      
# 각 서비스 별 네트워크 지정해 보안 높이기
networks:
  back-tier: (redis, worker, db, vote, result)
  front-tier: (vote, result)

# 컨테이너 서비스의 데이터가 계속 persistent되도록 지정
volumes:
  db-data:
  
  

✅ 최종 파일 (voting-application)

# version is now using "compose spec"
# v2 and v3 are now combined!
# docker-compose v1.27+ required

services:
  vote:
    build: ./vote
    # use python rather than gunicorn for local dev
    command: python app.py
    # 먼저 실행되어야 하는 요소 (서비스)
    depends_on:
      redis:
        condition: service_healthy
    # 해당 서비스의 건강 체크
    healthcheck: 
      test: ["CMD", "curl", "-f", "http://localhost"]
      interval: 15s
      timeout: 5s
      retries: 3
      start_period: 10s
    volumes:
     - ./vote:/app
    ports:
      - "5000:80"
    networks:
      - front-tier
      - back-tier

  result:
    build: ./result
    # use nodemon rather than node for local dev
    # 진입점 기록
    entrypoint: nodemon server.js
    depends_on:
      db:
        condition: service_healthy 
    volumes:
      - ./result:/app
    ports:
      - "5001:80"
      - "5858:5858"
    networks:
      - front-tier
      - back-tier

  worker:
    # 더 많은 빌드관련 정보 넘겨주기 가능
    build:
      context: ./worker
    depends_on:
      redis:
        condition: service_healthy 
      db:
        condition: service_healthy 
    networks:
      - back-tier

  redis:
    image: redis:alpine
    volumes:
      - "./healthchecks:/healthchecks"
    healthcheck:
      test: /healthchecks/redis.sh
      interval: "5s"
    networks:
      - back-tier

  db:
    image: postgres:15-alpine
    # postgres DB 환경 설정
    environment:
      POSTGRES_USER: "postgres"
      POSTGRES_PASSWORD: "postgres"
    # Host volume과 named volume 사용
    volumes:
      - "db-data:/var/lib/postgresql/data"
      - "./healthchecks:/healthchecks"
    healthcheck:
      test: /healthchecks/postgres.sh
      interval: "5s"
    networks:
      - back-tier

  # this service runs once to seed the database with votes
  # it won't run unless you specify the "seed" profile
  # docker compose --profile seed up -d
  seed:
    build: ./seed-data
    profiles: ["seed"]
    depends_on:
      vote:
        condition: service_healthy 
    networks:
      - front-tier
    restart: "no"

volumes:
  db-data:

networks:
  front-tier:
  back-tier:
profile
To be a DataScientist

0개의 댓글