DevOps/Docker

[Docker] Docker, Docker-Compose, Dockerfile

SeungbeomKim 2023. 8. 31. 17:17
반응형

 

일반적으로 Docker는 단일 컨테이너 기반의 응용 프로그램을 실행하고 관리하는 도구입니다. 

여러 개의 컨테이너로 구성된 복잡한 애플리케이션을 동시에 실행할 때는 Docker-compose를 이용하게 됩니다. 

우선, Docker에서 애플리케이션이 구동되는 과정에 대해 상세하게 설명드리겠습니다.

 

Docker는 컨테이너를 만들고 배포하고 구동하기 위한 기술입니다. 이제 컨테이너가 어떻게 만들어지는지 알아보기 전에 Linux OS에서 Docker를 사용하는 방법 2가지에 대해 간단히 설명드리겠습니다.

 

  1. VirtualBox, VMware 같은 VM위에 Linux OS를 설치하고 Docker 실행
  2. Docker Desktop처럼 Docker를 실행하는데 필요한 Linux OS를 포함하는 패키지 설치 

 

Container를 만들기 위한 필요한 2가지

  1.  Dockerfile
  2.  Image

 

Dockerfile을 build하면 Image가 생성됩니다. 생성된 Image를 Docker-hub(images를 저장, 관리 및 공유 기능을 제공하는 registry)와 같은 곳에 Push합니다. 생성된 image를 필요한 Server에서 가져오고(Pull), 이를 실행하면 Container가 생성되는 구조입니다. 

 

 

Dockerfile

  •  Copyfile(컨테이너를 어떻게 만들어야 하는지에 관한 설명서)
  •  Install dependencies (어떤 프레임워크나 라이브러리를 쓸지 외부 디펜던시에 명시)
  •  Set environment Variables(환경변수 설정)
  •  Run setup scripts(어떻게 구동해야 하는지에 관한 스크립트)

Dockerfile type

  1. FROM: image:tag 지정 
  2. WORKDIR: 컨테이너 내부에서 작업할 dir 설정
  3. ADD: 복사하려는 대상이 압축파일이면 압축해제 후 복사
  4. COPY: Host OS에 있는 파일을 컨테이너 내부로 복사 
  5. ENTRYPOINT: 컨테이너가 실행될 때 실행되는 명령 지정
  6. RUN: 리눅스에서 실행되는 명령어를 작성하고 싶을 때 사용
  7. ARG: build시에만 사용되는 변수
  8. ENV: image에서 사용할 환경변수 지정 

 

 

Dockerfile 예시, build하면 image 생성

Image

  • 컨테이너를 실행하는데 필요한 코드, 런타임, 라이브러리, 환경, 시스템 모든 세팅들이 담겨있습니다.
  • 상태값을 가지지 않고 변하지 않습니다(immutable)
  • nginx 이미지는 nginx를 실행하기 위한 모든 파일을 가지고 있고, mysql 이미지는 mysql을 실행하기 위한 모든 파일을 가지고 있습니다.
  • images는 Docker hub에 등록하거나, Docker Registry 저장소를 직접 만들어 관리할 수 있습니다.

layer

  • 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드 받지 않고, 해당 파일을 추가하기 위한 개념
  • 이미지는 여러 개의 read only Layer로 구성되어 있으며, 파일이 추가되면 새로운 Layer를 생성합니다.
  • 도커는 여러 개의 Layer를 묶어서 하나의 파일 시스템으로 사용할 수 있게 해줍니다.
  • 컨테이너를 생성할 때도 Layer 방식을 사용하는데, 기존의 이미지 Layer 위에 read/write Layer를 추가 → 이미지 Layer를 그대로 사용하면서 컨테이너가 실행 중에 생성하여 파일이나 변경된 내용은 read/write Layer에 저장되므로 여러 개의 컨테이너를 생성해도 최소한의 용량만 사용하게 됩니다.

 

Docker image 관련 명령어 

  • 이미지 받기: docker pull [image name]:[version](default version: latest)
  • 이미지 삭제: docker rmi [imageid]
  • 모든 이미지 한꺼번에 삭제
    • docker stop $(docker ps -q)
    • docker rm $(docker ps -a -q) 
    • docker rmi -f $(docker images -q)

 

Container

  • 컨테이너는 이미지 layer에 읽기/쓰기(read/write) Layer를 추가하는 것으로 생성 및 실행
  • 애플리케이션의 이미지를 고립된 환경에서 개별적인 파일 시스템 안에서 실행할 수 있는 것
  • 컨테이너 안에서 애플리케이션이 동작
  • 컨테이너는 준비한 애플리케이션을 이미지를 이용해서 애플리케이션 구동

 

Docker container 관련 명령어 

  • 컨테이너 중지: docker stop [containerid or name]
  • 컨테이너 종료: docker rm [containerid or name]
  • 모든 컨테이너 삭제: docker container prune
  • 컨테이너 목록 보기: docker ps, docker ps -a(종료된 컨테이너까지 출력)
  • 컨테이너 접속: docker attach [containerid](해당 컨테이너 터미널 세션에 연결)
  • 실행 중인 컨테이너 내부에서 명령어를 입력하고 실행하는 법: docker exec -it [containerid]

 

volume 

  • Docker 컨테이너에서 사용되고 사용되는 데이터를 유지하기 위해 선호되는 메커니즘
  • mount: Docker 컨테이너 내부와 호스트 머신 사이에서 파일이나 디렉토리를 공유하기 위한 메커니즘
  • mount option은 -v=-volume, --mount로 구성
    • -v: 모든 옵션을 하나의 필드와 함께 결합
    • --mount: 옵션을 <key>=<value> 값으로 분리 (권장)

-v, --mount 비교

$ docker run -d \
  --name devtest \
  --mount source=myvol2,target=/app \
  nginx:latest

$ docker run -d \
  --name devtest \
  -v myvol2:/app \
  nginx:latest

 

mount 방법 3가지(volume, bind mount, tmpfs mount)

출처:&nbsp;https://docs.docker.com/storage/volumes/

  • volume
    • 백업, 마이그레이션이 쉽습니다.
    • Docker CLI, Docker API를 사용해 볼륨 관리 가능
    • Linux, Windows 컨테이너에서 모두 작동
    • Host의 /var/lib/docker/volumes 경로에 저장
    • Docker에서 자체적으로 관리하기에 bind mount에 비해 Host Filesystem에 덜 종속적입니다.
  • bind mount
    • Data가 Host System의 어디에서든지 저장될 수 있습니다.
    • Data는 System File이거나 Directory일 수 있습니다.
    • Non-Docker 프로세서들이 언제든지 데이터를 수정할 수 있습니다.
  • tmpfs mount
    • Host System의 Memory에 Data 저장
    • 일시적이며 Host Memory에만 지속되고, 컨테이너가 중지되면 tmpfs 탑재가 제거되고 거기에 기록된 파일은 유지되지 않습니다. 

 

<참고자료>

https://docs.docker.com/storage/volumes/

 

Volumes

Learn how to create, manage, and use volumes instead of bind mounts for persisting data generated and used by Docker.

docs.docker.com

https://www.youtube.com/watch?v=LXJhA3VWXFA&t=164s

 

반응형