🐳 Docker 시리즈 살펴보기 🐳
➡️  1. Docker와 Container
      2. Dockerfile과 Docker Image
      3. Docker Volume
      4. Docker Network
      5. Docker Compose

 

Docker

Docker 란?

  • 애플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 컨테이너 기반의 오픈소스 가상화 플랫폼이다.
  • 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는 데 필요한 모든 것이 포함되어 있다

Docker 의 장점

  • Docker를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있다.
  • 모든 제품의 빌드, 배포, 운영을 같은 도구와 같은 방법으로 할 수 있다.
  • Ochestration Tool (Kubernetes, Docker Warm mode ..) 를 사용하면 여러 대의 서버(Host)를 하나의 클러스터로 묶을 수 있다.
    • 클러스터 관리 및 클러스터에 배포되는 컨테이너들에 대한 리소스를 효율적으로 사용하도록 도와준다.

 

Container

컨테이너는,

  • 코드와 모든 종속성을 패키지화해 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르고 안정적으로 실행되도록 하는 소프트웨어의 표준 단위이다.
  • 가상화 기술의 한 종류지만, 기존의 가상화와는 차이가 있다.

기존의 '가상화' 라고 하면 VM을 떠올리기 쉬웠다. 컨테이너를 이해하기 위해서는 VM(가상머신)과의 차이점을 찾는 편이 이해가 편하다.

Virtual Machines (가상 머신) Container (컨테이너)
  • HostOS 위에 GuestOS 전체를 가상화 하는 방법이다.
  • 호스트OS를 공유하지 않고 별도의 운영체제(GuestOS)를 필요로 한다.
    • 무겁고, 느려서 운영환경에서 사용하기 어렵다. 
    • GuestOS가 애플리케이션이 사용해야 할 CPU와 메모리 자원을 상당량 차지하게 된다.
  • *Hypervisor?
    • 호스트 시스템에서 다수의 GuestOS를 구동할 수 있게 하는 소프트웨어
    • 각각의 VM을 모니터링 하는 중간 관리자
  • 도커 컨테이너는 HostOS 의 커널을 공유하며 단순히 하나의 격리되어있는 프로세스 로서 동작한다.
  • 따라서 가볍고, 빠르다.
    • VM보다 더 많은 수(일반적으로 5배) 애플리케이션 실행 가능하다.
  • 컨테이너라는 가상의 '격리환경'을 만들기 위해 리눅스의 여러 기능을 사용한다. (namespace, cgroup, chroot ..)

 

작동 원리

Docker Engine

  • 도커의 관리 기능을 맡는 컴포넌트
  • docker daemon ('dockered' process), API, CLI 포함
  • 로컬 이미지 캐시를 담당해 새로운 이미지가 필요하면 이미지를 내려받고, 기존에 이미지가 있다면 내려받은 이미지를 사용한다.
  • 컨테이너와 가상 네트워크 등 도커 리소스를 만드는 일도 담당한다.
  • 항상 동작하는 백그라운드 프로세스이다.

 

동작원리

  • 도커 엔진은 도커 API를 통해 기능을 수행한다.
  • 도커API는 HTTP 기반의 REST API 이다.
  • 도커 CLI를 통해 도커 API를 호출한다.

 

Windows / Mac 컨테이너?

Docker는 리눅스 운영체제 커널의 일부 기능인 cgroup, namespace 등의 기술을 사용해 컨테이너를 격리하고 관리한다. 또한, 여러 레이어의 이미지를 만드는 데에도 리눅스의 Union File System을 사용한다.

이처럼 Docker는 리눅스의 다양한 기술들을 기반으로 만들어졌다. 그럼 Windows나 Mac 컨테이너를 사용하는 것은 불가능할까? Window 는 되고, Mac은 안된다. 

 

Windows Container

(https://tech.devsisters.com/posts/intro-windows-container/)

Windows 컨테이너는 리눅스 컨테이너를 빌드하는 방법과 동일하게 Dockerfile을 이용할 수 있다.

  • Window 컨테이너 OS 이미지는 mcr.microsoft.com 이미지 레지스트리 에서 내려받는다.
  • 그리고 컨테이너를 빌드하고 실행하기 위해서는 Windows 운영체제가 필요하다. (리눅스는 Linux/Window/MacOS 에서 모두 컨테이너, 이미지를 빌드하고 실행할 수 있다.)
  • 서버를 클라우드 컴퓨팅 환경 (AWS, Azure, GCP 등) 에서 사용한다면 상관없지만, Windows서버를 데이터센터에 구축해서 사용할 경우 라이센스에 주의해야 한다.
  • 또한, Windows Server에서는 라이센스 상 Hyper-V 컨테이너 방식의 컨테이너는 최대 2개만 허용되므로 라이센스 제약 없이 Hyper-V 기반 컨테이너를 실행하려면 라이센스를 구매해야 한다.

Windows Docker Desktop에서 오른쪽 마우스 클릭 > window 컨테이너로 전환하면 사용할 수 있다.

MacOS Container

불가능하다.

 

Docker CLI

  • Docker API를 이용하는 Docker CommandLine Interface 이다.
  • docker <subcommand> <options> .... 로 이루어져 있으며 수십개의 subcommand 가 있다.

그중 많이 사용하는 명령어들은 다음과 같다.

명령어 설명
docker run [OPTION] IMAGE[:TAG] [COMMAND] 컨테이너 생성 / 시작

옵션
-i : 컨테이너에 키보드 입력이 필요한 경우
-t : 컨테이너에 TTY 할당하여 터미널 이용이 필요한 경우
-rm : 컨테이너 실행 종료 후 자동 삭제가 필요할 때
-d : 백그라운드로 실행하고 싶을 때
--name [NAME] : 이름을 지정하고 싶을때
-p [PORT] : 포트 바인딩을 하고 싶을 때
-v [경로] : 볼륨 바인딩을 하고 싶을 때
docker create [IMAGE]
컨테이너 생성
docker start [CONTAINER]
컨테이너 시작
docker pause [CONTAINER]
컨테이너 일시 중지
docker unpause [CONTAINER]
컨테이너 재개
docker stop [CONTAINER]
컨테이너 종료 (SIGTERM 시그널 전달)
docker stop $(docker ps -a -q)
모든 컨테이너 종료
docker kill [CONTAINER]
컨테이너 강제 종료 (SIGKILL 시그널 전달)
docker rm -f [CONTAINER]
컨테이너 삭제
docker container prune
컨테이너 목록에 있는 모든 컨테이너 삭제
docker ps
컨테이너 목록 확인
docker ps - a
모든 컨테이너 목록 확인
docker attach [CONTAINER]
컨테이너 연결 (start한 컨테이너 내부에 붙음)
docker inspect [CONTAINER]
컨테이너 자세한 상태 정보 출력
docker pull NAME[:TAG]
이미지 내려받기
docker images
이미지 목록
docker rmi IMAGE[:TAG]
도커 이미지 삭제
docker <Object> prune 사용하지 않는 Docker 오브젝트, 캐시 일괄 삭제
  • 실행중인 컨테이너에 영향을 미치지 않는다.
  • 시스템의 모든 오브젝트, 캐시를 지우려면 docker system prune
    • 주기적으로 정리해주는것이 좋다.
  • 이미지를 모두 지우려면 docker image prune
  • 볼륨은 docker volume prune
  • 컨테이너는 docker container prune
  • 네트워크는 docker network prune
docker exec [CONTAINER]
실행중인 컨테이너에 명령어 전달

 

stop / kill 차이점

  • stop : 그동안 하던 작업 (메시지 전송 등)을 완료하고 컨테이너를 중지 (SIGTERM → SIGKILL)
  • kill : 어떠한 작업도 기다리지 않고 바로 컨테이너를 중지 (SIGKILL)

 

컨테이너의 터미널에 접속하기

이미 실행중이라면 exec, 실행하려면 run 명령어를 사용해 터미널에 접속한다.

$ docker exec -it [container] /bin/bash
# 키보드 입력이 필요해 -i 옵션, 터미널 활동이 필요해 -t 옵션
# 쉘을 지정한다. 위에서는 bash 쉘을 사용한다.