Docker

uuuu.jini·2022년 9월 14일
0

Kubernetes

목록 보기
1/14

Docker

Docker란 Go 언어로 작성된 리눅스 컨테이너 기반으로 하는 오픈소스 가상화 플랫폼이다.


가상화 사용 이유?

향상된 컴퓨터의 성능을 더욱 효율적으로 사용하기 위해 가상화 기술이 많이 등장하였다. 모든 서비스를 한 서버안에 올린다면 안정성에 문제가 생길 수 있다. 그래서 안정성을 높이며 리소스도 최대한 활용할 수 있는 방법으로 나타난게 서버 가상화이다.

도커 사용 이유?

  • 서버를 구축할 때 서버마다 운영체제, 컴파일러, 패키지 등의 차이가 발생하게 된다.
  • 만약 새로 서버를 구축 시, 기존 서버에 대한 지식을 가진 사람이 없다면 문제가 발생하게 된다.
  • 예를 들어 서버에 장애가 발생하게 된다면 기존 서버와 새 서버의 차이점을 찾는 데에 시간을 쏟게 된다. --> 비효율적

도커는 작업자가 원하는 시점의 서버 상태를 정해둘 수 있기 때문에 항상 똑같은 상태의 서버를 만들 수 있게 해준다.

컨테이너란?

컨테이너는 가상화 기술 중 하나로 대표적으로 LXC(Linux Container)가 있다. 기존 OS를 가상화 시키던 것과 달리 컨테이너는 OS레벨의 가상화로 프로세스를 격리시켜 동작하는 방식으로 이루어진다.

: 컨테이너란 애플리케이션 소스 코드를 임의의 환경에서 해당 코드의 실행에 필요한 운영체제 라이브러리 및 종속 항목과 결합하는 실행 가능한 표준 컴포넌트이다.

  • 호스트 컴퓨터에서 돌아가고 있는 하나의 프로세스
  • 호스트 컴퓨터와 그 위에서 돌아가는 다른 프로세스들과 격리되도록 설계되어있다.
  • 격리된 환경에서 개발 환경의 통일성을 갖추기 위해 사용한다.
  • 다양한 서버에서 버전 통일성을 갖추기 위해 코드와 환경 모두 하나의 컨테이너로 묶는 역할을 한다.

호스트: 도커를 이용하면 웹 서버가 컨테이너에 설치되고, 컨테이너가 설치된 운영체제는 도커 호스트라고 부른다. 하나의 도커 호스트에는 여러 개의 컨테이너가 만들어질 수 있고, 각각 독립적으로 실행되기 때문에 각자 독립적인 포트와 파일 시스템을 갖는다.

이미지란?

: 컨테이너 실행에 필요한 파일과 설정 값들을 포함하고 있는 것

  • 애플리케이션 코드와 애플리케이션 실행에 필요한 최소한의 환경을 포함하고 있는 바이너리 파일이다.
  • 하나의 이미지로 동일한 Container를 계속 만들어 낼 수 있고 Docker Hub와 같은 네트워크 상의 Docker registry를 통해 쉽게 공유할 수 있다.

Container Vs. Image

: Image는 container의 스냅샷(snapshot)을 떠어놓은 것으로 생각할 수 있다. 반대로 container는 컴퓨터에서 살아서 돌아가고 있는 image의 한 인스턴스(instance)라고 생각할 수 있다.

Docker Iamge란 컨테이너를 실행할 수 있는 실행파일, 설정 값들을 가지고 있는 것이다. Image를 컨테이너에 담고 실행을 시킨다면 해당 프로세스가 동작하게 된다.

VM 가상화 플랫폼 Vs. Docker 가상화 플랫폼

VM 같은 경우엔 Host OS 위에 가상화를 시키기 위한 Hypervisor 엔진 그리고 그 위에 Guest OS를 올려 사용한다. 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 거의 완벽하게 Host와 분리된다.

반면에 컨테이너 기반 가상화는 Docker 엔진 위에 Application 실행에 필요한 바이너리만 올라가게 된다.

OS 가상화는 Host Os와 완전하게 분리되는 장점은 있지만 Os 위에 Os를 올리기 때문에 무겁고 느릴 수 밖에 없다. 하지만 컨테이너 기반 가상화는 Host Os 그리고 Docker 엔진 위에서 바로 동작하며 Host의 커널을 공유한다. 커널을 공유하게 되면 io처리가 쉬어 성능의 효율을 높일 수 있다.

컨테이너를 사용하는 것은 가상 머신을 생성하는 것이 아니라 Host Os가 사용하는 자원을 분리하여 여러 환경을 만들 수 있도록 하는 것이다.

도커 사용 이유: 성능 향상, 뛰어난 이식성, 쉽게 Scale Out을 할 수 있는 유연성이다.

Docker File

: 서버 운영 기록을 코드화 한 것이다.

Docker Image들을 저장하고 배포하는 Docker Hub는 정말 잘 활성화되어 있다. Docker Hub에서 image를 pull하여 간단하게 컨테이너에 넣어 사용할 수 있다.

Docker file은 이미지 생성 출발점으로 이미지를 구성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있다. 즉, Docker File을 읽을 수 있다면 해당 이미지가 어떻게 구성되어 있는지도 알 수 있다는 의미이다.

컨테이너에 담을 파일들은 Dockerfile 하위디렉토리에 있어야 하며 Dockerfile안에서 add시 절대경로는 사용이 불가능하다.

  • FROM: 기반이 되는 이미지 레이어이다. <이미지 이름>:<태그> 형식으로 지정한다.
  • RUN: 도커이미지가 생성되기 전에 수행할 쉘 명령어 이다.
  • VOLUME: 디렉터리의 내용을 컨테이너에 저장하지 않고 호스트에 저장하도록 설정한다.
  • CMD: 컨테이너가 시작되었을 때 실행할 실행 파일 또는 쉘 스크립트이다. 해당 명령어는 DockerFile내 1회만 쓸 수 있다.
  • WORKDIR: CMD에서 설정한 실행 파일이 실행될 디렉터리이다.
  • COPY: 호스트 OS의 파일 또는 디렉토리를 컨테이너 안의 경로로 복사한다.
  • ENV: Dockerfile 또는 컨테이너 안에서 환경 변수로 사용이 가능하게 한다.
  • HEALTHCHECK: 컨테이너 안의 프로세스가 정상적으로 작동하고 있는지를 체크하는 명령어이다.

curl: 다양한 통신 프로토콜을 이용하여 데이터를 전송하기 위한 라이브러리와 명령 줄 도구를 제공하는 컴퓨터 소프트웨어 프로젝트이다.

Docker Hub

Docker Hub에서는 이미지를 저장하고 관리해준다. Docker Hub를 이용하면 손쉽게 image를 pull 받아 컨테이너에 적용 시킬 수 있다.

Docker Registry

Docker Hub 처럼 공개된 방식이 아닌 비공개적으로 격리된 저장소를 구축할 수 있다.


Docker Swarm

도커(Docker)는 단일 호스트 안에서 컨테이너 기반 애플리케이션을 관리할 때 유용한 도구이다. 하지만 단일 호스트로 구성된 환경은 확장성(Scalability)과 가용성(Availabilty), 그리고 장애 허용성(Fault Tolerane) 측면에서 많은 한계점을 가진다.

만약 애플리케이션 이용자가 늘어나면서 호스트의 가용 시스템 자원이 바닥난다면, 혹은 어떠한 이유로든 호스트가 일시적으로 작동 불능의 상태가 된다면 아마도 애플리케이션의 서비스가 곧바로 중단되는 상황을 맞이하게 될 것이다. 따라서, 대개의 경우에는 여러 대의 호스트를 함께 운영하며 이러한 상황에 대비하게 된다.

여러 대의 호스트에서 컨테이너를 관리하려니, Docker 자체 만으로는 해결하기 어려운 문제가 있다.

  • 서로 다른 각각의 호스트들을 어떻게 연결하고 관리할 것 인가?
  • 어떤 컨테이너를 어느 호스트에 배치하여 구동시킬 것인가.
  • 각기 다른 호스트에 배치된 컨테이너들의 상호 통신을 어떻게 제어할 것인가?

위와 같은 문제들의 해결을 위해 등장한 것이 컨테이너화 된 애플리케이션에 대한 자동화된 설정, 관리 및 제어 체계 즉, 컨테이너 오케스트레이션(Container Orchestration)이다.

Docker 는 자체적으로 컨테이너 오케스트레이션인 도커 스웜(Docker Swarm)을 마련해 두었다.

Docker Swarm 장점?

쿠버네티스가 컨테이너 오케스트레이션에 관한 사실상 표준 기술로 자리 잡았지만 여러 장점을 가지고 있다.

  • 쿠버네티스만큼은 아니더라도, 여러 대의 호스트로 구성된 중소 규모의 클러스터에서 컨테이너 기반 애플리케이션 구동을 제어하기에 충분한 기능을 가지고 있다.
  • 도커 엔진(Docker Engine)이 설치된 환경이라면 별도의 구축 비용 없이 스웜 모드(Swarm Mode)를 활성화하는 것만으로 시작할 수 있다.
  • 도커 컴포즈(Docker Compose)와 같이 Docker Swarm의 스택(Stack)을 이용한 애플리케이션 운영에 곧바로 적용이 가능하다.
  • 도커 데스크톱(Docker Desktop)으로도 클러스터 관리와 배포가 모두 가능한 단일 노드 클러스터를 바로 만들 수 있다. 따라서 최소한의 자원으로 컨테이너 오케스트레이션 환경을 만들어 시험해 볼 수 있다.

주요 용어

  • Node(노드): 클러스터를 구성하는 개별 도커 서버를 의미한다.
  • Manager Node(매니저노드): 클러스터 관리와 컨테이너 오케스트레이션을 담당한다. 쿠버네티스의 마스터 노드와 같은 역할이다.
  • Worker Node(워커노드): 컨테이너 기반 서비스(Service)들이 실제 구동되는 노드를 의미한다. 쿠버네티스와 다른 점이 있다면, Docker Swarm에서는 매니저 노드도 기본적으로 워커 노드의 역할을 같이 수행할 수 있다는 것이다.
  • Stack(스택): 하나 이상의 서비스(Service)로 구성된 다중 컨테이너 애플리케이션 묶음을 의미한다. 도커 컴포즈(Docker Compose)와 유사한 양식의 YAML 파일로 스택 배포를 진행한다.
  • Service(서비스): 노드에서 수행하고자 하는 작업들을 정의해 놓은 것으로, 클러스터안에서 구동시킬 컨테이너 묶음을 정의한 객체이다. 도커 스웜에서의 기본적인 배포 단위로 취급된다. 하나의 서비스는 하나의 이미지를 기반으로 구동되며, 이들 각각이 전체 애플리케이션의 구동에 필요한 개별적인 마이크로서비스로 기능한다.
  • Task(태스크): 클러스터를 통해 서비스를 구동시킬 때, 도커 스웜은 해당 서비스의 요구 사항에 맞춰 마이크로서비스가 동작할 도커 컨테이너를 구성하여 노드에 분배한다. 이것을 태스크라고 한다. 하나의 서비스는 지정된 복제본 수에 따라 여러 개의 태스크를 가질 수 있으며, 각각의 태스크에는 하나씩의 컨테이너가 포함된다.
  • Scheduling(스케쥴링): 도커 스웜에서 스케줄링은 서비스 명세에 따라 태스크(컨테이너)를 노드에 분배하는 작업을 의미한다.

Docker 명령어 정리


  • 현새 사용중인 Docker의 build한 이미지를 출력
doker images
  • 현재 돌고 있는 Docker들을 나타냄(-a: 과거의 이력을 포함하여 출력)
docker ps (-a)
  • 만든 application을 build 해주는 명령어
docker build -t [name:tag]

name: (node-app).js 에서의 node-app
tag: version

  • 만든 이미지를 기반으로 실행하는 명령어
docker run -p [Host_Port:Container_Port] --name [이름] -d [name:tag]

-d: 백그라운드에서 컨테이너 실행
--name: 컨테이너의 이름 지정 옵션
-p: [호스트:컨테이너]의 포트 매핑 방식을 사용 Ex) 4000:80=호스트 4000->컨테이너80

  • 컨테이너 중지 명령어
docker stop [이름]
  • 컨테이너 삭제 명령어
docker stop [이름]
  • 컨테이너 로그 보기 명령어
docker logs -f [Container id]

-f: 해당 컨테이너가 실행중일 때 로그 출력

  • 해당 컨테이너 안으로 들어가기
docker exec -it [container id] bash

-it: 컨테이너를 개방하여 상호작용 시켜주는 옵션

  • 컨테이너의 Meta data 검사
docker inspect [container id]
profile
멋쟁이 토마토

0개의 댓글