ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • Docker 의 전체적인 동작 구조
    Infra/docker 2024. 8. 13. 18:49

    사내 모니터링 시스템을 구축하는 업무를 맡게 되었다.

    처음에는  Java Management Extensions (JMX) 에서 제공하는

    com.sun.management.OperatingSystemMXBean 패키지를 사용하려 했다.

     

    하지만 이는 JVM 머신의 cpu 사용량을 나타내기 때문에 

    운영할 컨테이너 자체의 상태는 알려주지 않았기에

    우리의 환경에는 어울리지 않았다.

     

    우리는 한 ec2 인스턴스에서 여러 컨테이너를 띄우고 있었고

    이 각 컨테이너들의 cpu 사용량을 알고 싶었기 때문이다.

     

    그래서 찾아보니 docker.sock 을 활용하면 이 container 의 status에 대한

    많은 정보를 얻을 수 있었다!

     

    나는 docker 정확히는 몰라도 어느 정도는 알고있었다 생각했는데...

    docker에 대한 공부가 필요하다고 느꼈다.

     

    도커란 무엇인가

     

    도커는 애플리케이션을 개발, 배포, 실행하는 데 사용되는 오픈소스 플랫폼이다. 도커를 사용하면 애플리케이션을 환경에 구애받지 않고 쉽게 실행할 수 있다. 하나의 컴퓨터에서 여러 개의 독립된 환경(컨테이너)을 만들어 애플리케이션을 실행할 수 있게 해주는 것이다.

     

    도커 구조

    출처: 도커 공식 홈페이지

     

    여기서 등장하는 큰 세 가지가 있다.

     

    1. 도커 클라이언트

    2. 도커 호스트

    3. 레지스트리

     

    도커 클라이언트(Docker CLI)

    사용자가 도커와 상호작용하는 인터페이스다. 명령어를 입력하면 도커 데몬에 전달한다.

     

    도커 호스트

    Docker Host는 도커 엔진(Docker Engine)이 설치되고 실행되는 물리적 또는 가상의 머신이다. 컨테이너를 실행하고 관리하는 환경을 제공한다. 여기서 도커 데몬이 동작한다.

    도커 호스트는 도커가 동작하는 환경이다!

     

    도커 데몬(Docker Deamon(Dockerd))이란

    Docker Daemon(dockerd)은 도커 서비스 백그라운드 프로세스이다.
    1. 도커 API 요청을 수신하고 처리한다.
    2. 도커 객체(이미지, 컨테이너, 네트워크, 볼륨)를 관리한다.
    3. 컨테이너의 생명주기를 관리한다.
    4. 이미지 빌드, 다운로드, 업로드를 처리한다.
    5. Docker Host의 리소스를 사용하여 컨테이너를 실행한다.

     

    여기서 말하는 1번에 내가 사용한 docker.sock 이 있다.

     

    docker.sock은 Unix 도메인 소켓 파일이다. 이 파일은 일반적으로 /var/run/docker.sock 위치에 있으며,

    Docker 클라이언트와 Docker 데몬 간의 통신을 위한 인터페이스 역할을 한다.


    Docker 데몬과 docker.sock의 상호작용

    통신 경로

    Docker 클라이언트(예: Docker CLI)가 명령을 실행하면, 이 명령은 docker.sock을 통해 Docker 데몬에 전달된다.
    Docker 데몬은 이 소켓을 통해 요청을 받고, 처리한 후 결과를 다시 이 소켓을 통해 반환한다.


    API 요청 처리

    docker.sock은 RESTful API 요청을 위한 엔드포인트 역할을 한다.
    HTTP 요청과 유사한 방식으로, 클라이언트는 이 소켓을 통해 GET, POST, DELETE 등의 요청을 보낼 수 있다.


    보안

    docker.sock에 대한 접근 권한을 제어함으로써 Docker 데몬에 대한 접근을 관리할 수 있다.
    기본적으로 root 사용자나 docker 그룹의 멤버만이 이 소켓에 접근할 수 있다.


    네트워크 통신 대체

    docker.sock을 사용함으로써, Docker는 네트워크 포트를 열지 않고도 로컬 시스템에서 효율적으로 통신할 수 있다.

     

     

    레지스트리

    도커 이미지를 저장하고 공유하는 저장소이다. Docker Hub가 대표적인 예이다. 

    보면 플러그인이나 익스텐션 등도 존재한다.

     

    docker run nginx 명령어를 작성했을 때 일어나는 일

     

    먼저 권한이 있는 사용자가 docker run nginx 를 입력한다.

     

    Docker CLI 가 이 명령을 받아서 적절한 API 요청으로 변환한다.

     

    변환된 API 요청이 docker.sock 을 통해서 전달된다.

     

    도커 데몬이 이 요청을 해석하고 필요한 작업을 수행한다.

     

    run은 지정된 이미지가 로컬에 있는지 확인하고


    없다면 기본 레지스트리(도커 허브) 에서 이미지를 받아온다.

     

    받아온 이미지로 컨테이너를 생성하고

     

    네트워크나 스토리지 등 리소스를 할당하고 

     

    컨테이너를 시작한다.

     

    그리고 이 결과를 도커 데몬이 docker.sock을 통해 docker CLI 에게 전달한다.

     

    그럼 docker CLI는 받은 결과를 터미널에 표시하는 것이다.

     

    그리고 묶어주려면 컨테이너를 묶어주면 된다.

     

    이 외에도 docker pull 의 동작 원리라던가

    컨테이너 레지스트리를 s3로 사용한다거나하는 내용은 다음 포스트에 작성하겠다.

Designed by Tistory.