사실 이렇게 포스팅을 하나 해낼 때마다 새로운 개념에 대해 공부하는 것이 무섭고 힘들지만, 지식이 늘어난다는 것 자체에서 재미를 느끼고 있는 것 같다. 아는 만큼 보인다고 하니,,ㅎㅎ 견식을 넓히기 위해 더 열심히 공부해보자,, 나 자신,,, 오늘도 화이팅!~!~!~

이전 시간에 Docker의 등장 배경에 대해 알아보았으니 이번에는 Docker에 대해서 알아보자!
Docker는 컨테이너를 이용해 애플리케이션을 패키징하고 실행하는 가상화 기술이다. 즉, 애플리케이션과 실행에 필요한 모든 환경(라이브러리, 설정 파일 등)을 하나의 이미지로 만들어 어디서든 동일한 환경에서 실행할 수 있도록 하는 기술이다.
Docker는 여러 구성 요소로 이루어져 있다.
1️⃣ Docker Client
💡 사용자가 Docker를 조작하는 인터페이스
터미널에서 docker run, docker build 같은 명령어를 실행하면 Docker Client가 Docker Daemon과 통신해서 작업을 요청하는 방식이다.
docker run nginx
위 명령어를 실행하면 Docker Client가 Docker Daemon에게 "nginx 컨테이너를 실행해줘"라고 요청하는 것이라고 생각하면 된다.
2️⃣ Docker Daemon
💡 Docker의 핵심 엔진
Docker Client가 요청한 명령을 받아서 컨테이너를 만들거나 이미지를 다운로드하고, 실행 등을 관리하는 역할을 한다.
3️⃣ Docker Image
💡 컨테이너를 만들기 위한 설계도
Docker Image는 애플리케이션과 실행에 필요한 모든 환경(라이브러리 및 설정 파일 등)을 포함한 파일이다. 이미지는 변하지 않고, 항상 동일한 상태를 유지한다. 여러 개의 컨테이너가 하나의 이미지를 기반으로 실행될 수 있다.
이를 Dockerfile로 작성하고 docker build 명령어로 이미지를 생성할 수 있다. 이 이미지는 계층 구조로 구성되어 있으며, 각 레이어(계층)는 파일 시스템의 변경사항을 포함하는 스냅샷이다.
각 레이어는 하위 레이어에 영향을 주지 않으며, 동일한 레이어는 여러 이미지에서 공유된다. 이를 통해 빌드 시간 및 이미지 저장 용량, 이미지 다운로드 시간을 단축할 수 있다.
4️⃣ Docker Container
💡 실제로 애플리케이션이 실행되는 독립적인 환경
컨테이너는 이미지를 기반으로 실행되는 독립적인 환경이다. 컨테이너는 이미지를 기반으로 실행되는 가상 환경이다. 서버에 프로그램을 설치하는 게 아니라 컨테이너 내부에서 실행되기 때문에 독립적인 환경이 유지된다. 이미지에서 생성되고, 컨테이너는 독립적인 환경을 가지기 때문에 삭제해도 호스트 운영 체제에는 영향을 주지 않는다.
🔥 Container Lifecycle

docker createdocker start, docker rundocker pausedocker stop, docker killdocker rm5️⃣ Docker Registry
💡 Docker Image를 저장하는 공간
Docker Registry는 이미지를 업로드하고 다운로드할 수 있는 저장소이다. 공식적으로 제공되는 Docker hub를 가장 많이 사용하지만, AWS ECR, GCP GCR, Gitub Container Registry 등과 같은 클라우드에서 제공하는 저장소도 많이 사용한다.
컨테이너의 데이터를 저장하고 관리하기 위한 방법이다. 컨테이너는 기본적으로 컨테이너 내에서만 데이터를 저장하게 되는데, 이 데이터는 컨테이너가 종료되거나 삭제되면 사라질 수 있다.
하지만 Volume을 사용하면 컨테이너가 종료되거나 삭제되어도 데이터를 안전하게 유지할 수 있다.
🚀 Docker Volume의 개념
Docker Volume은 호스트 시스템에서 독립적으로 관리되는 데이터 저장소이다. 컨테이너 간에 데이터를 공유하거나, 컨테이너 재시작 후에도 데이터를 유지하려면 volume을 사용해야 한다. 그리고 volume은 컨테이너와 독립적으로 존재해서 여러 컨테이너가 동일한 volume을 마운트해서 데이터를 공유하거나 보존할 수도 있다.
📌 Bind Mount vs Volume vs tmpfs
Volume은 3가지 방식이 있다.
1. Bind Mount
호스트 시스템의 파일이나 디렉토리를 컨테이너 내에서 직접 마운트하는 방식이다. 때문에 마운트할 파일이나 디렉토리가 미리 호스트에 있어야 한다. 같은 디렉토리를 여러 컨테이너에서 마운트할 수는 있지만, Volume처럼 Docker가 관리하는 방식은 아니기 때문에 여러 컨테이너 간에 안전하게 공유되지는 않는다.
그리고 호스트에서 파일을 수정하면 컨테이너 내에서도 즉시 반영된다.
2. Volume
Docker의 내부 관리 방식으로 호스트 시스템과 독립적인 저장소를 제공한다. Volume은 Docker가 직접 관리하는 저장소로, 호스트 시스템과의 의존성을 줄여준다. 여러 컨테이너가 동일한 Volume을 마운트하여 데이터를 공유할 수 있다.
3. tmpfs
위 두 가지 방식과는 다르게 메모리 기반 저장소로 컨테이너가 종료되면 데이터가 사라진다. 메모리에 저장되므로 디스크에 비해 빠른 읽기/쓰기 속도를 자랑한다. 그러나 컨테이너가 종료되면 이 데이터는 사라져서 휘발성 데이터나 일시적인 데이터 저장에 적합하다.
1. 가볍고 빠르다.
기존의 가상 머신은 하나의 운영 체제를 통째로 실행해야 해서 부팅 속도가 느리고, 리소스를 많이 차지했다. 하지만 Docker는 운영 체제를 포함하지 않고 호스트 운영 체제의 커널을 공유하기 때문에 훨씬 가볍고 빠르게 실행된다.
2. 어디서든 동일한 환경에서 실행 가능
Docker Container는 애플리케이션과 실행에 필요한 모든 설정을 하나의 패키지(Docker Image)로 저장한다. 이 패키지만 있으면 어떤 환경에서도 똑같이 실행할 수 있다.
3. 빠른 배포 및 확장 가능
Docker는 컨테이너를 쉽게 만들고 지울 수 있어서 애플리케이션 배포 속도가 빠르다. 여러 개의 컨테이너를 동시에 실행할 수도 있어 서비스 확장이 쉽다.
4. 자동화 최적화
Docker는 CI/CD(지속적 통합 및 배포)와 잘 어울린다. 코드를 수정하면 자동으로 빌드, 테스트, 배포가 가능하도록 시스템을 구축하기 용이하다.
1. 보안이 가상 머신보다 약할 수 있다.
Docker Container는 호스트 운영 체제의 커널을 공유하기 때문에 한 컨테이너가 해킹당하면 다른 컨테이너나 호스트 운영 체제도 위험할 가능성이 있다. 그렇기 때문에 컨테이너 보안 정책을 강화해야하고, 컨테이너 격리를 위해 추가적인 보안 설정이 필요하다.
2. Windows & macOS에서 성능 저하 기능
Docker는 Linux 기반이기 때문에, Windows나 macOS에서 실행하게 되면 가상 머신을 사용해야 해서 성능이 떨어질 수 있다.
3. 격리 수준이 낮음
1번과 마찬가지로 호스트 운영 체제의 커널을 공유하고 있어 완전히 독립적인 환경을 만들기에는 가상 머신보다 격리 수준이 낮다.
Docker 이미지를 자동화해서 빌드하는 데 사용하는 텍스트 파일이다. 이 파일은 컨테이너 내에서 실행될 애플리케이션을 설정하는 명령어의 모음으로 구성된다. Dockerfile을 작성하면 Docker가 이것을 기반으로 이미지 빌드를 자동으로 실행해서 동일한 환경을 여러 번 반복해서 구축할 수 있다.
docker 컨테이너 애플리케이션을 정의하고 실행하기 위한 도구이다.
docker cli로도 이미지를 실행시켜 컨테이너를 생성할 수 있지만 네트워크 생성 및 환경변수 설정, 볼륨 마운트 등 각 명령어로 실행하기 때문에 명령어가 길고 복잡하다. 그래서 재사용하기 불편하다는 점이 있다.
그 불편함을 줄이기 위해서 Docker Compose를 사용한다. YAML 형식을 사용해서 모든 설정을 하나의 파일로 정의해서 단일 명령어(docker-compose)로 모든 서비스를 일괄적으로 관리할 수 있다. 버전을 통해 유지보수가 용이하고 재사용이 쉽다.

하,,,조금 대략적이지만,,,Docker에 대해서도 드뎌 정리를 끝냈다,,
고생했다 오늘의 나,,, 도커는 너무 어렵다,,,아니 그냥 개발이 어렵다,,,하지만 해내야지,,,나는 어른이니까,,^_^