평소에 도커를 자주 사용하기는 해도 정확한 구조라던지 그런 이론적인 이해가 부족한 것 같아서 공부해 보았습니다.
리눅스 컨테이너를 만들고 사용할 수 있도록 하는 컨테이너화 기술
컨테이너를 구축, 배포, 복사하고 한 환경에서 다른 환경으로 이동하는 등 유연하게 사용할 수 있습니다.
Docker만 설치되어 있다면, 실행 환경에 상관없이 컨테이너를 사용 가능합니다. 즉, Spring, React, NextJs 등등 어떤 프로그램이든 관련 없이 컨테이너에만 넣으면 모두 동일하게 실행이 가능합니다.
옛날 옛적에 서버 구축을 하게 된다면 일일이 서버세팅을 하여야 했습니다.
그렇기 때문에 이전에는 새로운 하드웨어를 확보, 실행, 프로비저닝, 제공하는 데 며칠이 걸렸으며, 이를 위한 작업 및 오버헤드 부담도 상당했습니다.
이런 상황에서 '실행 중인 환경과 관계 없이 동일한 환경을 배포할 수 있다면?' 라는 생각에서 시작되었습니다.
컨테이너라는 특성때문에 밑에와 같은 장점을 가지고 있습니다.
모듈성
컨테이너화에 대한 Docker 접근 방식은 전체 애플리케이션을 분해하지 않고도 업데이트 또는 복구를 위해 애플리케이션의 일부를 분해하는 기능에 중점을 둡니다
계층 및 이미지 버전 제어
각 Docker 이미지 파일은 일련의 계층으로 구성되며 이러한 계층들은 단일 이미지로 결합됩니다. (이미지 레이어) 계층은 이미지가 변경될 때 생성되고, 사용자가 실행 또는 복사와 같은 명령을 지정할 때마다 새 계층이 생성됩니다.
Docker는 이러한 계층을 재사용하여 새 컨테이너를 구축하는데, 이때 구축 프로세스 속도가 빨라집니다. 중간 변경 사항은 이미지 간에 공유되므로 속도와 크기, 효율성이 더욱 향상됩니다. 또한 계층화에는 버전 제어가 내재되어 있습니다. 새로운 변경 사항이 있을 때마다 변경 로그가 기본 제공되므로 컨테이너 이미지를 완벽하게 제어할 수 있습니다.
롤백
계층화의 가장 큰 장점은 아마 롤백 기능일 것입니다. 모든 이미지에는 계층이 있습니다. 현재의 이미지 반복이 적절하지 않은 경우 이전 버전으로 롤백하면 됩니다.
신속한 배포
Docker 기반 컨테이너는 옛날 배포시간과 비교하여 배포 시간을 몇 초로 줄일 수 있습니다. 또한 컨테이너를 추가하거나 이동하기 위해 운영 체제를 부팅할 필요가 없으므로 배포 시간이 상당히 단축됩니다.
Docker에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태를 Docker Image라 합니다.
즉 프로그램(프로세스)을 실행하기 위한 모든 파일과 설정을 담고있는 파일을 생각하시면 될 것 같습니다.
Docker Image는 상태 값을 가지지않고 변하지 않습니다. (읽기 전용)
이미지로 컨테이너를 생성 할 수 있습니다. (여러 컨테이너 생성 가능)
컨테이너가 삭제되어도 이미지는 남아있습니다.
DockerHub로 이미지 배포 및 버전 관리가 가능합니다.
Docker는 Dockerfile을 기반으로 이미지를 만듭니다. Dockerfile에는 이미지 생성 과정의 명령어들이 명시되어있습니다.
이미지를 빌드(생성)한다는 건 CD를 굽는거랑 비슷하다고 보면 될것같네요.
사실상 이 이미지 레이어 구조때문에 Docker를 다시 공부하게 된 이유입니다.
Docker의 컨테이너는 기본 이미지와 추가 이미지 레이어로 구성됩니다.
만약에 기존 이미지에 설정파일 한 개가 추가가 되었다고 파일 전체를 다시 다운받는다면 매우 비효율적일 수 밖에 없습니다. 이미지 레이어란 기존 이미지에 추가적인 파일이 필요할 때 다시 다운하는 방법이 아닌 해당 파일을 추가하기 위한 개념입니다.
이미지 레이어 확인하는 명령어
docker inspect {ImageName}
밑에와 같이 레이어 정보가 나오게 됩니다.
이미지 레이어 메타정보 ID
Docker Desktop 에서 이미지 레이어 정보를 보기 쉽게 보여주더라고요
저의 이미지 레이어는 밑에와 같은데 용량이 할당된게 이미지 레이어라고 (총 4개) 보시면 됩니다.
Dockerfile 명령어에 해당하는 부분이 이미지 레이어로 할당되는지는 처음 알았네요
나머지 명령어들이 이미지 레이어화 되지않은 이유는 RUN
, ADD
, COPY
이 3가지 명령만이 이미지 레이어로 저장된다고 합니다. 따라서 모든 Dockerfile 명령어들이 이미지 레이어화 되는 것은 아닙니다.
해당 특징을 이용하여 원하는 이미지 레이어를 만들면 될 것 같습니다.
이미지를 실행한 상태, 이미지의 목적에 맞는 파일이 들어있는 파일 시스템과 격리된 시스템 자원 및 네트워크를 사용할 수 있는 독립된 공간이 생성됩니다.
컨테이너는 종료되었다고 메모리에서 삭제되지않고 남아있습니다. 삭제하려면 명시적으로 삭제해야 합니다. 즉, 종료가 되어도 다시 시작할 수 있습니다.
그래서 컨테이너 완전 제거를 위해서 docker stop {컨테이너이름}
이후 docker rm {컨테이너이름}
많이 실행 시킨 경험이 있네요.
컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일 및 데이터가 전부 사라진다는 것.
한 서버는 여러 개의 컨테이너를 가져도 상관없으며, 컨테이너는 각각 독립적으로 실행됩니다.
도커를 사용할 때 제대로 이해하고 사용한게 아니라서 이상한 상황들이 많았는데
컨테이너 생명주기라던지 이미지 레이어라던지 공부하고 보니까 이해가 되었습니다.
또한 이미지 레이어에 대해 마음대로 커스텀하거나 사용하려면 많은 이해가 필요할 것 같네요.
이후에 컨테이너를 관리할 수있는 쿠버네티스도 공부하고 사용해보면 좋을 것 같습니다.