Docker

Docker 개념

원2 2024. 7. 4. 18:20
728x90
반응형

컨테이너란?

컨테이너는 앱의 각 구성 요소에 대한 격리된 프로세스

각 구성 요소(프런트엔드 React, Python API엔진, 데이터베이스)는 자체 격리된 환경에서 실행되며, 머신의 다른 모든 것과 완전히 격리됨

 

독립형 : 각 컨테이너는 호스트 머신에 미리 설치된 종속성에 의존하지 않고도 작동하는 데 필요한 모든 것을 갖추고 있음

격리됨 : 컨테이너는 격리되어 실행되므로 호스트와 다른 컨테이너에 미치는 영향이 최소화되어 어플 보안 강화

독립적 : 각 컨테이너는 독립적으로 관리, 컨테이너 하나를 삭제해도 다른 컨테이너에는 영향 없음

휴대성 : 컨테이너는 어디에서나 실행가능

 

컨테이너 vs 가상 머신(VM)

VM은 자체 커널, 하드웨어 드라이버, 프로그램 및 어플을 갖춘 전체 운영체제

단일 어플만 분리하기 위해 VM을 스핀업 하는 것은 많은 오버헤드임

*오버헤드 : 어떤 처리를 하기 위해 들어가는 간접적인 처리 시간 · 메모리등

 

컨테이너는 단순히 실행하는데 필요한 모든 파일이 있는 격리된 프로세스

여러 컨테이너를 실행하면 모두 동일한 커널을 공유하여 더 적은 인프라에서 더 많은 어플을 실행할 수 있음

 

 

이미지란?

컨테이너를 실행하는데 필요한 모든 파일, 바이너리, 라이브러리 및 구성을 포함하는 표준화된 패키지

PostgresSQL 이미지의 경우 해당 이미지는 데이터베이스 바이너리, 구성 파일 및 기타 종속성을 패키징

컨테이너 이미지는 레이어로 구성됨

 

이미지의 중요한 두 가지 원칙

1. 이미지는 변경할 수 없다.

- 이미지가 생성되면 수정할 수없음, 새 이미지를 만들거나 그 위에 변경 사항을 추가할 수만 있음

2. 컨테이너 이미지는 레이어로 구성된다.

- 각 레이어는 파일을 추가, 제거 또는 수정하는 파일 시스템 변경 세트를 나타냄

 

이 두 가지 원칙을 사용하면 기존 이미지를 확장하거나 추가할 수 있음

 

이미지 찾기 - Docker Hub

 

레지스트리란?

이미지 레지스트리는 컨테이너 이미지를 저장하고 공유하기 위한 중앙 집중형 위치

Docker Hub, Amazon, Google 등등 있음

 

레지스트리 vs 리포지토리

레지스트리 : 컨테이너 이미지를 저장하고 관리하는 중앙 집중형 위치

리포지토리 : 레지스트리 내의 관련 컨테이너 이미지 모음. 프로젝트 기준 이미지를 구성하는 폴더라고 생각

*각 리포지토리에는 하나 이상의 컨테이너 이미지가 들어 있음

https://docs.docker.com/guides/docker-concepts/the-basics/what-is-a-registry/

 

Docker Compose 란?

모든 컨테이너와 해당 구성을 단일 YAML 파일에 정의하여 단일 명령으로 실행 가능하게 하는것

 

*Dockerfile 과 Compose 파일

Dockerfile 은 컨테이너 이미지를 빌드하는 지침을 제공

Compose 파일은 실행 중인 컨테이너를 정의

Compose 파일은 특정 서비스에 사용할 이미지를 빌드하기 위해 Dockerfile 을 참조하는 경우가 많음

 

이미지레이어

이미지의 각 레이어에는 파일 시스템 변경 사항(추가, 삭제 또는 수정) 세트가 포함

 

1. 첫 번째 레이어는 기본 명령과 같은 apt와 같은 패키지 관리자를 추가함

2. 두 번째 레이어는 종속성 관리를 위한 Python 런타임과 pip를 설치

3. 세 번째 레이어는 어플의 특정 requirements.txt 파일을 복사

4. 네 번째 레이어는 해당 어플의 특정 종속성을 설치

5. 다섯 번째 레이어는 어플의 실제 소스 코드를 복사

https://docs.docker.com/guides/docker-concepts/building-images/understanding-image-layers/

 

예를 들어 다른 Python 어플을 만들고 싶다고 가정할 때 레이어링 덕분에 동일한 Python 기반을 활용 가능

- 빌드가 빨라지고 이미지를 배포하는데 필요한 저장 공간과 대역폭이 줄어듬

https://docs.docker.com/guides/docker-concepts/building-images/understanding-image-layers/

레이어를 사용하면 다른 레이어의 기본 레이어를 재사용하여 이미지를 확장하고 어플에 필요 데이터만 추가 가능

 

Dockerfile 작성하기

Dockerfile은 컨테이너 이미지를 만드는데 사용되는 텍스트 기반 문서

실행할 명령, 복사할 파일, 시작 명령 등에 대한 이미지 빌더에 대한 지침 제공

FROM python:3.12
WORKDIR /usr/local/app

# 애플리케이션 종속성 설치
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

# 소스 코드에 복사
COPY src ./src
EXPOSE 5000

# 컨테이너가 루트 사용자로 실행되지 않도록 앱 사용자 설정
RUN useradd app
USER app

CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8080"]

 

일반적인 지침

  • FROM <image> - 빌드가 확장할 기본 이미지를 지정
  • WORKDIR <path> - 파일이 복사되고 명령이 실행되는 이미지의 "작업 디렉토리" 또는 경로 지정
  • COPY <host-path> <image-path> - 빌더에게 호스트에서 파일을 복사하여 컨테이너 이미지에 넣으라고 지시
  • RUN <command> - 빌더에게 지정된 명령을 실행하라고 지시
  • ENV <name> <value> - 실행 중인 컨테이너가 사용할 환경 변수를 설정
  • EXPOSE <port-number> - 이미지가 노출하고자 하는 포트를 나타내는 구성을 이미지에 설정
  • USER <user-or-uid> - 이후의 모든 명령어에 대한 기본 사용자를 설정
  • CMD [ "<command>", "<arg1>" ] - 이 이미지를 사용하는 컨테이너가 실행할 기본 명령 설정

https://docs.docker.com/reference/dockerfile/

 

Dockerfile reference

Find all the available commands you can use in a Dockerfile and learn how to use them, including COPY, ARG, ENTRYPOINT, and more.

docs.docker.com

 

docker init

초기화를 사용하여 빠르게 프로젝트를 컨테이너화 시키기

https://docs.docker.com/reference/cli/docker/init/#description

 

docker init

 

docs.docker.com

 

 

 

 

JAVA 개발용 도커 가이드

https://docs.docker.com/language/java/

 

Java language-specific guide

Containerize Java apps using Docker

docs.docker.com

 

728x90
반응형

'Docker' 카테고리의 다른 글

docker 컨테이너 ip 주소 확인  (0) 2024.07.10
도커 컨테이너 실행 명령어  (0) 2024.07.10
docker postgres 스키마 목록 조회  (0) 2024.07.10
Docker 개요  (0) 2024.07.04
Docker in IntelliJ  (7) 2024.07.03