도커/쿠버네티스 기초 미리보기-Docker 구조(dockerd/containerd/runc)
도커&쿠버네티스 단단한 기초쌓커리큘럼 설명을 드려보도록 하겠습니다
도커&쿠버네티스에 대한 기본 기능에 대해서 배울 수 있겠구나 라고
당연히 생각할 수 있잖아요 당연히 그게 들어있고요
근데 이제 기능을 알려 주는 수업들은 당연히 다른 곳에서도 있습니다.
여기서 이제 가장 차이점이라고 볼 수 있는 거는 리눅스 컨테이너에 대한 개념을 완벽하게 이해하는 것이 가장 큰 차이점이라고 생각이 들어요 이 포인트를 그냥 말로만 설명하거나 지나가는 것이 아니라 직접 우리가 수동으로도 만들어보고 이 컨테이너에 대한 실제 컨테이너 자체가 어떤 건지 그거를 리눅스 안에서 실습을 통해서 증명하면서 공부를 하는 특징이 있어요
그래서 그 부분으로 컨테이너 자체를 완벽하게 제대로 이해했을 때
이거를 쿠버네티스에서 쓰든 도커에서 쓰던 문제 해결 능력이 굉장히 높아집니다
원래 항상 문제를 해결할때는 원래 어떻게 좋은지를 아는 게 굉장히 중요하거든요
그걸 모르면 계속 찔러봐야 돼요
될 때까지 찔러보는 형식으로 밖에 안 돼요 되짚어볼 수가 없기 때문에 범인을 찾을 수가 없습니다 그래서 이 컨테이너 라는 것 자체가 어떤 거고 어떻게 돌아가는지
그리고 내부 원리가 어떻게 되는지 실체가 어떤 것 인지를 명확하게 손으로 증명하면서 공부하는 것과 아닌 것은 굉장히 큰 차이가 있다 라는 거 알고 계셔야 될 것 같고요
이거를 알고서 도커&쿠버네티스 배워요 그리고 도커 안에서도 구조들
네트워크,도커 내부적인 구조 그리고 이제 이미지 관리라든지
이런 부분들까지도 정확하게 정리를 하고요
쿠버네티스도 마찬가지로 컨테이너 라는 개념을 정확하게 이해를 했기 때문에 이 안에서 뭘
어떻게 다루는지가 더 이해가 되고 왜 굳이 도커를 쓰지 않고 쿠버네티스를 써야 되는가
이런 부분들에 대한 이해도도 굉장히 떨어지는 경우들이 많은데
컨테이너오케스트레이션에 대한 개념을 정확하게 잡는 부분이 있습니다
그리고 쿠버네티스에 대한 실습을 해보고 여기서 마찬가지로 실존적으로 많이 써보고 구축 해보고 실험해보면서 이런 기능들을 정확하게 습득하는 것이 안에 들어있습니다
그래서 이런 것들을 실습같이 한번 진행해 보시면서 도커, 쿠버네티스, 컨테이너 이런 개념들에 대해서 정확하게 이해를 하고 실습능력을 많이 가져가시면 좋을 것 같습니다
사실 도커 하나의 프로그램으로만 구성되어 있지 않아요
dockerd/containerd/runc 가장 대표적으로세 가지가 보이게 되는데요
구조가 어떤 식으로 되어 있고 실습을 통해서도 한번 체크해보도록 하겠습니다
이런 구조를 왜 알아야 되나요?라고 하실 수도 있어요
그런데 우리가 지금 이 전체적으로 이 수업을 자체가 단단한 기초를 쌓는 부분이 조금 더 집중을 하고 있거든요
근데 이것들이 필요한 게 결국에는 우리가 운용하시다보면 되는 케이스만 보는 게 아니에요
잘못된 케이스도 볼것이고 문제 해결도 해야된단 말이에요
그럴 때는 원래 어떻게 되는지에 대한 기본 구조에 대한 개념이 없으시면요
일단은 그냥 이용하고 활용해서 되는 케이스를 해볼 수 있어요
돌아가는 케이스까지 해볼 수 있는데 문제 해결하는 상황에서 문제가 잘 안 될 수 있겠고 응용 할 때도 좀 제대로 적용이 안 될 확률이 높습니다
그래서 그런 부분들 때문에 우리가 또 단단한 기초를 쌓는 부분이 굉장히 필요할 수가
있어요 그래서 이런 구조들도 이해하시는 게 중요하겠고요
자 보시게 되면 이 그림 상으로dockerd 가 있고요 containerd가 있고 containerd-shim이라는 게 있습니다
생성된 이후에는 그냥 요 그림으로 구동이 돼요
containerd가 있고 그 다음에 컨테이너가 있으면 될 것 같은데
왜 containerd-shim이라는 게 뭔가 있나요 라고 얘기하실 수도 있는데
이건 어떻게 이해를 해주셔야 되냐면요
만약에 이 중간에 절차가 없으면요
컨테이너 부분이 죽었는지 살았는지 컨테이너에 대한 운용관리 부분이 정상적으로 안 이루어질 수가 있어요 그래서 이게 이제 죽었을 때 갑자기 비정상 종료됐을 때 이런 것부터 시작해가지고 여러가지 컨트롤에 비해서 중간에 프로세스가 하나 더 있다 라고 보시면 되겠습니다
그래서 컨테이너당 하나씩 containerd-shim이라는 프로세스가 하나씩 하나씩 만들어질 수 있다 라고 이해를 해보시면 되겠습니다
runc는 생성하고 나면 그냥 끝나는 거예요
이제 바로 이거의 자식프로세스로 생성이 되죠
그래서 이런 구조가 만들어진다 라고 보시면 되겠고요
그 다음에 이 소켓 파일 있어요
이거는 일단 컨테이너를 생성하는 거는 runc에요
그런데 runc부분이 OCI규약에 맞춰서 실행이 되잖아요
그런데 그 내용들이 사실은 여기서부터 이제 처리가 돼요
그래서 OCI규약에 맞춰 가지고 실행이 되는 거고 실제로 runtime 도구는 runc를 통해서 하는 거고 runc도 결국에는 어떻게 구성하느냐에 따라서 동작이 되는 것이기 때문에
여기까지 다 총괄하는 게 containerd라고 보시면 돼요
그래서 내부적으로는 runc를 통해서 형태를 생성하고 그래서 이런 runc는 계속 구동되는 게 아니에요 계속 구동되는 게 아니고 이거를 생성 할 때만 딱 쓰고 끝납니다
생성하는 도중에 그림이라고 보시면 되겠고요
이거는 실제로 물리적으로 하드디스크에 저장되는 그런 파일은 아닙니다 sock파일이라고 해가지고요 이거는 이제 메모리상의 사실 존재하고 있는 특수파일이고요
이거는 프로세스간에 통신을 위해서 존재하고 있는 sock파일이에요.
그래서 이거는 사실 만약에 우리가 파일명령어를 통해 한번 체크해보게 되면은 var/run/docker.sock이렇게 하면 이게 그냥 물리적으로 존재하고 있는 하드디스크에 저장되는 그런 일반파일 라고 생각하실 수도 있겠지만 그렇지가 않아요
이 같은 경우에는 클라이언트하고 서버가 통신을 할 때에도 이런 것들 많이 쓰게 되고요
어쨌든 프로세스가 프로세스간에 통신을 위해서 사용되는 유닉스 소켓입니다
그래서 지금 여기 같은 경우에는 CLI명령을 도구하고 dockerd라고 하는 서버 프로그램이 같이
통신을 할때 sock파일을 통해서 둘 사이가 통신된다라고 보시면 되겠고 dockerd와 containerd가 통신을 할 때는 containerd 소켓파일 능력을 한번 보면은 일반파일 아니죠
sock파일입니다
run폴더 밑에 containerd에 containerd.sock 이렇게 보이게 되죠
그래서 이거는 이제 특수 파일 이고요
두 프로세스간에 통신을 위해서 존재하고 있다 라고 보시면 되겠습니다
그리고 가장 많이 헷갈려하시는 게 docker라는 명령어를 입력할수 있는 명령어가 docker 그 자체라고 생각하시는 경우들이 있는데 그건 아니에요
껍데기에요. CLI 커맨드라인으로 명령으로 보낼 수 있는 도구입니다
그리고 명령으로 진짜 실제로 받는 엔진 부분은 dockerd에요
우리가 쓰고 있는 건 커뮤니티에디션이어서 -ce 이라고 되어 있어요
e 되어 있는 것은 엔터프라이즈 버전으로...