본문 바로가기

Docker

Docker란?

728x90
  • 리눅스 기반의 인기 있는 오픈 소스 컨테이너 엔진
  • 컨테이너(container)는 애플리케이션이 실행하는 데 필요한 모든 것을 제공하는 논리적 패키징 메커니즘을 의미
  • 도커 동작 방식을 이해하기 위해서는 도커 엔진이 전체 도커 시스템의 핵심부

 

Docker Engine(도커 엔진)이란?

  • 도커 엔진은 클라이언트-서버 패턴 아키텍처를 따르는 애플리케이션으로 호스트 머신에 설치되며 서버, REST API, 명령줄 인터페이스(CLI)라는 세 가지 중요한 구성 요소를 포함
  • 도커 클라이언트
    • 도커 사용자는 클라이언트로 도커와 상호작용
    • 도커 리모트 API, 도커 CLI
      • 도커 명령 실행 시 도커 데몬에 명령 전송
  • 도커 볼륨
    • 도커가 생성하고 컨테이너가 사용한 데이터를 저장하는 데 적합한 메커니즘
    • 도커 API나 CLI로 관리
  • 도커 호스트/서버
    • 도커 데몬
      • 도커 이미지를 생성하고 관리하는 dockered라는 서버
      • REST API가 데몬에 명령을 보내고 CLI 클라이언트가 도커 명령 입력
    • 컨테이너
      • docker run 명령이 실행되고 수행되면 도커 이미지가 컨테이너를 생성
      • 애플리케이션과 주변 환경은 이 컨테이너에서 실행
      • 도커 컨테이너를 시작, 삭제, 중지 하려면 도커 API 또는 CLI 사용
    • 이미지
      • 도커 컨테이너를 생성하는 몇 가지 명령이 포함된 읽기 전용 템플릿
      • 도커 허브에서 가져올 수 있고, 그대로 사용하거나 추가 명령으로 수정 가능
      • Dockerfile을 사용하여 새로운 이미지 생성 가능
  • 도커 레지스트리
    • 도커 이미지가 저장
    • 도커 허브, 사설 레지스트리
      • 도커 허브(기본 공개 레지스트리)나 사설 레지스트리(Private Registry)에서 도커 이미지를 내려받음
  • 도커 네트워크
    • 컨테이너를 가능한 많은 네트워크에 연결 가능
    • 네트워크를 격리된 컨테이너의 통신 수단으로 생각할 수 있고 5가지 네트워크 드라이버 타입을 가짐
      • bridge, host, overlay, none, macvlan

 

Dockfiles

  • 도커 클라이언트가 이미지를 생성하고 준비하기 위해 호출하는 데 필요한 지시어(instructions)와 명령어(commands)들이 포함된 단순 테스트 파일
  • 이 파일은 이미지 생성 과정을 자동화
  • Dockerfile → (build 명령) → 이미지 → (run 명령) → 도커 컨테이너
명령어 설명
FROM 빌드 프로세스를 시작하는 기본 이미지를 정의
→ 즉, 도커 런타임에 사용할 도커 이미지를 지정
LABEL 도커 이미지에 메타데이터를 추가 (키, 밸류)
ARG 사용자가 docker build 명령을 사용하여 빌더에 전달할 수 있는 변수를 정의
COPY 원본의 새 파일, 디렉터리 또는 리모트 파일 URL을 복사하고 지정된 대상 경로에 생성 중인 이미지의 파일 시스템에 추가
Ex) COPY ${JAR_FILE} app.jar
VOLUME 컨테이너의 마운트 지점 생성
→ 동일한 이미지를 사용해서 새 컨테이너를 만들 때 이전 볼륨과 격리되는 새 볼륨 생성
RUN 명령과 해당 매개변수를 받아 이미지에서 컨테이너를 실행
→ 대개 소프트웨어 패키지를 설치하는 데 이 명령어를 사용
CMD ENTRYPOINT에 매개변수를 제공
→ docker run과 유사하지만 컨테이너가 인스턴스화된 후에만 실행 가능
ADD 원천에서 파일을 복사하고 컨테이너 대상 위치에 추가
ENTRYPOINT 실행 파일로 실행할 컨테이너를 구성
ENV 환경 변수 설정

 

Docker compose

  • 도커 컴포즈(Docker Compose)는 서비스 설계와 구축이 용이한 스크립트를 작성하여 도커를 더 쉽게 사용하게 도움
  • 도커 컴포즈를 사용하면 여러 컨테이너를 하나의 서비스로 실행하거나 다른 컨테이너를 동시에 생성 가능
  • 도커 컴포즈 사용 순서
    1. 도커 컴포즈를 설치
      • 도구를 설치하려면 Install Docker Compose | Docker Documentation을 참고
    2. YAML 파일을 생성하여 애플리케이션 서비스를 구성
      • 파일 이름을 docker-compose. yml로 지정
    3. docker-compose config 명령을 사용하여 파일 유효성을 확인
    4. docker-compose up 명령을 사용하여 서비스를 시작
  • docker-compose.yml 파일 예
version: <docker-compose-version> 
services: 
    database:
        image: <database-docker-image-name> 
        ports: 
            - "<databasePort>:<databasePort>" 
    environment: 
        POSTGRES_USER: <databaseUser>
        POSTGRES_PASSWORD: <databasePassword>
        POSTGRES_DB: <databaseName>

    <service-name>:
        image: <service-docker-image-name> 
        ports: 
            - "<applicationPort>:<applicationPort>" 
        environment: 
            PROFILE: <profile-name> 
            DATABASESERVER_PORT: "<databasePort>"
        container_name: <container_name>
            networks:
            backend:
            aliases:
                - "alias" 
networks:
    backend:
        driver: bridge

 

  • Docker compose 지시어
지시어 설명
version 도커 컴포즈 도구의 버전을 지정
service 배포할 서비스를 지정
→ 서비스 이름은 도커 인스턴스에 대한 DNS 엔트리이며, 다른 서비스에서 액세스하는 데 사용
image 특정 이미지를 사용하여 컨테이너를 실행하도록 지정
port 시작한 도커 컨테이너가 외부에 노출할 포트 번호를 지정
→ 내부 및 외부 포트를 매핑
environment 시작하는 도커 이미지에 환경 변수를 전달
network 복잡한 토폴로지를 만들 수 있도록 커스텀 네트워크를 지정
→ 타입(host, overlay, macvlan, none)을 지정하지 않았다면 디폴트 타입은 bridge
→ 브리지(bridge) 네트워크를 사용하면 동일한 네트워크 내 컨테이너 연결을 관리 가능 + 동일한 도커 데몬 호스트에서 실행되는 컨테이너에만 적용
alias 네트워크 내 서비스에 대한 호스트 별명을 지정

 

  • Docker compose 명령어
명령어 설명
docker-compose up -d 애플리케이션 이미지를 빌드하고 정의된 서비스를 시작
→ 이 명령은 필요한 모든 이미지를 내려받아 배포하고 컨테이너를 시작
→ -d 매개변수는 백그라운드 모드에서 도커를 실행하도록 지정
docker-compose logs 최신 배포에 대한 모든 정보 확인 가능
docker-compose logs <service_id> 특정 서비스에 대한 로그 확인 가능
→ 예를 들어 라이선싱 서비스 배포를 보려면 docker-compose logs licensingservice 명령을 사용
docker-compose ps 시스템에 배포한 모든 컨테이너 목록을 출력
docker-compose stop 서비스를 마치고 나서 서비스를 중지
→ 컨테이너도 중지
docker-compose down 모든 것을 종료하고 컨테이너도 모두 제거
728x90

'Docker' 카테고리의 다른 글

[Docker Compose] Spring Boot + MySQL + Redis  (0) 2024.08.21
Docker compose 설정 및 각종 테스트  (0) 2024.08.09
Docker 설치 및 환경 설정  (0) 2024.08.09
컨테이너 vs 가상머신(VM)  (0) 2024.08.08