Cloud & DevOps/Docker

[Docker] Docker 개념

데이터 세상 2021. 12. 29. 20:11

Docker

  • 눅스의 응용 프로그램들을 소프트웨어 컨테이너 안에 배치시키는 일을 자동화하는 오픈 소스 프로젝트
  • 마이크로서비스 아키텍쳐의 장점은 최대한 살리고 CI/CD를 통해서 효과적인 개발환경을 만들고 싶다면 모든 서비스 팀에게 Docker를 도입하는 것이 효과적입니다.
  • Docker 환경에서 새로운 빌드 환경을 구축할 경우 개발자는 컨테이너 이미지만 실행하여 애플리케이션을 바로 확인 및 동일한 환경에서 테스트 할 수 있으며, 동일한 방식으로 빌드서버에도 적용할 수 있습니다.
  • 테스트 환경과 프로덕션 환경을 분리해서 운영하기 위해서는 단순히 Docker Compose 혹은 Dockerfile 설정을 일부 변경하여 실행 및 테스트 할 수 있으며, 트래픽에 대한 분산처리도 유연하게 대응할 수 있습니다.

 

Docker를 활용한 빌드 서버 작업 과정

  • 코드를 빌드합니다.
  • 테스트 코드를 통해서 작성된 코드의 문제점이 없는지 확인합니다.
  • 컨테이너 이미지를 빌드합니다.
  • 실행 중인 컨테이너에서 기능 테스트를 실행하여 컨테이너 이미지를 테스트합니다. 이를 통해 Docker 파일의 오류를 찾을 수 있습니다.
  • 컨테이너 레지스트리에 이미지를 푸시합니다.
  • 새 이미지로 테스트 클러스터를 업데이트하여 통합 테스트를 진행합니다.

 

1. Docker 기본 개념

Docker

Container

  • 격리된 공간에서 프로세스가 동작하는 기술
  • VMWare, VirtualBox: 기존 가상머신은 Host OS 위에 Guest OS 전체를 가상화하여 사용하는 방식
  • Docker Container: 프로세스 격리

Image

  • 컨테이너 실행에 필요한 파일과 설정값 등을 포함하고 있는 것
  •  Docker hub에 등록하거나 Docker Registry 저장소를 직접 만들어 관리

Docker Compose

  •  복잡한 설정을 쉽게 관리하기 위해 YAML방식의 설정파일을 이용한 Docker Compose라는 툴을 제공

Dockerfile Command

  • 공식문서: Docker image를 생성하는데 사용하는 파일
  • FROM: 베이스 이미지 지정
  • MAINTAINER: Dockerfile 관리 주체 및 이메일 정보 등
  • COPY: 파일이나 디렉토리를 이미지로 복사
  • ADD: COPY와 유사하나 src에 파일 대신 URL 입력 또는 압축 파일을 입력할 경우 자동 압축 해제 지원
  • RUN: 명령어 실행
  • CMD: Docker Container 실행되었을 때 실행되는 명령어를 정의, 멀티 명령어는 run.sh 파일을 작성 후 실행 등 활용
  • WORKDIR: 명령어들이 실행된 기본 디렉토리 설정
  • EXPOSE: Docker Container 실행되었을 때 요청을 기다리고 있는 포트 지정
  • VOLUME: Container 외부에 파일을 시스템을 마운트 할 때 사용
  • ENV: Container에서 사용할 환경변수 지정

Docker Build

  • 임시 컨테이너 생성 > 명령어 수행 > 이미지로 저장 > 임시 컨테이너 삭제 > 새로 만든 이미지 기반 임시 컨테이너 생성 > 명령어 수행 > 이미지로 저장 > 임시 컨테이너 삭제 > … 의 과정을 계속해서 반복

Docker Command

컨테이너 목록 확인:
docker ps -a
컨테이너 중지:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
컨테이너 제거:
docker rm [OPTIONS] CONTAINER [CONTAINER...]
이미지 목록 확인:
docker images [OPTIONS] [REPOSITORY[:TAG]]
이미지 다운로드:
docker pull  [OPTIONS] NAME[:TAG|@DIGEST]
이미지 삭제:
docker rmi [OPTIONS] IMAGE [IMAGE...]
컨테이너 명령어 실행:
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
 
2 Docker Deployment

Container Update

  • 기존 컨테이너 삭제 후 새이미지 기반의 새 컨테이너 실행
  • 컨테이너에서 생성된 파일이 삭제되기 떄문에 유지 필요 데이터는 외부 스토리지에 저장하도록 함

Docker Deployment

 

3. Docker Data Management

Volume Container

  • https://joont92.github.io/docker/volume-container-%EC%B6%94%EA%B0%80%ED%95%98%EA%B8%B0/
  • 데이터를 저장하는 것이 목적인 Container
  • Docker(Linux 기준 /var/lib/docker/volume/)가 관리하는 Host File System의 일부에 Data 저장
  • Non-Docker 프로세스들이 File System의 해당 부분을 수정해서는 안됨
  • Host OS의 디렉토리를 마운트해서 데이터 관리할 수도 있지만, 이는 Host 디렉토리에 의존성이 생기고 데이터에 잘못된 사용으로 부정적 영향을 줄 수 있음
  • 사용 예
    • 실행 중인 여러 Container 간에 데이터 공유가 필요한 경우
    • Docker Host가 특정 디렉토리나 파일 구조를 가질 수 없는 경우
    • 로컬 외의 원격 Host 및 Cloud Provider에 Container 데이터를 저장하려는 경우

Bind Mounts

  • https://tttsss77.tistory.com/161
  • Host System의 어디에든지 저장
  • Docker Host 또는 Docker Container의 Non-Docker 프로세서들이 언제든지 저장된 데이터 수정 가능
  • 매우 효과적이지만, Host Machine의 File System 디렉토리 구조에 의존적
  • Docker CLI 명령어로 bind mount 관리 불가
  • 사용 예
    • Host Machine에서 Container로 설정 파일을 공유해야 하는 경우
    • Docker Host 개발 환경과 Container 간 소스코드 또는 빌드된 아티팩을 공유
    • Docker Host의 파일 또는 디렉토리 구조가 Container가 요구사하는 Bind mount와 일치하는 경우

TMPFS Mounts

  • Host System의 메모리에만 데이터 저장
  • 비 영구적 상태 정보나 민감 정보들 같이 Container의 생명주기와 맞춰 데이터 보존하고자 할 때 사용

 


References

https://aws.amazon.com/ko/docker/

 

 

반응형