프로젝트/프로젝트 관련

Docker란 무엇인가? 왜 쓰는가? 소개편

Wonuk 2021. 12. 25. 19:37
반응형
본 포스팅은 유튜브를 기반으로 작성되었습니다.
https://www.youtube.com/watch?v=chnCcGCTyBg
https://www.youtube.com/watch?v=tPjpcsgxgWc

1번 영상

Docker가 해결하는 문제점은 무엇인가?

Environment disparity

- 예를 들면

금요일 저녁에 개발을 하고 있고, 그걸 서버에 올리기만 하면 되는 상황에서

일을 거의 다했고, 금요일 저녁 퇴근만 남겨둔 상황에서

코드를 서버에 올렸더니 작동을 제대로 하지않는 상태입니다.

아마 그 이유는 개발자의 컴퓨터는 윈도우고, 서버는 리눅스여서 발생하는 문제일 것입니다.

이것이 Environment disparity 입니다.

 

이러한 문제점을 Docker가 해결해줍니다.

Docker를 통해 다른 머신에서도 같은 환경을 구현할 수 있기 때문입니다.

우선 Docker를 윈도우에 설치하고, 서버에도 설치를 하도록 합니다.

그리고 docker 파일이라는 것을 생성합니다.

이곳에 구현하고 싶은 환경을 설정하면 됩니다.

예를 들면 우분투, 파이썬, 깃 등등

이 파일을 서버, 컴퓨터 둘다에게 주고, 

Docker는 그 파일을 읽고, 필요한걸 다운로드 받고

해당 설정한 환경과 같은 버츄얼 컨테이너를 컴퓨터에 만듭니다.

 

컴퓨터에서 서버로 코드를 업로드 할때(docker파일과 함께)

잘 작동하게 됩니다.

 

또한, Docker 컨테이너들은 각기 분리되어 있다고 생각하고 독립적이라고 생각합니다.

바로 이 특징 덕분에 한 개의 서버에 각기 다른 많은 수의 컨테이너를 가질 수 있습니다.

예를 들면, 한개는 파이썬, 한개는 장고 컨테이너가 됩니다.

이렇게 다른 컨테이너들이 독립적으로 존재할 수 있습니다.

Docker 덕분에 이렇게 다양한 컨테이너들을 관리할 수 있습니다.

예를 들어 직접 만든 JAVA앱이 인기가 많아지면 

그냥 JAVA 컨테이너의 개수를 늘리면 되는 것입니다.

그리고 다시 트래픽이 줄어들면 해당 컨테이너 수를 줄일 수 있습니다.

 

즉, Docker 덕분에 매번 새로운 서비스를 만들때마다 새로운 서버를 사고,

다시 설정할 필요가 없다는 뜻입니다.

원할때마다 docker를 통해 새로운 환경을 생성할 수 있습니다.

 

하나의 같은 서버에서 각기 다른 환경의 컨테이너를 설정할 수 있고

이 컨테이너들은 각각 분리, 독립되어 있으니 아주 편리합니다.

 

Docker 컨셉

1. 원하는 개발 환경을 파일에 저장하면, docker는 이를 개발자가 원하는

어떠한 머신에든 해당 환경을 시뮬레이션 해줍니다.

 

2. 이러한 환경들은 각기 독립적으로 존재하기 떄문에,

원하는 무슨 환경이든 모듈식으로 관리가 가능합니다.

그래서 파이썬, 자바, DB 서버 등을 추가해서 살 필요가 없이

docker 하나로 해결이 가능합니다.

 


2번 영상

개요

도커를 이해하기 쉽도록 예를들어 설명하겠습니다.

프로듀싱 일을 하는 A라는 사람이 있습니다.

이 사람은 계약 건마다 현지로 다니면서 일을 하는데

매 번 많고 복잡한 장비들을 새 현장으로 옮겨서 조립하고 설치하는데

신물이 나 있습니다. 바로 이 때, Docker라는 것을 사용하게 됩니다.

 

 서버를 돌리기 위한 환경을 구축하는 건 복잡하고 머리아픈 일입니다.

언어, 웹서버, DB, 자동배포툴 등 여러가지의 버전을 신경써서 다운받은 다음

서로 잘 맞물려 동작할 수 있도록 이것저것 설정을 해야합니다.

 

그런데 서버를 운영 하다보면 더 성능 좋은 서버로 옮겨가거나

늘어난 접속량을 처리하기 위해 서버를 여럿 추가해야 할게 될 수 있습니다.

그렇다면 새로 생성된 서버들에도 똑같이 다 설치를 해야하는 불편함이 생깁니다.

 

그와중에 어딘가가 잘못돼서 뭘 어떻게 고쳐야 할지 아무도 모르는 상황이 생기면

큰 문제가 발생합니다. 뿐만 아니라 같은 서버에 여러 서비스를 돌리는 경우

각각이 다른 실행환경에서 동작해야 할 때 일이 까다로워질 수도 있습니다.

 

기존 사이트를 자바 7에서 돌리고 있었는데 새 서비스가 자바 8에서 동작하는거면

또 이것저것 맞추고 신경을 써주어야 합니다.

Docker는 이러한 문제들을 깔끔하게 해결해줍니다.

 


 

어떤 방식으로 해결하는가?

먼저 각 요소들이 설치된 모습을 '이미지'란 형태로 박제해서 저장합니다.

각 제품마다 공식적으로 제공되는 이미지도 있고

사용자가 원하는대로 만들어낼 수도 있습니다.

Git으로 저장된 내용들이 Github에 올려지는것처럼

이 Docker 이미지들은 DockerHub라는 곳에 업로드되서 공유되고 다운로드가 가능해집니다.

 

그리고 이렇게 이미지로 저장된 항목들이 함께 연결되서 동작하도록 설정된 상태를

명령어 텍스트나 문서 형태로 저장할 수도 있습니다.

마치 이것들을 설치하는 과정을 어디서든 컴퓨터가 자동으로 재현할 수 있도록

녹화해둔다는 느낌입니다.

 

그러니까 이 문서만 잘 보관해두면 

이 요소들이 언제 어디서든 미리 지정된, 서비스에 필요한 설정대로 

DockerHub로부터 받아져서 설치될 수 있습니다.

 

Docker는 이것들을 컴퓨터에 바로 설치하지 않습니다.

각각을 컨테이너라 불리는 독립된 가상 공간을 만들어내서 복원합니다.

때문에 서로 다른 버전의 자바를 돌리는 서비스들도 각각의 컨테이너 안에서

서로 방해받는 일 없이 돌아갈 수 있는것입니다.

 

버추어박스같은 가상컴퓨터처럼 생각될 수도 있지만,

Docker는 가상 컴퓨팅하고는 다른 구조입니다.

 

가상 컴퓨팅은 한 물리적 컴퓨터 안에

각각 OS를 가동하는 가상 컴퓨터들이

물리적 자원을 분할해서 쓰기 때문에

성능에 한계가 생기게 됩니다.

도커는 OS단까지 내려가는게 아니라

실행 환경만 독립적으로 돌리는 거라서

컴퓨터에 직접 요소들을 설치한것과

별 차이 없는 성능을 낼 수 있고

가상 컴퓨팅보다 훨씬 가볍고 빠르게

각각을 설치하고 실행하고 켜고 끄고 서로 연동 할 수 있습니다.

이제는 서버에 무엇인가 잘못되어서 고쳐야 하거나,

일부를 업그레이드 해야하거나 할 떄는

일일이 요소들을 정지하고 지우거나 새로 깔거나 할 필요없이

그냥 컨테이너들을 통째로 교체하여 새로 실행하면 됩니다.

 

서버를 관리하고 서비스를 배포하는 일이

이전과는 비교도 안되게 쉬워지게 됩니다.

 


 

 

 

 

 

반응형

'프로젝트 > 프로젝트 관련' 카테고리의 다른 글

Docker 입문 下  (0) 2021.12.28
Docker 입문 上  (0) 2021.12.27
JDBC, SQL Mapper(MyBatis), ORM  (0) 2021.12.25
DTO와 VO는 무엇인가?  (0) 2021.12.23
부하 분산을 위한 MySQL 쿼리요청 분기  (0) 2021.12.14