오늘은 Docker의 개념에 대해 간단하게 설명해보려고 한다.
Docker란
Docker는 애플리케이션을 컨테이너 화하여 효율적으로 실행, 배포할 수 있는 오픈소스 플랫폼입니다.
일단 컨테이너라는 말이 익숙하지 않을 것이다. 컨테이너는 하나의 격리된 실행장소라고 생각하면 편할 것이다. 이렇게 격리를 통해 생기는 장점이 있다.
1. 의존성 충돌방지: 각 컨테이너는 각각의 종속성을 갖고 있기 때문에 어떤 컨테이너의 업데이트나 수정이 다른 컨테이너에 영향을 주지 않는다.
2. 환경관리: 서버에 도커만 설치되어 있다면 도커파일을 이용해 실행을 하면 서버의 환경과 관계없이 항상 같은 환경에서 실행할 수 있게 된다.
3. 자원격리: 각각의 컨테이너가 분리되어 있어 다른 컨테이너에 영향을 주지 않고 로컬 pc로도 영향을 줄 수 없기 때문에 보안이 향상된다.
4. 확장성: 도커는 생성과 삭제가 용의 하기 때문에 scale out을 할 수 있다.
Docker와 VM 차이
많은 도커강의를 보면 VM자주 비교를 하곤 한다. 나도 처음에는 VM과 차이점이 무엇인가에 대해 헷갈렸었기 때문에 이 부분도 한번 설명해보고자 한다.
infrastructure위에 우리의 host OS가 설치되어 있다. Host Operatin System까지는 일반적인 우리의 PC이다. 하지만 그 위의 부분부터 차이가 생긴다. 하나씩 살펴보자.
일단 VM에는 Hypervisor가 올라가 있고 도커에는 docker engine이 올라가 있다. 각각 VM과 docker를 실행시켜 주는 소프트웨어라고 생각하면 된다.
그 위를 살펴보면 VM은 guest os가 올라가 있고 도커는 실행에 필요한 라이브러리와 바이너리만 들어가게 된다. 여기서 큰 차이가 나타나는데 VM을 사용하게 되면 OS라는 큰 소프트웨어가 가상머신 위에서 돌아가게 되고 그 위에서 우리가 필요한 라이브러리, 바이너리를 설치하여 실행하게 된다. OS에는 우리가 사용하지 않는 잡다한 무거운 소프트웨어들이 들어있고 큰 용량을 차지한다. 즉 자원을 낭비하게 되는 것이다. 이러한 문제를 해결하기 위한 것이 바로 도커이다.
도커는 Docker engine위에 우리가 필요한 바이너리만 올리게 된다. 예를 들어 하나의 컨테이너에서는 python으로 만들어진 애플리케이션만 실행하면 되는 경우라면 python의 실행환경만 구성해 주는 것이다. 이렇게 굉장히 가볍고 관리하기 편한 특징 때문에 우리는 도커를 사용한다.
Docker 아키텍처
도커는 내부적으로 서버-클라이언트 구조를 사용한다. 도커는 Docker Daemon을 통해 build, pull 등과 같은 요청을 REST API를 이용해서 처리하게 된다.
Docker Client
docker client는 docker daemon과 API소통을 하기 위한 가장 중요한 역할을 한다. 위와 같은 docker run명령어를 입력하면 docker daemon으로 API요청을 보낸다.
Docker Daemon
다음과 같이 docker client에 명령어를 입력했지만 docker daemon is not running이라는 에러가 뜨는 것을 볼 수 있다. client에서 daemon으로 요청을 보냈지만 daemon이 실행되고 있지 않아서 에러가 난 모습이다. daemon은 client에서 온 명령을 수행하는 역할을 한다. container와 image, registry를 관리한다.
Docker Registry/Hub
docker hub의 모습이다. docker hub는 github처럼 도커파일을 public으로 업로드하고 공유할 수 있는 공간이다. 개인적인 저장공간인 Registry도 만들 수 있다.
deamon에 docker run명령어를 실행했을 때 만약 local에 image가 없다면 다음과 같이 docker hub에서 다운로드를 해온다.
Containers
컨테이너는 image를 통해 실행된 인스턴스이다. VMware에서 하나의 VM을 실행한 것처럼 하나의 실행되고 있는 객체라고 보면 편할 듯하다.
Images
image는 도커 컨테이너를 찍어내는 붕어빵틀로 많이 비유를 한다. image파일에는 도커 컨테이너를 만들기 위한 절차가 기록되어 있다. docker push를 이용해서 docker hub에 자신이 만든 이미지를 업로드할 수도 있다.
Docker compose
docker compose 여러 개의 컨테이너를 정의하기 위한 도구이다.
Expressjs, mysql을 docker compose로 배포해보기
const express = require('express'); const mysql = require('mysql'); const app = express(); const connection = mysql.createConnection({ host : 'db', user : 'root', password : '21771126!', database : 'test_schema', port : '3306' }); app.get('/', (req, res) =
paillo.tistory.com
자세한 사용법은 위의 블로그를 참고하면 좋을 것 같다.
Docker file
docker file은 docker image를 만들기 위해 작성해야 하는 파일이다. 프로젝트를 진행하다 보면 우리가 만든 프로젝트를 도커를 사용하여 배포해야 할 일이 생긴다. 이때 커스텀 이미지를 만들어야 하기 때문에 dockerfile을 작성한다.
Docker file 예시
From node:14
# 기본 베이스가 될 이미지 선택
RUN mkdir /test
# /아래 test폴더를 만든다
WORKDIR /test
# /test를 기본 작업폴더로 설정한다.
COPY ./package.json /test/package.json
# 프로젝트의 package.json파이을 /test안으로 복사한다.
RUN npm install
# 사용할 package를 설치한다.
COPY ./ /test
# 프로젝트를 전부 복사한다.
EXPOSE 5000
# port설정
ENTRRYPOINT ["npm", "run", "start", "-p", "5000"]
# 실행
다음과 같이 작성할 수 있다. 결과적으로는 우리가 만든 프로젝트가 image로 만들어지고 실행될 것이다.
'Docker | k8s' 카테고리의 다른 글
Expressjs, mysql을 docker compose로 배포해보기 (0) | 2023.05.10 |
---|