소프트웨어 개발 요소/플랫폼

[Docker] Docker 기본 사용법

숩니따 2024. 4. 5. 14:41

도커란?

애플리케이션을 개발, 배포, 실행할 수 있는 오픈 플랫폼으로, 도커를 사용하면 애플리케이션을 인프라로부터 분리하여 소프트웨어를 빠르게 제공할 수 있다. 도커는 애플리케이션을 컨테이너라는 격리된 환경에서 실행할 수 있게 해주며, 이는 여러 컨테이너를 동시에 호스트에서 실행할 수 있게 해준다.

관련 용어

이미지(Image)

  • 컨테이너를 생성하기 위한 읽기 전용 템플릿
  • 이미지는 애플리케이션을 실행하는 데 필요한 모든 것(코드, 런타임, 라이브러리, 환경 변수 등)을 포함
  • 일반적으로 이미지는 다른 이미지를 기반으로 하여 추가 사용자 정의가 이루어짐

컨테이너(Container)

  • 이미지를 실행한 인스턴스
  • 컨테이너는 도커 API나 CLI를 사용하여 생성, 시작, 정지, 이동, 삭제할 수 있음
  • 컨테이너는 네트워크, 스토리지 등과 연결될 수 있으며, 컨테이너의 상태를 기반으로 새 이미지를 생성할 수도 있음
  • 컨테이너는 기본적으로 다른 컨테이너나 호스트 머신으로부터 상당히 격리되어있음

도커 컴포즈(Docker Compose)

  • 여러 컨테이너를 정의하고 실행하기 위한 도구
  • docker-compose.yml이라는 YAML 파일을 사용하여 애플리케이션의 서비스, 네트워크, 볼륨 등을 구성할 수 있음
  • 도커 컴포즈를 사용하면 명령 한 줄로 모든 서비스를 빌드하고 시작할 수 있어 복잡한 애플리케이션을 쉽게 관리할 수 있음

네트워크(Network)

  • 도커 네트워크는 컨테이너가 서로 통신하고 외부 네트워크와 연결될 수 있도록 하는 메커니즘을 제공
  • 도커는 여러 가지 네트워크 드라이버를 제공하여 다양한 네트워킹 요구 사항을 충족시킴
    • bridge 네트워크는 도커가 설치된 단일 호스트 내의 컨테이너 간 통신을 위해 사용
    • overlay 네트워크는 여러 도커 호스트에 걸쳐 있는 컨테이너 간 통신을 가능하게 함

볼륨(Volume)

  • 볼륨은 데이터를 컨테이너 외부에 저장하여 컨테이너가 삭제되거나 재시작될 때도 데이터를 유지할 수 있게 해주는 메커니즘
  • 볼륨은 컨테이너와 독립적으로 존재하며, 하나 이상의 컨테이너에 마운트될 수 있으며, 이를 통해 데이터의 영속성과 공유를 쉽게 관리할 수 있음

도커 파일(Dockerfile)

  • 도커 파일은 도커 이미지를 빌드하기 위한 명령어와 설정을 포함하는 텍스트 파일
  • FROM, RUN, COPY, CMD 등의 지시어를 사용하여 이미지를 어떻게 생성할지 정의
  • 도커 파일을 사용하면 애플리케이션과 그 의존성을 포함하는 이미지를 쉽게 빌드하고 재현할 수 있음

레지스트리(Docker Registry)

  • 도커 레지스트리는 도커 이미지를 저장하고 공유하기 위한 서비스
  • Docker Hub는 가장 널리 사용되는 공개 도커 레지스트리로, 수많은 공개 이미지를 제공하며, 개인 레지스트리를 설정하여 비공개 이미지를 관리할 수도 있음
  • 레지스트리를 사용하면 이미지를 쉽게 배포하고 버전 관리할 수 있습니다

기본 명령어

  • 버전 확인: docker --version 명령어로 도커가 설치되어 있는지와 버전을 확인
  • 이미지 검색: docker search [이미지 이름] 명령어로 도커 허브에서 이미지를 검색
  • 이미지 다운로드: docker pull [이미지 이름] 명령어로 도커 허브에서 이미지를 다운로드
  • 이미지 목록 확인: docker images 명령어로 로컬 시스템에 다운로드된 도커 이미지 목록을 확인합니다.
  • 이미지 삭제: docker rmi [이미지 ID 또는 이름] 명령어로 도커 이미지 삭제
  • 컨테이너 실행: docker run [옵션] [이미지 이름] 명령어로 컨테이너를 실행
  • **# 예시 docker run -d -p 80:80 nginx # -d 백그라운드 모드 실행 # -p 80:80 호스트의 80번 포트와 컨테이너의 80번 포트 연결**
  • 실행 중인 컨테이너 목록 확인: docker ps 명령어로 현재 실행 중인 모든 컨테이너를 확인
  • 컨테이너 중지: docker stop [컨테이너 ID 또는 이름] 명령어로 컨테이너를 중지
  • 컨테이너 삭제: docker rm [컨테이너 ID 또는 이름] 명령어로 컨테이너를 삭제

도커 컴포즈 사용하기

  • 도커 컴포즈 설치 확인: Docker Desktop을 설치하면 대부분의 경우 Docker Compose도 함께 설치되며, 설치를 확인하려면 터미널에서 **docker-compose --version**을 입력
  • docker-compose.yaml 파일 사용: 프로젝트 디렉토리로 이동한 다음, docker-compose up -d --build 명령어를 실행하여 서비스를 시작하는데, 이 명령어는 docker-compose.yaml 파일에 정의된 모든 서비스를 빌드하고 실행

로컬 파일 도커화

1. Docker 설치

도커가 로컬 시스템에 설치되어 있지 않다면, 공식 도커 웹사이트에서 지침에 따라 설치

2. 파일 작성

Docker 파일

단일 이미지 정의

  • 목적: Dockerfile은 도커 이미지를 빌드하기 위한 설정 파일으로, 이 파일 안에는 이미지를 만들기 위한 기본 이미지, 실행할 모든 명령어, 추가할 파일 등이 명시
  • 구조: 단순 텍스트 파일로, 도커 이미지를 만들기 위한 순차적인 명령어들을 포함
  • Dockerfile 작성: 애플리케이션을 컨테이너화하기 위해 Dockerfile을 작성
  • # 예시 # Python 애플리케이션 버전, 사용하는 언어나 프레임워크에 따라 조정 필요 # 베이스 이미지 지정 FROM python:3.8 # 작업 디렉토리 설정 WORKDIR /app # 의존성 파일 복사 및 설치 COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # 애플리케이션 코드 복사 COPY . . # 애플리케이션 실행 명령어 CMD ["python", "./your-app.py"]
  • 이미지 빌드: Dockerfile이 준비되면, docker build -t [빌드할 이미지 이름] . 명령어를 사용하여 도커 이미지를 빌드
  • 컨테이너 실행: 이미지 빌드가 완료되면, 다음 명령어로 컨테이너를 실행할 수 있습니다:
  • docker run -d -p 8000:8000 your-app-name # d 옵션은 컨테이너를 백그라운드에서 실행하고, -p 옵션은 호스트와 컨테이너 간의 포트를 매핑합니다. 이 예시에서는 컨테이너의 8000 포트를 호스트의 8000 포트에 연결합니다.

docker -compose.yml 파일

여러 컨테이너를 포함하는 애플리케이션 정의하고 실행

  • 목적: docker-compose.yml은 여러 컨테이너를 함께 구성하고 관리하기 위한 설정 파일으로, 이 파일을 통해 서비스, 네트워크, 볼륨 등을 정의하고, 여러 컨테이너 간의 관계를 설정
  • 구조: YAML 형식으로 작성되며, 여러 서비스(컨테이너)의 설정을 포함
  • 생성
    • 자동 생성
      1. 프로젝트 디렉토리에서 터미널을 열고 docker init 명령어를 실행
      2. 화면에 나타나는 프롬프트에 따라 프로젝트 유형을 선택하고 필요한 설정을 입력
      3. docker init 명령어가 Dockerfile과 docker-compose.yml 파일을 프로젝트 디렉토리에 생성
    • 수동 생성
      1. docker-compose.yml 파일의 구조
      2. version: '3' services: web: image: example/mywebapp # 용자 정의 이미지를 사용 ports: - "5000:5000" # 5000 포트를 노출 volumes: - .:/code # 현재 디렉토리를 컨테이너의 /code에 마운트 depends_on: - db # db 서비스에 대한 의존성을 정의 db: image: postgres # postgres 이미지를 사용 environment: POSTGRES_PASSWORD: example # 환경 변수로 데이터베이스 비밀번호를 설정
  • 사용: docker-compose up 명령어로 모든 서비스를 시작

정리

각각의 프레임워크나 애플리케이션 컴포넌트(예: 백엔드, 프론트엔드, 데이터베이스 등)를 위한 Dockerfile(개별 컨테이너의 빌드 과정을 정의)을 작성하여 개별적으로 컨테이너화

이러한 컨테이너들을 함께 조합하여 하나의 통합된 애플리케이션으로 운영하기 위해 docker-compose.yml 파일(여러 컨테이너를 어떻게 함께 실행할지를 정의)을 사용