본문 바로가기
배포/Docker

10. Docker 설명

by moca7 2024. 12. 6.

 

 



 

==========================================================================

 

 

[3일차 시작]

[1교시]

 

 

 

 

ㅁ 

 

 

 

 

 

- VirtualBox의 우분투를 '시작'으로 실행시킨다. 비밀번호도 입력했다.

- MobaXterm에서 VirtualBox에 설치된 우분투에 접속한다.

 

 

 

 

 

 

- 어제까진 로컬 리눅스에 배포하나는 내용ㅇ을 했다.

 

오늘은 컨테이너 얘기를 한다.

 

 

 

 

 

 

 

 

- 컨테이너는 리눅스 기술이다.

리눅스가 설치된상태에서 리눅스 안에다가 어떤 공간을 만들어서 그 공간에다가 별도으 ㅣ시스템처럼 가상화를 할 수 있는 기능이다.

- 컨테이너는 서비스 구동에 필요한 파일만을 가지고 컨테이너를 만들기 때문에 실제 리눅스 전체설치보다 용량이 훨씬 작다.

이게 가장 큰 장점이다.

 

- 작은거는 몇십메가~몇백메가. 실제 리눅스는 몇기가씩 한다.

 

 

 

- 도커는 컨테이너가 아니다.

도커는 컨테이너 생성, 삭제, 관리하는 용도로 사용하는 엔진이다.

컨테이너 엔진은 도커만 있는게 아니라 무 ㅓ파드민? 이런것도 있다.

 

- 도커를 이용해서 컨테이너 이미지를 만들고 이미지로 컨테이너를 생석하고 제거할 수 있는 엔진이다.

 

 

- 자바를 동작시키기 위해 jvm을설치하는데, jvm이설치된 시스템이면 동일하게 소스로만들어진 프로그램을실행시킬수있는거죠. 어떤 os든 거기에 jvm이설치ㅗ디어있으면 동일하게 작동하는것처럼,

도커엔진이 설치되었으면 어떤 os든 동일하게 컨테이너가 작동한다. 플랫폼으 ㅣ영향을 받지 않는ㄴ다느 얘기다.

 

 

 

- 또 하나의 도커 의 장점이

컨테이너 이미지(컨테이너를 만들기 위한 설치 파일들을 모아 놓은 하나으 ㅣ파일)로 컨테이너를 만든다.

이 이미지 안에다가 내가 필요로하는 개발환경을 다 만들어놓고 그 필요한 파일들을 다 집어넣고 이미지 안ㅇ에 집어넣으면 ㅇ니미지 가지고 컨테이너를 생성한다. 그럼 이미지로 똑같으 ㄴ황경을 계속 만들 수 있다.

- 내가 배포환경을 만들려면 컨테이너를 안쓰면 리눅스든 윈도우든 서버를 설치하고 거기에 배포하기위한 디비도 설치해야 하고 jdk도 설치해야하고 여러가지 배포 프로그램이 돌아가기위한 환경을 구축해줘야 한다. 버전도 다 맞춰줘야 하고.

이런작업ㅇ르 매번해줘야 하는데 컨테이너 이미지를 쓰면 그자작업ㅇ ㅣ필요없다. 항상 똑같은 환경을 만들어주기 때문에.

- 이렇게 만들어진 이미지는 깃허브처럼 도커허브 사이트를 통해서 공유할 수 있다. 허브에 올려놓고 다른 배포서버에서 내려받아서 그 이미지 가지고 컨테이너를 만들수있다.

깃허브 통해서 소스를 공유하듯이 컨테이너 이미지를 공유할 수 있다. 물론 퍼블릭 저장소도 있고 별도으 ㅣ사설 저장소도 있다. 

공유할때도 18기가나 되면 시간도오래걸리고 힘든데 작으면 수십메가~수백메가밖에 안돼서 공유하기도 상당히 용이하다.

 

 

 

 

 

 

 

- 버츄얼 박스가 설치된 경로다.

16기가나 된다. 용량이 불필요하게 ㅁ낳다.

- 이 안에 있는 파일들을 배포하는데 쓰는게 아닌데도 다 포함되어있따.

 

 

 

 

 

 

- 왼쪽. 컨테이너는 리눅스에서 시작한 기술이다.

윈도웅 ㅔ도커를 설치하려면 돜 ㅓ데스크탑을 설치해야되는데 그 프로그램도 리눅스 기반이다.

 

- 오른쪽이 개발자 입장에서 예전에는 굉장히 문제가 되던거다.

내가 새로운 시스템에 배포하려면 그 시스템에다가 환경들을 다 일일히 맞춰줘야 한다.

- 그게 불편하니까 똑같은 환경을 만들어줄수있는 환경을 생각하다가 컨테이너다.

항상 같은 환경을 만들어줄수있다.

 

- 어쨋든 가상화란 애기다.

서버가 물리서버가 있다. 물리서버에 리눅스 설치할 수 있다.

그리고 vm. 버츄얼박스같은 가상화프로그램 통해서 vm만들어서 거기에 설치할 수 있다.

근데 물리서버가 제일 불편한 방식이다. 일일이 다 설치해야 하니까.

- vm은 근데 용량이 크다.

모든 파일이 다 들어가있기 때문에. vm은 가상화다.

- 지금 얘기하고있는거는 컨테이너다.

컨테이너도 리눅스 기반이다. 용량이 적다. 이것도 가상화다.

 

 

- 필요한건 서버다. 그 서버를 물리서버에 설치할거냐 vm에 설치할거냐 컨테이너를 이용해 설치핡거냐. 선택이다.

컨테이너를 쓰는게 제일 편하다는 ㅇ?ㅒ기다. 빠르고.

- 물리서버에 비해서는 vm이 더 유연하게 쓸 수 있고, 얘보다는 또 컨테이너가 용량도 적고 독같은 환경을 ㅗ사용핤ㅇ수있는게 컨테이너랑 얘기다.

- 하진 않겠지만 컨테이너를 다루는게 도커다. 도커엔진을 이용해서 컨테이너를 제어(생성,삭제,관리)한다.

이런 컨테이너가 엄청 많다. 컨테이너는 원래 vm에 서버를 만들면 여러 서비스를 같이 동작시키는데, 컨테이너는 어떤식으로 쓰냐면 여러분들이 최종적으로는 기능별로. 애플리케이션ㅇ르 개발할 때 기능단위로 컨테이너를 분리시킨다.

이ㅏ런걸을 msa라고하는데. 하나으 ㅣ컨테이너에는 하나으 ㅣ서비스만 집어 넣는것이다.

- 컨테이너가 엄청 늘어나면 컨테이너를 관리하는게 힘들다. 컨테이너를ㄹ 관리하려고 만들어놓은게 쿠버네티스다.

쿠버네티스는 이런 컨테이너들을 통합적으로 관리해주는ㄴ 툴이다.

도커도 컨테이너를 엔진이고 쿠버네티스도 컨테이너를관리하는ㄴ 툴인데 쿠버넼티스는 숨낳은 컨테이너를 관리학 ㅣ위한 툴이다. 도커는 하나하나 컨테이너를 관리하기 위한 엔진이다.

도커도 쿠버네티스도 컨테이너는 아니고 컨테이너를 관리하기 위한 프로그램이다.

- 실제 바깥에서는 저 컨테이너들이 천개 만개 일헣게 많이 만들어진다. 그많은 컨테이너들을 관리하려면 오케스네이션?툴(쿠버네티스)가 필요하단 거다.

- 우린 컨테이너를 도커를 이용해서 하겠다느 얘기다.

요즘에 ㄴpadman이란 것도 많이 쓴다. 도커 말고.

padman이라는 프로그램을 일용해서 컨테이너를 제어할 수 있다. 도커만 컨테이너를 관리할 수 있는 것은 아니다.

 

- 중요한건 컨테이너다. 컨테이너를 뭐로 관리할거냐.

몇개안될때는 각각 관리하면 되고, 많아지면 쿠버네티스같은 오케슴네이션? 툴을 이용해 관리할 수 있다.

 

 

 

 

 

-0 하이퍼바이저는 기존의 가상호 ㅏ프로글매이다. 가상황프로그램에 vm을 쓰다가 요즘엔 클라우드 가상화가 각광받고있다.

- 쿠버네티스는 구글에서 만들어진 컨테이너를 관리하는 오케스트레이션해주는 툴이다.

- 쿠버네티스를 쓴다 그러면 그거에 대해 알아야 할거아니에요. 그전에 이 흐름을 잡고가는게 좋다. 왜쓰이는건지 어디에 쓰이는 건지.

 

- 개발자는 배포를 하기위해 인프라가 필요한데, 그 인프라를 ㅇ떻게 구성할거냐.

선택이ㅏㄷ. 내가 물리서버에 할거면 물리서버에 함녀된다.

근데 바깥에서 배포할때는 실제로 물리서버에 배포하는 경우는 거의 없다고 보면 된다.

 

 

 

 

 

- 컨테이너는 개념이 모듈화가 되어있다.

그니까 필요한것만 모아놓은거다.

격리되어있는. 같은 os에 있는데. 지금 우분투를 쓰고있는데. 그 우분투 안을 별도의 격리된 공간으로 만들어서 별도의 시스템 처럼 쓸수있는걸 컨테이너라고 한다.

- 마지막으로 어플리키ㅔ이션을구동하느 ㄴ환경을 격리한 공간이다.

 

- 컨테이너 박스는 같은데 그 안의 내용은 다 다르다. 낵 ㅏ필요한것만 컨테이너에 담는다. 컨테이너끼리는 물건이 안섞인다. 격리가 된거다.

- 우너래는 가상화하기 위해서는 하이퍼바이저(버츄얼박스같으 ㄴ프로그램,) 게스트os(그니까 os)가 필요한거죠. 그래서 용량이 너무 커진다.

- 컨테이너가 리눅스 위에서 동작하니까 필요한 파일들은 우분투os랑 공유를 하고, 필요한 것만 컨테이너에 집어넣는거죠.

 

 

- (사진) 우분투라고 하는 리눅스에 컨테이너를 만드는 거잖아요.

어쨋든 컨테이너도 서버로 동작을 해야하기 때문에 공유할수있는거는 우분투랑 다 공유를 한다. 컨테이너에서 딸 ㅗ필요한거는 컨테이너에 넣어놓는다. 그래서 용량이 훨씬 작아지는거다. 라이브러린 ㅏ런타임 환경들이 다 컨테이너에 들어가있어야 하는데 호스트os(우분투)랑 공유하는 거다. 자기가 필요한 것만 컨테이너 안에 넣어놓ㅇ르수있어서 용량이 작아진다.

지금 둘째줄 한거임.

 

- 셋째줄.

운영체제으 ㅣ커널이라고하는거는 운영체제에서 하드웨어를 제어하는 ~다.

메모리, 씨피유, 하드디스크 이런것들을 제어하는 운영체제의 프로그램이다. 기반 프로그램.

 

 

 

 

 

 

- 우너래는 물리서벅 ㅏ있고, 그 위에 호스트 os (윈도우, 리눅스, 맥os )가 있고 그 ㅜ이에 하이퍼바이저라는게 들어간다.

가상화 플랫폼이다. 하이퍼 바이저 위에 이 vm들 (초롯색, 주황색, 빨간색의 guest os)를 만들어 썼다.

근데 이게 용량이 크다는 거다. 온전하게 하나의 시스템이니까.

 

- 근데 이거에 비해서 컨테인어 가상화는 오퍼레이팅 시스템 위에 도커같은 컨테이너 엔진이 올라간다. 컨테이너 엔진 위에 컨테이너들이 생성이 되는거다.

- 그리고 오퍼레이팅 시스템과 공유해야 하는것들은 컨테이너들ㅇ ㅣ공유르 ㄹ하고, 컨테이너에는 필요한 것만 담는다. 그래서 용량 차이가 엄청나게 난다. 

 

- 왼쪽에 있는 초록색 등은 온전히 하나으 ㅣ시스템이다. 가상머신만들고 거기에 설치한거다.

- 올느쪽은 만들어진 이미지 가지고 필요한 파일만 드렁있는 이미지 가지고 만들어놓은 컨테이너다. 공유가 필요한것들은 오퍼레이팅시스템과 공유하고.

 

 

 

 

 

 

- 도커의 구성요소르 보면 어제 도커엔진을 우분투에 설치했다.

-도커엔진을 설치하면 클라이언트 프로그램(왼쪽)이 있고 데몬(오른쪽)이 있다.

서버 프로그램을 직접 제어하는게 아니라 클라이언트 프로글매을 이요해서 명령을 전달한다.

- docker build하면 ~ 하고

docker pull하면 ~ 하고

docker run하면 ~ 한다.

- 오른쪽. 만약 로컬 시스템에 이미지가 없으면 이미지를 다운받아야 하는데. 그 기본적인 이미지 공식 저장소가 도커에서 제공해주고있는 도커 허브다. 근데 꼭 도커허브가 아니더라도 사설저장소를 쓸 순있다. 우리마ㅣㄴ쓰는.

그게 aws에서는 eci? ecr다. 사설저장소. 우리만 쓰는.ㄴ

공식저장소는 모든살마들이 볼수있는 저장소고, 우리회사만 볼수있는 별도의 저장소를 쓸거면 사섯ㄹ 저장소를만들면 된다.

- 어쨋든 이렇게 다운받아 이미지를 쓸수있고 아님 내가 만들어도 된다.

근데 이미 나와있는 기본이미지들이 ㅁ낳이 있기 때문에 저장소에서 그냥 다운받ㄷ아 쓰게 된다.

- 오른쪽 그림에 오라클, 우분투, nginx등이 이미 이미지에 있다.

그걸 다운받아서 내가 필요한 설정을 하고 다시 이미지로 만들어버리는 거싱다.

-nginx가 이미졸 되어있다 그걸 다운받아서 내가 추가로 필요한 설정들을0 하고(필요한 파일들을 집어넣고_ 닷 ㅣ이미지로 만든다. 그리고 그걸ㄹ ㅗ컨테이너를 만들면 똑같으 ㄴ상태로 만들어진다.

 

 

 

 

 

- 도커 이미지는 컨테이너를 만들기 위한 파일이다.

이미지에는 필욯나 파일들이 다 들어가 있다. 근데 그 이미지를 만드는 방식 중에 docker file이란게 있다.

docker file에다가 내가 이미지를 만들 때 설최더야하는 파일들이 있잖아요

.우분투같은 경우는 apt update하고 netoool도 설치학 ㅗ이랬죠. 필욯나 파일들이 있으면 다 설치를 하고 도커파일에서 이미지를 만든다. 그럼 이미지는 그런 내용들이 다 들어가있는 상태로 이미지가 만들어진다. 그 이미지를 가지고 컨테이너를 만들면 우리가 원하는 환경ㅇ대로 서버가 동작한다.

 

- 프로그램은 저장된 상태에서 동작시키면 메모리에 올라가서 프로세스가 도니다.

프로그램은 이미지, 프로세스는 컨테이너라고 보면 된다.

혹은 자바에서 클래스는 쓸수잇는 상태가 아니다. 클래스를 가지고 인스턴스를만들어야 한다. 인스턴스는 늘 똑같은  상태로 만들수있다. 클래스를 이미지로보면 인스턴스는 컨테이너라고 볼 수 있다.

 

 

 

 

 

- 컨테이너 이미지를 어디에서 다운받아야 하는데 공식저장소가 hub.docker.com이다. 이거는 레지스트리.

- repostirtory name은 본인 아이디 .goodeeacademy. 레퍼지토리 이름.

그리고 그 아이디 안에다가 이미지 이름을 만들어 주는거다.여긴 nginx. 이미지이름.

- tag는 버전이다. 구분하기 위한 버전이다. 태그를 이용해서 버전을 구분한다.

허브.docker.com은 공식이기때문에 registry는 생략할 수 있다.

- 근데 만약에 tag를 안적으면 자동으로 latest가 붙는다.

 

 

 

0

 

 

- 여러 저장소에서 필요한 걸쓰면 되는데 지금은 공식 dockerhub를 쓴다.

 

 

 

 

 

 

- 컨테이너를 만들어서 start함녀 running이되고 멈출수도 있고 종료stopped시킬수도 있고 아예 삭제deleted시킬 수도 있다.

- 컨테이넌 ㅡ프로세스같은거다. 메모리상에서 동작하는 상태다.

그걸 동작시키고 멈추고 삭제하고 이런 작업을 도커 클라이언트를 이용해서 할 수 있다.

 

 

 

 

 

 

 

 

- 이건 도커 이미지다. 이미지 구조가 우분투라고 하느 ㄴ이미지가 있다.

그 이미지에는 레이어가 a, b, c가 있다. 원본 우분투 이미지에 내가 ningx를 설치하면 레이억 ㅏ하나 추가되는 것이다.

똑같이 또 web app source를 올리게 되면 레이어가 하나 추가되는 것이다.

- 처음에 이미지를 다운받으면 이 ununtu이미지가 다운받아지는데, 내가 새로운 이미지를 만들었다 하면 기존의 a b c용량도 포함되는 거싱 아니라, nginx만 추가된다. web app도 똑같다. 용량이 내가 추가한 것만큼만 늘어난다.

용량이 2배이상이되는게 아니라 기존걸 똑같이 사용하면서 nginx만 추가되는것이다.

- 그래서 이 이미지 가지고 맨 오른쪽. 컨테이너를 만들어낼 수 있다

 

 

 

 

 

 

- 도커으 ㅣ아키텍처다.

도커 호스트가 있는데 이런 클라이언트도 호스트에 포함되어있을 수도 있고 다른 시스템에 있을 수도 있다.

보통은 같은 시스템에 클라이언트와 데몬(도커호스트)가 붙어있느 ㄴ상태다.

클라이언트에서 명령을 도커데몬에 전달하면 , 도커데몬이 받아서 낵 ㅏ필요한 이미지를 만들어내거나 없으면 다운받고 해서 컨테이너를 생성한다.

- 컨테이너가 프로세스화되어서 동작하고 있는상태가 된다.

 

 

 

'배포 > Docker' 카테고리의 다른 글

4. Dockerfile  (2) 2024.12.09
3.  (1) 2024.12.09
2. 이미지파일 다운&업로드  (1) 2024.12.09
1. Docker 설명  (0) 2024.12.08
11. 이미지파일 다운&업로드  (2) 2024.12.06