반응형
해당 글에서는 Docker를 사용하기 위해 기본적인 아키텍처에 대한 이해와 흐름, 주요 용어들에 대해 이해를 돕기 위해 작성한 글입니다.
1) Docker
💡 Docker
- ‘컨테이너화’를 사용하여 응용 프로그램의 배포, 확장 및 관리를 자동화할 수 있는 오픈 소스 플랫폼입니다.
- 코드, 실행 시간, 시스템 도구 및 라이브러리를 포함하여 응용 프로그램을 실행하는 데 필요한 모든 것을 가볍고 격리된 환경으로 포함합니다.
- 응용 프로그램과 해당 종속성을 표준화된 단위로 패키징하여 다양한 환경에서 일관되게 배포하고 실행하기 쉽게 만들어줍니다.
💡 [ 더 알아보기 ]
💡 컨테이너화
- 응용 프로그램을 실행하는 데 필요한 모든 것을 포함한 가벼우며 격리된 환경을 제공합니다.
- 코드, 실행 시간, 시스템 도구 및 라이브러리 등을 포함하여 응용 프로그램과 해당 종속성을 표준화된 단위로 패키징하여 일관되게 배포하고 실행하는 것이 컨테이너화의 목적입니다.
💡 왜 Docker라고 불리게 되었는가?
- “Docker”라는 이름은 컨테이너화 기술의 개념에서 유래하였습니다. 이러한 컨테이너화 기반의 가상화 기술은 ‘화물 배송’에서 영감을 받았다고 합니다. 선박이 보다 안전하게 화물을 분반하기 위해 사용되는 “도크(Dock)”에서 유래한 용어인 “Docker”가 사용이 되었습니다. 응용 프로그램을 격리된 환경에 “도크”하여 배포, 실행 및 관리하는 것을 목표로 합니다.
💡 Docker는 무료인가?
- 기본적으로는 무료입니다. 그러나 도커의 개인 정보나 이미지 등을 사용하려면 Pro, Team의 price를 이용해야 합니다.링크를 참고하시면 가격을 확인할 수 있습니다. https://www.docker.com/pricing/
1. Docker 사용목적
💡 Docker 사용목적
- Docker를 사용해야하는 목적에 대해서 알아봅니다.
Docker 사용 목적 | 설명 |
빠르고 일관된 애플리케이션 제공 | - 개발자는 로컬 컨테이너를 사용하여 표준화된 환경에서 작업할 수 있으며, CI/CD 워크플로에 적합합니다. |
효율적인 배포 | - 응용 프로그램과 종속성을 컨테이너로 패키징하여 일관된 배포를 자동화하고, 환경에 관계없이 실행할 수 있습니다. |
확장성 | - 컨테이너화된 응용 프로그램을 쉽게 확장하고, 컨테이너를 추가하거나 제거하여 성능과 가용성을 조정할 수 있습니다. |
격리된 환경 | - 각각의 Docker 컨테이너는 격리된 환경에서 실행되어 독립적으로 동작하며, 응용 프로그램의 안정성과 보안성을 향상시킵니다. |
개발 환경의 일관성 | - Docker는 개발 환경을 컨테이너로 추상화하여 개발자들이 동일한 환경에서 작업할 수 있도록 지원합니다. |
💡 Docker 사용목적
1. 빠르고 일관된 애플리케이션을 제공합니다.
- 개발자가 애플리케이션과 서비스를 제공하는 로컬 컨테이너를 사용하여 표준화된 환경에서 작업할 수 있도록 하여 개발 수명 주기를 간소화합니다.
- 컨테이너는 CI/CD(지속적인 통합 및 지속적 전달) 워크플로에 적합합니다.
2. 효율적인 배포
- Docker는 응용 프로그램과 해당 종속성을 컨테이너라는 표준화된 단위로 패키징하여 일관되게 배포할 수 있습니다. 이를 통해 배포 프로세스를 자동화하고, 배포 환경에 관계없이 응용 프로그램을 실행할 수 있습니다.
3. 확장성
- Docker는 컨테이너화된 응용 프로그램을 쉽게 확장할 수 있도록 지원합니다. 필요한 만큼의 컨테이너를 추가하거나 제거하여 응용 프로그램의 성능과 가용성을 조정할 수 있습니다.
4. 격리된 환경
- 각각의 Docker 컨테이너는 격리된 환경에서 실행되기 때문에, 서로의 영향을 받지 않고 독립적으로 동작할 수 있습니다. 이를 통해 응용 프로그램의 안정성과 보안성을 향상할 수 있습니다.
5. 개발 환경의 일관성
- Docker는 개발 환경을 컨테이너로 추상화하여 개발자들이 동일한 환경에서 작업할 수 있도록 지원합니다. 이를 통해 개발자들은 응용 프로그램을 더 쉽게 빌드, 테스트 및 디버깅할 수 있습니다.
2. VM(Virtual Machine)과 Docker의 차이
💡 VM(Virtual Machine)
- 호스트 컴퓨터 위에 가상 운영 체제를 실행하는것으로 각 운영 체제는 자체 커널을 가지고 독립적으로 작동합니다.
- 이는 각 VM이 완전히 격리되어 있고 서로 영향을 주지 않는다는 이점이 있습니다. 하지만 VM은 용량과 성능 측면에서 무겁고 비교적 오버헤드가 많이 발생할 수 있습니다.
💡 Docker
- 호스트 운영 체제 위에 실행하는 것으로 컨테이너라는 단위로 애플리케이션과 필요한 라이브러리 및 종속성을 패키징 합니다.
- Docker 컨테이너는 ‘호스트 커널’을 공유하므로 가볍고 빠르게 실행될 수 있습니다.
- 여러 컨테이너를 실행하는 경우 각 컨테이너는 격리되지만 공유 리소스를 사용하여 높은 효율성을 유지합니다.
💡 가상화의 목적이 완전한 격리와 다양한 운영 체제의 실행이라면 VM이 적합하고, 애플리케이션의 패키징, 배포, 확장에 초점을 둔다면 Docker가 더 적합할 수 있습니다.
비교 요소 | 가상 머신 (VM) | 도커 (Docker) |
구조 | 하드웨어 위에 호스트 OS와 게스트 OS로 구성 | 호스트 OS 위에서 동작하며 컨테이너화된 애플리케이션 실행 |
성능 | 하이퍼바이저로 인한 오버헤드로 약간의 성능 저하 | 컨테이너화로 인한 가벼운 성능 손실 |
시작 시간 | VM을 시작하기 위해 시간이 필요 | 컨테이너는 몇 초 내에 시작 가능 |
자원 사용량 | 독립적인 자원을 사용하여 오버헤드 발생 | 호스트의 커널 및 자원을 공유하여 효율적인 자원 사용 |
확장성 | 가상 머신은 더 많은 하드웨어를 추가하여 확장 가능 | 도커는 컨테이너를 복제하여 수평으로 확장 가능 |
격리성 | 격리된 환경을 제공하여 보안을 강화 | 호스트와 컨테이너 간 격리가 상대적으로 약함 |
관리 용이성 | VM은 완전한 운영 체제를 관리해야 함 | 도커는 이미지와 컨테이너를 사용하여 관리 용이 |
3. Docker 아키텍처 및 흐름
💡 Docker 아키텍처
- 해당 아키텍처는 Docker를 이용하여 ‘클라이언트 - 서버’를 구성하는 아키텍처입니다.
💡Client 역할
- Docker 명령어를 사용하여 컨테이너를 실행, 관리, 모니터링하고, 이미지를 빌드하거나 다운로드할 수 있습니다. 또한 Docker 명령어를 통해 Docker Host와 상호작용 하는 역할을 합니다.
💡 Docker Host 역할
- Docker 컨테이너를 실행하는 데 사용되는 가상머신을 의미합니다.
- Docker 데몬을 실행하여 컨테이너를 생성, 시작, 중지 및 관리를 수행하는 역할을 수행합니다.
- Client의 요청을 받아들이고 컨테이너를 생성, 시작, 중지, 제거하는 등의 작업을 수행합니다. 또한, 호스트 운영 체제의 리소스를 사용하여 컨테이너를 실행하고 관리합니다.
💡 Docker Registry 역할
- Docker 이미지를 저장하고 관리하는 중앙 집중식 저장소입니다.
- 공식적인 도커 레지스트리로, 도커 허브(Docker Hub)를 통해서 Docker 이미지를 공유하고 검색할 수 있도록 합니다.
- 또한, 개인이나 기업은 독립적인 도커 레지스트리를 구축하여 이미지를 안전하게 저장하고 관리할 수 있습니다.
💡 Docker 클라이언트, 도커 호스트, 도커 레지스트리 간 흐름
1. Client → Docker Host
- 클라이언트(Client)는 도커 명령어(Docker run, build, pull, …)를 사용하여 도커 호스트(Docker Host)에 요청을 보냅니다.
2. Docker Host
- 도커 호스트(Docker Host)는 클라이언트(Client)의 요청을 받아들이고 해당 요청에 따라 컨테이너를 생성, 중지, 제거하거나 이미지를 관리합니다.
3. Docker Host → Registry
- 만약 클라이언트(Client)가 이미지를 생성하거나 업로드하려면, 도커 호스트(Docker Host)는 해당 이미지를 도커 레지스트리(Registry)에 업로드합니다.
4. Registry
- 도커 레지스트리(Registry)는 이미지를 저장하고 관리하는 중앙 집중식 저장소입니다. 도커 호스트(Docker Host)에서는 도커 레지스트리(Registry)에 이미지를 업로드하거나 다운로드할 수 있습니다.
5. Docker Host → Client
- 컨테이너가 종료되면, 도커 호스트(Docker Host)는 해당 컨테이너의 상태와 결과를 클라이언트(Client)에게 반환합니다. 이러한 과정들을 통하여 클라이언트, 도커 호스트, 도커 레지스트리는 도커 환경에서 상호작용하며 이미지 업로드와 다운로드, 컨테이너의 생성과 관리 등의 작업을 수행합니다.
[ 더 알아보기 ]
💡 Docker 명령어
- Client에서 Docker를 사용하는 명령어는 아래 표와 같습니다.
명령어 | 설명 |
docker run | Docker 컨테이너를 실행합니다. |
docker build | Docker 이미지를 빌드합니다. |
docker pull | Docker 이미지를 다운로드하여 로컬 Docker 환경에 저장합니다. |
2) Docker 주요 용어
💡 Docker 주요 용어
- 해당 용어들은 기본 과정에서 사용하는 주요 용어들로 추후 심화버전에서 다양한 용어들에 대해 다뤄봅니다.
0. Docker 주요 용어 요약
용어 | 분류 | 설명 |
도커 클라이언트(Docker Client) | 아키텍처 요소 | 도커를 사용하기 위한 커맨드 라인 도구입니다. 사용자는 도커 클라이언트를 통해 도커 호스트와 상호 작용하고, 도커 이미지를 관리하며, 도커 컨테이너를 실행, 중지, 삭제 등을 할 수 있습니다. |
도커 호스트(Docker Host) | 아키텍처 요소 | 도커 이미지를 저장하고, 도커 컨테이너를 실행하며, 도커 클라이언트와 통신합니다. |
도커 레지스트리(Docker Registry) | 아키텍처 요소 | 도커 이미지를 저장하는 중앙 저장소입니다. 도커 클라이언트는 도커 레지스트리에서 이미지를 검색하고, 푸시하고, 풀(pull)할 수 있습니다. |
도커 데몬(Docker Deamon) | 구성요소 | 도커 호스트에서 실행되며, 도커 클라이언트와 상호 작용하고, 도커 이미지와 컨테이너를 관리합니다. |
도커 이미지(Docker Image) | 구성요소 | 도커 컨테이너를 실행하는 데 필요한 파일과 설정을 포함하는 가볍고 독립적인 실행 가능한 패키지입니다. 도커 레지스트리에서 가져올 수 있고, 도커 파일을 사용하여 빌드할 수도 있습니다. |
도커 컨테이너(Docker Container) | 구성요소 | 도커 이미지의 인스턴스입니다. 격리된 환경에서 실행되며, 운영 체제 수준의 가상화 기술을 사용하여 프로세스를 격리합니다. |
도커 허브(Docker Hub) | 구성요소 | 도커 커뮤니티에서 제공하는 공개적인 도커 레지스트리입니다. 도커 허브에서는 다양한 도커 이미지를 검색하고, 공유하고, 다운로드할 수 있습니다. |
도커 파일(Docker File) | 구성요소 | 도커 이미지를 빌드하기 위한 텍스트 파일입니다. 도커 이미지를 구성하는 명령어와 설정이 포함되어 있습니다. 도커 파일을 사용하면 반복적인 이미지 빌드를 자동화할 수 있습니다. |
1. 도커 클라이언트(Docker Client)
💡 도커 클라이언트(Docker Client)
- 도커 컨테이너와 상호작용을 하기 위한 커멘드 라인 도구입니다.
- 도커 클라이언트를 사용하면 도커 호스트(Docer Host)와 통신하여 도커 컨테이너의 생성, 실행, 관리 등을 할 수 있습니다.
- 다양한 명령어와 옵션을 제공하여 도커 환경을 효율적으로 관리할 수 있도록 도와줍니다.
💡 [참고] Docker Client에서 Docker Host로 보내는 명령어 목록들
- 해당 명령어는 이전에 최초 설정 과정에서 사용했던 명령어들을 가져왔습니다.
docker 명령어 | 설명 |
docker -v | docker 버전을 확인합니다. |
docker ps -a | docker의 컨테이너 목록을 확인합니다. |
docker pull [docker image] | docker의 이미지를 다운로드 받습니다. |
docker build | docker 이미지를 빌드합니다. |
docker push | docker 이미지를 레지스트리에 업로드합니다. |
docker run | docker 이미지를 기반으로 컨테이너를 생성하고 실행시킵니다. |
docker login | docker 계정 로그인을 수행합니다. |
docker image ls | docker 이미지 목록들을 확인합니다. |
docker tag | docker 이미지에 이름 또는 태그를 할당합니다. |
docker pull | docker 이미지를 레지스트리에서 가져옵니다. |
2. 도커 호스트(Docker Host) = 도커 서버(Docker Server)
💡 도커 호스트(Docker Host) = 도커 서버(Docker Server)
- 도커 컨테이너를 실행하는 데 사용되는 시스템입니다. 도커 엔진이 설치되어 있는 머신 또는 가상 머신을 의미합니다.
- 클라이언트(Client)로부터 명령어를 전달받아 컨테이너의 생성, 실행, 관리를 담당하며, 도커 이미지를 저장하고 컨테이너 간 통신을 관리합니다.
- 도커 호스트는 호스트 운영 체제와 네트워크와 상호작용하며, 컨테이너가 실행되는 환경을 제공합니다.
3. 도커 레지스트리(Docker Registry)
💡 도커 레지스트리(Docker Registry)
- 도커 이미지를 저장하고 관리하기 위한 중앙 저장소입니다. 도커 이미지는 컨테이너화된 애플리케이션을 실행하기 위한 파일 시스템과 실행 환경을 포함하고 있습니다.
- 도커 레지스트리는 이러한 이미지들을 중앙에서 관리하고 공유할 수 있는 플랫폼입니다.
- 도커 레지스트리를 사용하면 이미지를 쉽게 관리하고 배포할 수 있으며, 여러 사용자와 협업하여 이미지를 공유할 수도 있습니다.
4. 도커 데몬(Docker Deamon)
💡 도커 데몬(Docker Deamon)
- 클라이언트에서 요청한 ‘도커 명령어를 처리’하고 도커 컨테이너를 관리하는 백그라운드 프로세스입니다.
- 도커 엔진과 상호 작용하여 컨테이너의 생성, 실행, 중단, 삭제 등을 처리합니다.
- 주로 서버에서 실행되며, 도커 API 요청을 받아들이고 이미지, 컨테이너, 네트워크 등의 관리를 담당합니다. 또한, 도커 데몬은 컨테이너의 생명주기를 관리하고 리소스 할당, 네트워크 연결 등의 작업을 처리합니다.
💡 [참고] Docker desktop에서 ‘Engine running‘ 부분을 통해 현재 Docker Engine이 수행되고 있고 백그라운드 프로세스로 Docker Daemon이 수행되고 있습니다.
💡 [참고] 또한 터미널의 아래의 명령어를 입력하면 Docker Daemon이 수행됨을 확인할 수 있습니다.
$ docker daemon
5. 도커 이미지(Docker Image)
💡 도커 이미지(Docker Image)
- 도커 컨테이너를 실행하기 위한 파일과 설정 정보를 포함하는 컨테이너의 템플릿을 의미합니다.
- 자신만의 이미지를 가질 수 있고 다른 사람이 만든 이미지를 가져와 사용할 수도 있습니다. 그리고 이 이미지는 레지스트리에 게시됩니다.
- 이미지는 도커 파일(Dockerfile)이라는 텍스트 파일에 정의되며, 도커 이미지를 생성하는 데 사용됩니다.
1. 도커 레지스트리에서 관리되고 저장됩니다.
- 도커 허브는 도커가 제공하는 공개 레지스트리로, 다른 사람들과 도커 이미지를 공유하고 검색할 수 있는 장소입니다.
- 도커 허브 이외에도 도커 엔터프라이즈 에디션을 사용하여 개인적인 레지스트리를 구축할 수도 있습니다.
2. 도커 이미지는 컨테이너를 생성하고 실행하기 위해 사용됩니다.
- 도커 클라이언트를 사용하여 이미지를 다운로드하고 컨테이너를 생성할 수 있습니다.
- 이미지는 컨테이너의 기반이 되며, 여러 개의 컨테이너를 동시에 실행하거나 스케일링할 수도 있습니다.
3. 도커 이미지는 애플리케이션을 쉽게 배포하고 관리할 수 있는 강력한 도구입니다.
- 이미지를 빠르게 구축하고 공유함으로써 개발과 운영의 효율성을 높일 수 있습니다.
💡 사용 예시
- 아래와 같이 nginx라는 이미지를 생성할 수도 있으며, adjh54/my-nginx라는 레지스트리에서 가져온 이미지도 생성 관리 됩니다.
6. 도커 컨테이너(Docker Container)
💡 도커 컨테이너(Docker Container)
- 실행 가능한 이미지 인스턴스를 의미합니다.
- 컨테이너는 컨테이너 간의 격리된 환경에서 실행되며, 호스트와는 독립적으로 실행될 수 있습니다. 이를 통해 애플리케이션의 이식성과 확장성이 향상되고, 리소스 사용이 최적화됩니다.
💡 [참고] Docker로 nginx를 이미지를 다운받아서 Docker 컨테이너로 생성하고 실행하였습니다.
7. 도커 허브(Docker Hub)
💡 도커 허브(Docker Hub)
- 도커 컨테이너 이미지를 공유하고 관리하기 위한 클라우드 기반 레지스트리입니다.
- 도커 허브를 사용하면 컨테이너 이미지를 업로드, 다운로드 및 공유할 수 있습니다. 또한 도커 허브는 공식적인 이미지 저장소로서 다양한 언어, 프레임워크, 데이터베이스 등의 컨테이너 이미지를 제공합니다.
- 사용자는 도커 허브에서 이미지를 검색하고 필요한 이미지를 사용할 수 있습니다. 도커 허브는 개인 및 조직용 계정을 제공하여 이미지를 관리하고 접근 권한을 제어할 수도 있습니다. 도커 허브는 도커 생태계에서 핵심적인 역할을 담당하며, 컨테이너 기반 애플리케이션 개발과 배포를 위한 필수 도구입니다.
💡 [참고] Dockerhub 사이트에 접속하여 ‘Explore’ 탭을 확인하면 아래와 같이 다양한 언어, 프레임워크, 데이터베이스 등의 컨테이너 이미지를 제공받을 수 있습니다.
8. 도커 파일(Dockerfile)
💡 도커 파일(Dockerfile)
- 도커 이미지를 만들고 빌드하기 위한 텍스트 파일을 의미합니다. 이는 컨테이너 이미지를 구성하는데 필요한 모든 단계와 명령을 정의합니다.
- 도커 파일은 일련의 명령을 작성하여 이미지를 빌드하는 방법을 지정합니다. 일반적으로 도커 파일은 기본 이미지를 지정하고, 필요한 패키지를 설치하고, 파일을 복사하며, 명령을 실행하는 등의 작업을 수행합니다.
- 각 명령은 도커 파일에서 한 줄씩 작성되며, 이전 단계의 결과를 기반으로 수행됩니다.
- 도커 파일을 사용하면 반복적이고 일관적인 컨테이너 이미지 빌드 프로세스를 자동화할 수 있습니다. 도커 파일을 작성하고 빌드하면 도커 엔진이 자동으로 이미지를 생성하고 저장할 수 있습니다.
오늘도 감사합니다. 😀
반응형
'Docker > 이론 및 문법' 카테고리의 다른 글
[Docker] Docker 이해하기 -4 : Docker Compose 이해하고 구성하기 (3) | 2024.06.07 |
---|---|
[Docker] Docker 이해하기 -3 : Dockfile 이해하고 Nginx 구성 및 실행방법 (1) | 2024.02.01 |
[Docker] Docker 이해하기 -2 : 컨테이너 라이프 사이클 & CLI 이해하기 (0) | 2023.12.22 |