섹션 10 - Docker & 컨테이너 - 요약

컨테이너

  • 정의: 코드 + 코드를 실행하는 데 필요한 환경

  • 하나의 task에 집중

    • ex. 백엔드 컨테이너, 프론트 컨테이너, DB 컨테이너

  • 공유 및 재생산 가능

  • Stateless: 볼륨을 제외하고 컨테이너가 종료될 때 컨테이너의 모든 데이터는 사라짐

  • 컨테이너는 이미지로 생성됨

    • 이미지는 Dockerfile로 만들거나 Docker Hub에서 가져옴

    • 즉, 하나의 이미지로 다중 컨테이너 실행 가능

    • 이미지는 한번 생성되면 변하지 않음 Read-only

    • 이미지는 Layer 기반 구조 -> 캐시 기능

    • 컨테이너는 이미지 위에 올라가는 레이어

핵심 명령어

  • 이미지 빌드: docker build -t NAME:TAG .

  • 이미지를 컨테이너로 실행: docker run --name NAME --rm -d IMAGE

  • Docker Hub로 이미지 푸시: docker push REPOSITORY/NAME:TAG

  • Docker Hub에서 이미지 풀: docker pull REPOSITORY/NAME:TAG

컨테이너에서 데이터 다루기

  • 컨테이너는 호스트 머신 파일시스템과 분리된 고유의 파일시스템을 가진다.

    • 바인드 마운트를 통해 호스트 머신 폴더와 연결

    • -v /local/path:/container/path

  • 컨테이너가 삭제되면 데이터는 사라진다.

    • 볼륨을 사용해서 컨테이너에서 생성된 데이터를 저장

    • 로컬 시스템의 폴더로 미러링 되지만 해당 경로를 알 수 없음

    • 명명된 볼륨: 데이터 유지

    • 익명 볼륨: 컨테이너 설정에 의해 오버라이트 되어지는 데이터를 저장하는데 유용

    • -v NAME:/container/path

네트워크 통신

  • HTTP 통신 방법

    • 컨테이너 IP 주소와 통신 But 불편

    • 도커 네트워크를 생성해서 컨테이너 추가 -> 컨테이너 이름으로 통신 가능

도커 컴포즈

  • 컨테이너를 실행할 때 필요한 많은 명령어를 도커 컴포즈에 정리 가능

    • 도커 컴포즈를 통해 컨테이너 시작 및 초기화

  • 다중 컨테이너 환경에 유용

  • docker-compose up

  • docker-compose down

로컬 호스트 vs. 리모트 호스트

  • 두 호스트에서 모두 사용하기 쉬운 이유: 격리, 캡슐, 재생산 가능

  • 로컬에서 개발 작업하며 도커를 사용하면 다른 프로젝트들의 런타임 환경 및 버전과 분리할 수 있음

  • 리모트 호스트에서도 쉽게 컨테이너를 업데이트할 수 있음

배포 시 주의사항

  • 바인드 마운트 대신 일반 볼륨 또는 COPY 명령어를 사용해야 함

    • 바인드 마운트는 실행 중인 컨테이너로 변경된 소스 코드 또는 일부 구성을 수시로 미러링하기 위한 로컬 개방용 도구

  • 다중/단일 컨테이너에 여러 호스트가 필요할 수도 있음

    • 이 경우 docker run 및 도커 컴포즈만으로는 충분하지 않음

    • 물론 같은 호스트에서 여러 컨테이너를 실행할 수도 있음 (애플리케이션, 하드웨어, 트래픽 사항에 따라)

  • Multi-stage builds

    • 단일 Dockerfile에서 여러 빌드 단계를 정의

  • 통제력 vs. 편의성

    • 보안과도 관련

    • 통제를 할 수 있다는 건 모든 것을 책임져야 한다는 것(보안 포함)

    • 관리형 서비스를 사용하여 통제력은 떨어지지만 요구되는 책임을 줄일 수 있음

Last updated