ETC/Docker

Docker 이론 및 개념 정리

uooy 2021. 8. 8. 14:50

 

이론

도커는 컨테이너 기반 오픈소스 가상화 플랫폼이다.

프로그램이나 실행환경(운영체제,서버 등)을 컨테이너란 형태로 추상화하고 동일한 인터페이스를 제공하여

프로그램의 배포 및 관리가 단순해진다. 

 

그렇다면 컨테이너란 무엇인가?

컨테이너란 Software 각각 실행에 필요한 실행환경을 독립적으로 운용할 수 있도록 실행의 독립성을 확보해주는 

운영체제 level의 격리 기술을 말한다.

 

예를 들어 Front-end는 Node JS, Back-end는 Flask, DB는 MySQL로 구성된 웹서비스를 개발하고 가정한다고 해보자

이 웹서비스를 서비스A라고 칭하고 개발PC에서 개발후 서버PC로 옮긴다고 할 때,

개발PC에서 이 서비스A만 개발을 한다면 문제가 없겠지만, 서비스A에서 사용된 MySQL 버전이 아닌 다른 버전으로

새로운 서비스B를 개발한다고 하면 MySQL의 버전을 바꿈으로써 서비스A에 문제가 생길지도 모른다. 

이러한 문제들을 방지하기 위해 컨테이너를 활용하여 각각 다른 환경을 만들어 주어 개발을 하는 것이다.

 

다른 환경을 만들어 개발을 하기위함이라면 굳이 컨테이너가 아닌 가상머신을 사용해도 되지 않는가?

 

물론 가상머신을 사용하여 개발을 해도 되지만 컨테이너와 비교했을때 성능과 배포에 있어 많은 문제가 있다.

1) 컴퓨터 성능 

 오른쪽 : 가상머신 / 왼쪽 : 컨테이너

출처 : 얄팍한 코딩사전(유투브)

 

가상머신을 사용한다는 것은 OS위에 또다른 OS를 올린다는 것이다. 이렇게 하면 우리는 개발에 필요하지 않은 다른 것들에 의해 메모리가 낭비되게 되고 컴퓨터 자원 낭비로 이어진다. 

반대로 컨테이너는 개발에 필요한 것들로만 이루어지기 때문에 컴퓨터 자원을 나눠 받는것이 아닌 공유 개념으로 사용하고 메모리 낭비도 현저히 줄어들게 된다. 

 

2) 배포

개발용 PC에서 개발된 프로그램을 서버용PC에도 동일한 환경을 세팅해야 하는데 이는 너무나 번거로운 일이 된다.

하지만, 도커를 사용한다면 우리는 개발용 PC에서 개발된 서비스A 의 실행환경에 대한 설계도만 서버용PC로 옮기면

서버용PC에서는 설계도를 토대로 컨테이너를 생성해서 서비스를 가동할 수 있게 한다. 

(이때 설계도를 우리는 "이미지"라 칭하는데 이미지에 대한 설명은 밑에 더 자세하게 한다)

 

정리하면 우리는 컨테이너 기반 플랫폼인 도커를 사용하여 실행환경 설정과 메모리관리에 대한 비용,

배포까지 보다 쉽고 간편하게 개발할 수 있다. 

 

개념

1.이미지 (Image) 

이미지는 앞서 말했듯 컨테이너를 세우기 위해 필요한 파일과 설정값등을 포함하는 컨테이너의 설계도다.

그래서 컨테이너는 이미지를 실행한 상태라고 볼 수 있고 이미지는 말 그대로 설계도이기 때문에 컨테이너의 상태가 변하거나 삭제되더라도 이미지는 그대로 남아있어서 언제든지 컨테이너를 다시 실행시킬 수 있다. 

 

이미지는 컨테이너를 실행하기 위한 모든 정보를 가지고 있기 때문에 용량이 매우 크다. 

처음 이미지를 다운받은 후 그 이미지에 새로운 설정(파일)이 추가가 된 것을 필요로 할때 설정이 추가된 이미지를 

새로 다운받는다면 이는 매우 비효율적이다.

그래서 도커는 레이어 개념을 사용하여 이미지를 저장한다. 

유니온 파일 시스템을 이용하여 여러개의 레이어를 하나의 파일시스템으로 사용할 수 있게 해준다.

레이어 저장방식

위 그림과 같이 ubuntu(A+B+C) + nginx + web app 으로 이루어진 이미지가 있을때

web app source가 변경되면 저 전체를 다시 다운받는게 아니라 web app source를 담고있는 layer만 변경해주면 되기 때문에 효율적인 이미지 관리를 할 수 있다. 

 

 

2.Docker Compose

Docker Compose는 컨테이너 실행에 사용되는 옵션과 컨테이너 간 의존성을 모두 docker-compose.yaml 파일에

적어두고 compose용 명령어를 사용하여 컨테이너를 실행하고 관리할 수 있도록 해주는 도커에서 제공하는 툴이다.

version: '3.1'

service:
	servicename:
		image: # optional
		command: # optional
		environment: # optional
		volumes # optional
	servicename2: # if have second service...
    volumes: # optional

    network: # optional

 

3.배포 과정

도커를 이용한 배포과정은 git과 상당히 유사하다. 

배포 과정

(1) 작업해 놓은 컨테이너를 이미지로 저장 (commit)

(2) 저장된 이미지를 Docker Cloud에 push (Docker Cloud는 git hub와 같은 원격 저장소라 생각하면 된다)

(3) 서버pc에서 pull 받아 사용 (배포 완료)

 

이처럼 이미지를 다운받고 컨테이너를 실행하면 배포가 끝나기 때문에 도커를 사용하면 컨테이너를 사용하면

어떤 언어, 프레임워크를 쓰든 상관없이 배포 방식이 동일해지고 과정 또한 굉장히 단순해진다. 

 

 

 

 

내용 참고 자료 및 이미지 출처

 

https://www.youtube.com/watch?v=hWPv9LMlme8&t=785s 

 

https://cultivo-hy.github.io/docker/image/usage/2019/03/14/Docker%EC%A0%95%EB%A6%AC/#docker

 

[Docker] 개념 정리 및 사용방법까지.

 

cultivo-hy.github.io