개발

Docker 관련 정리

박붕어 2022. 8. 29. 01:39

도커는 왜 필요할까? 

예전부터 하드웨어 자원에 대한 가상화의 요구가 존재했다. 
가상화 환경의 강자는 vmware이고 지금도 마찬가지. 

왜 가상화 환경에서 컨테이너 환경이 나오게 되었는가? 
vmware는 너무 무겁다! 
=> 실제로 컨테이너 엔진은 하이퍼바이저 처럼 동작하지 않는다!! => 그래서 가볍다. 

1. 다양한 개발 환경들이 존재. 
2.개발환경과 운영환경의 차이 -> 개발 환경과 운영 환경이 달라 문제가 생긴다. 
Ex. "내 PC에서는 잘 되는데? ㅇㅅㅇ"
개발을 하는 과정에서 library를 사용하면서 dependency가 생긴다. 
다양한 library, dependency에 대한 문제가 생긴다 .

3.개발환경을 세팅하는데 오래 걸린다. 

 

도커가 컨테이너는 아니다. 
Docker 이외에도 LXC, 등 다양한 컨테이너 환경이 쓰이고 있다. 

 

컨테이너 

기본적으로 컨테이너는 리눅스 커널의 기술이다. 
컨테이너는 하나의 컴퓨터에서 어플리케이션이 돌아갈 때 서로 간섭받지 않도록 어플리케이션 간 격리하는 기술 

namespace를 사용한다 => ps, fs, ipc, host 등을 격리시켜주는 기술 
컨테이너는 리눅스 커널의 기술이므로 리눅스를 잘 쓸줄 알면 도커가 없어도 격리가 가능하다. 

namespace를 사용하면 보이는 영역은 (참조할 수 있는 영역) 격리가 되지만
하드웨어 자원에 대한 격리는 잘 되지 않는다. 
이를 Control Group 즉. C Group이 사용할 수 있는 리소스에 대해 제한을 하고 리소스 격리를 해준다. 

도커 가상화를 사용할 때 메모리 제약기능을 잘 설정해야한다. 
제약을 넘으면 kill 된다. 
메모리를 너무 낮게 잡으면 빈번하게 죽을 수 있다. 

 

Docker위에서는 OS가 돌지 않는다.

VM은 guestos를 사용한다. 

docker는 기본적으로 os를 설치하지 않는다. guestOS를 사용하지 않는 것. 
즉 윈도우, m1에서는 사용 불가하다.... (개념적으로) 

 

윈도우, m1 mac에서 사용이 가능한데 이것은 
윈도우 => wsl or hyperviser를 사용해 도는 것. native 하게 동작하지 않는다. 
m1 => native 하게 돌아가지 않는다. 

docker에서는 무조건 OS가 돌지 않는다는 것을 이해해야한다. 

 

 VM과 Docker 

  booting snapshot diff 갯수
VM 부팅에 minutes가 걸린다. 기능이 있기는 하지만 용량이 너무 커 관리하기 힘들다.  diff로 형상관리 불가 용량이 너무 커 많이 돌릴 수 없다
Docker 부팅에 seconds가 걸린다.  쉽고 빠르게 가능 diff로 형상관리 가능  작은 binary면 수천개도 가능


Docker 생태계 

이미지 : 누군가 만들어 놓은 도커 컨테이너를 만들 수 있는 형태
immutable 하다. 

도커는 생태계와 에코시스템을 제공하여 폭발적으로 성장했다. 

Docker Hub를 제공해 성장. 
모든 기술인 부분은 리눅스 커널에 있다. 

docker hub를 보면 이미지들이 정말 많다.
그리고 이를 통해 실제로 악성코드가 포함된 이미지를 배포한 사건이 일어났다. 
즉 악용될 소지가 높다. 

해결방안. 
1. official image 딱지가 붙기 시작했다. 
2. verified publisher를 주기 시작함. 
Ex. ms, bitnami 등등,,,, 신뢰할 수 있는 회사들에게 그런 verified publisher를 줌. 

즉 뭔가 받을거면 official한거 받는게 좋다. 
다른 이미지를 받으면 스스로 검증하고 써야한다. 

Docker를 사용할 때 이미지 경로를 명시하지 않으면
docker 이미지를 가져올 때 dockerhub를 사용한다. 
자신만의 repository를 사용하고 싶으면 경로를 명시해주어야한다. 

아무 버전도 명시하지 않으면 latest. 최신을 보장하지는 않는다. => 사용자가 붙인 label일 뿐. 
태그를 명시하는게 좋다. 

image

이미지는 다른 이미지를 기반으로 만들어진다. 
가장 base이미지는 docker에서 만들었다. 

만들어진 최종 이미지를 올리면 컨테이너가 되는 것. 
=> 읽기 전용 이미지가 만들어진다. 
=> 최종 컨테이너가 만들어질 때 R/W 레이어가 만들어진다. 
ex. base이미지 -> nginx 이미지 -> 내 web application -> R/W 이미지