티스토리 뷰
우선 Docker를 이해하기 위해선 컨테이너(=Container)에 대해 알아야합니다.
컨테이너(=Container)
소프트웨어는 OS와 Library마다 의존성을 갖고 있습니다. 따라서, 한 컴퓨터에서 성격이 다른 (OS, Library가 다른) 소프트웨어를 한번에 실행할 때 어려움을 가질 수 있고 관련된 구성을 관리하기 어렵습니다.
이러한 문제점을 해결해주는 기술이 바로 컨테이너입니다.
컨테이너는 Application을 실행하는 데 필요한 모든 구성 요소를 하나의 런타임 환경으로 묶는데 사용하는 기술입니다. 또한, 다른 실행 환경과의 간섭을 막고 실행의 독립성을 확보해주는 운영체계 수준의 격리 기술을 이야기합니다.
가상 머신(VM)과 컨테이너의 차이
Virtual Machine은 Host OS 위에 가상화를 시키기 위한 Hypervisor(Virtual Box, Xen, KVM 등)과 Guest OS를 올려 사용합니다. 이는 가상화된 하드웨어 위에 OS가 올라가는 형태로 Host OS 와는 완전히 분리됩니다.
반면, 컨테이너는 Container Engine 위에 Application 실행에 필요한 Binary만 올라가게 됩니다.
따라서, Virtual Machine은 Host OS와 완전히 분리된다는 장점이 있지만, OS 위에 OS를 올리는 구조이기 때문에 무겁고 느리다는 단점이 존재합니다.
하지만, 컨테이너는 Host OS와 Container Engine 위에서 바로 동작하며 Host의 커널을 공유합니다. 커널을 공유하면 I/O 처리가 쉬워 성능의 효율을 높일 수 있습니다.
컨테이너의 장점
책임 분리
컨테이너화를 통해 책임을 분리할 수 있습니다. 즉, 개발자는 Application의 로직과 종속 항목에 집중할 수있고, IT 운영팀은 특정 소프트웨어 버전 및 구성과 같은 Application의 세부 요소 대신 배포 및 관리에 집중할 수 있습니다.
워크로드 이동성
컨테이너는 Linux, Windows, Mac 등의 운영체제를 가리지 않고 가상 머신, 물리적 서버, 개발자 컴퓨터, 데이터 센터, 온프레미스 환경, 퍼블릭 클라우드 등의 어느 환경에서나 구동되므로 개발 및 배포가 크게 쉬워집니다.
애플리케이션 격리
컨테이너는 OS 수준에서 CPU, 메모리, 스토리지 네트워크 리소스를 가상화 하므로 개발자에게 다른 Application으로부터 논리적으로 격리된 OS 환경을 제공합니다.
빠른 시작과 종료 시간
컨테이너는 실행된 OS에서 응용 프로그램 본체와 미들웨어를 실행만 하면 되기 때문에 응용 프로그램의 시작 시간은 VM보다 크게 단축됩니다.
컨테이너를 실행하는 것은 OS 입장에서 단순히 프로세스를 시작하는 것이기 때문에 일반적으로 프로세스가 시작하는 것과 별반 차이가 없습니다. 따라서 매우 빠르게 시작할 수 있는 것입니다.
Docker
Docker란 위에서 설명한 Container 기술을 기반으로 하는 오픈소스 가상화 플랫폼 입니다.
Docker를 사용하면 인프라에서 Application을 분리하여 Container로 추상화 시켜 소프트웨어를 빠르게 제공할 수 있습니다. 이를 통해 하나의 Host OS 안에서 여러 Container를 동시에 실행할 수 있습니다.
또한, Docker는 Container의 라이프 사이클을 관리하고 Application을 오케스트레이션(=Workflow를 자동화 시킨 형태)된 서비스로 배포할 수 있습니다.
도커의 아키텍처
Docker는 Client - Server의 아키텍처 구조를 띄고 있습니다. Docker Client와 Docker Daemon이 RestAPI를 사용하여 통신합니다.
도커 데몬(=Docker Daemon)
Docker API 요청을 수신합니다. 또한, 이미지와 컨테이너, 네트워크와 같은 도커 객체 및 도커 서비스를 관리합니다.
도커 클라이언트(=Docker Client)
Docker 사용자가 Docker와 상호작용하기 위한 방법 입니다. 기본적은 Docker 명령어를 통해 Docker Daemon과 통신합니다.
도커 레지스트리(=Docker Registry)
Docker 이미지를 저장하고 공유하기 위한 저장소입니다. Docker Hub는 가장 널리 사용되는 공개 Registry이지만, 보안 이슈나 특정 환경에서의 요구사항 때문에 private registry를 사용하기도 합니다.
Docker Hub
Docker Registry 중 하나로, 도커 커뮤니티에서 공개적으로 사용 가능한 수많은 Docker Image를 제공하는 중앙 저장소 입니다. 쉽게 말해 GitHub 처럼 여러 사람들의 이미지를 저장해놓은 저장소 입니다.
Docker Hub를 이용하면 손쉽게 이미지를 다운 받고 컨테이너에 적용시킬 수 있습니다.
도커 객체(=Docker Instance)
도커 객체는 각각의 이미지와 컨테이너를 의미합니다.
- Docker Image: 컨테이너 실해엥 필요한 파일과 설정 값 등을 포함하고 있습니다.
- Container: Docker Image를 기반으로 생성한 인스턴스입니다.
도커 이미지
Docker Image는 쉽게 말해 Container에 대한 설정 값과 다양한 실행 파일을 포함하고 있는 것입니다.
위 그림과 같이 Image를 통해 Container을 생성하고 실행하게 되면 해당 프로세스가 동작하게 되는 것입니다.
그럼, 이미지는 어떻게 동작할까요?
ubuntu 이미지에는 Layer A, Layer B, Layer C가 들어갑니다.
그럼 nginx 이미지를 만들기 위해선? → ubuntu 이미지에 niginx만 더하면 됩니다.
그럼 web app 이미지를 만들기 위해선? → nginx 이미지에 web app source만 더하면 됩니다.
이제 이미지가 어떻게 만들었는지 알게 되었다면, 이미지를 만드는 Dockerfile에 대해 알아보겠습니다.
도커 파일(=Docker File)
Docker File은 이미지 생성의 출발점으로 이미지를 생성하기 위한 명령어들을 작성하여 이미지를 구성할 수 있습니다.
즉, Docker File을 해석할 수 있다면, 해당 이미지가 어떻게 구성되어 있는지 알 수 있다는 의미가 됩니다.
FROM jdk8:latest
WORKDIR /app
RUN mkdir /app/nexus-2.14.9-01
RUN mkdir /app/sonatype-work
RUN yum -y install httpd
ENV JAVA_HOME /usr/local/jdk1.8.0_181
ENV PATH=$JAVA_HOME/bin:$PATH
ENV CLASSPATH=.
EXPOSE 3411
ADD run.sh /app/
CMD ["/app/run.sh"]
Docker File은 다음과 같이 작성되며, 많은 명령어가 존재하고 이미지 생성에 있어 다양한 설정을 줄 수 있습니다.
Docker File의 각 명령어는 이미지에 Layer를 만듭니다. Docker File을 변경하고 이미지를 다시 빌드하면 변경된 레이어만 다시 빌드하게 됩니다.
'Server > Docker' 카테고리의 다른 글
[Docker]이미지 압축 파일 저장 및 불러오기 (0) | 2024.09.10 |
---|---|
[Docker]Dockerfile과 Docker-compose.yml의 차이 (0) | 2024.09.10 |
[Docker]SSH 접속 프로그램을 통해 컨테이너 접속하기 (0) | 2024.09.03 |
[Docker]정적 IP Container 설정하기 (0) | 2024.09.02 |
[Docker]데이터 영속성 보장하기 (0) | 2024.09.02 |
- Total
- Today
- Yesterday