Docker

wookhyung·2022년 12월 11일
0

톺아보기

목록 보기
7/8

발표 스터디 8번째 주제로 선정한, Docker 에 대한 정리 글입니다.

도커란?

💡 어플리케이션을 패키징 할 수 있는 도구

  • 컨테이너라고 불리는 하나의 작은 소프트웨어 유닛 안에 애플리케이션과 그에 필요한 System Tools, 환경 설정, 모든 의존성들을 하나로 묶어서 다른 서버나 다른 PC, 어떤 곳에도 쉽게 배포하고 안정적으로 구동할 수 있게 도와주는 도구.
  • 기술이 전체적으로 발달함에 따라 어플리케이션 하나를 구동하는 데에도 꽤 많은 것들이 필요해짐.
  • Node.JS 를 예로 들면, 단순히 소스코드 만을 서버에 배포하는 것만으로는 어플리케이션을 구동하는데 문제점이 있음. 외부 라이브러리를 사용한다면, 여러 의존성과 환경 설정과 관련된(ex. 환경 변수) 모든 것들을 일일이 서버마다, 혹은 PC마다 개발자들이 설정하는 과정은 매우 번거롭게 오류가 발생할 확률이 높음.

🤔 내 PC에서는 잘 되는데, 배포하면 왜 안되지?

  • 노드 JS 버전이 달라서..
  • 구동하는 환경이 달라서..

이런 번거로움을 해결하기 위해서 Docker가 등장했음.

  • 도커 컨테이너 안에는 어플리케이션 뿐만 아니라, 어플리케이션을 정상적으로 동작시켜주기 위한 Node.JS, 환경 설정, npm, 여러 라이브러리들의 의존성, 어플리케이션 실행에 필요한 다양한 리소스들이 포함될 수 있음.
  • 도커 컨테이너를 사용하게 되면, 어플리케이션을 구동하기 위해 런타임 환경에 필요한 모든 것들을 담고 있기 때문에 어느 곳에서, 언제든 동일한 환경에서 구현할 수 있음.
  • 내 PC에서는 되는데 왜 거기서는 안돼? → ❌

Container vs VM(Virtual Machine)

VM

  • VM은 하드웨어 Infrastructure 위에, VMware나 VirtualBox 같은 Hypervisor software를 이용해서 각각의 가상의 머신을 만들 수 있음.
  • 하나의 운영체제 위에서 각각의 고립된 다른 환경에서 구동하기 위해서 VM을 사용함.
  • 각각의 고립된 다른 환경들(Virtual Machine)은 운영체제(OS)를 포함하고 있기 때문에, Mac 위에서 리눅스나 윈도우 같은 운영체제를 사용하는 것이 가능함.
  • 하지만 고립된 환경마다 운영체제를 포함하고 있기 때문에 굉장히 무거워짐.
    • 구동 시간 오래 걸림, 컴퓨터의 리소스를 많이 사용함, …
  • 이런 VM의 컨셉을 가져오면서도 경량화한 모델이 바로 Container임.

Container

  • 하드웨어에서 설치된 Host OS 위에, Container Engine이라는 소프트웨어를 설치하면 각각의 어플리케이션을 고립된 환경(Container)에서 실행할 수 있음.
  • VM과 다르게 고립된 환경에서 운영체제를 포함하지 않고, Container Engine에 설치된 Host OS를 공유함.
  • Container를 구동하기 위해, Container Engine이 필요하고 그 엔진이 Host OS에 접근해서 필요한 것들을 처리하는 방식임.
  • 이 Container Engine 중에서 가장 많이 사용하는 것이 Docker

Docker는 Container를 만들고 배포하고 구동한다.

  • 도커의 3대 구성요소
    • Dockerfile → Container를 어떻게 만들지에 대한 설명서
      • 어플리케이션을 구동하기 위해서 필요한 파일들
      • 어떤 라이브러리, 프레임워크를 설치해야 되는지에 대한 의존성 명시
      • 필요한 환경 변수
      • 구동을 위한 스크립트
    • Image
      • 코드를 실행하기 위한 모든 환경 설정 + Dockerfile
      • 실행되고 있는 어플리케이션의 Snapshot을 찍어서 Image를 만듦.
      • 객체지향의 Class와 비슷함.
    • Container
      • 만들어둔 Image를 고립된 환경에서 실행하는 곳

도커 이미지 배포하기

  • Local 환경에서 Image를 만들어서 Github와 같은 Container Registry라는 곳에 Image를 push 하고, 필요한 서버나 다른 PC에서 Image를 pull 해와서 실행하면 됨.
  • Image를 실행하기 위해 Docker와 같은 Container Engine 설치가 필요함.
  • dockerhub, Github Packages 같은 공개 저장소도 있지만, 대부분 실무에서는 Private으로 관리해야 하기 때문에 AWS, Google Cloud, Microsoft Azure 같은 서비스를 이용함.
  1. Dockerfile의 Snapshot을 찍어서 Image 파일을 만든다.
  2. Container Registry(AWS, Google Cloud, …)에 Image를 올려둔다.
  3. 필요한 곳에서 올려져있는 Image를 가져와서 Container Engine을 통해 실행한다.

  1. npm init -y
  2. npm i express
// app.js
const express = require('express');

const app = express();

app.get('/', (req, res) => {
  res.send('Hello, Docker! 🐬');
});

app.listen(8080, () => console.log('Server started!'));
// Dockerfile

// Docker Hub에 있는 node:16-alpine(최소한의 linux) 이미지 사용
FROM node:16-alpine

// 이미지 안에 애플리케이션 코드를 넣기 위한 디렉터리 생성
WORKDIR /app

// node:16 이미지에 node.js와 npm은 설치되어 있으므로 앱 의존성말 설치
COPY package.json package-lock.json ./

// npm 설치
RUN npm ci

// Docker 이미지 안에 앱의 소스코드를 넣기 위함
COPY index.js .

// node와 index.js를 실행해라
ENTRYPOINT ["node", "index.js"]
docker build 
-f (어떤 Dockerfile을 쓸건지) Dockerfile 
-t fun-docker (Image에 붙일 이름) 
. (파일이 어디있는지)
docker images

docker run 
-d (컨테이너를 백그라운드에서 실행하기 위함)
-p 8080:8080 (호스트 포트와 컨테이너 포트 지정)
컨테이너 내부에서 8080 포트로 리스닝하고 있는 HTTP 서버를 호스트 컴퓨터에서 8080 포트로 접속할 수 있도록 해줍니다.
docker-example
// 실행되고 있는 컨테이너 확인
docker ps
docker logs <Container ID>
  • Docker GUI 활용
  • docker hub 배포
    • creat-repository → docker-exmaple

      docker tag fun-docker:latest ctdlog/docker-example:latest
      docker images
      docker login
      docker push ctdlog/docker-example:latest

Reference

https://youtu.be/LXJhA3VWXFA

profile
Front-end Developer

0개의 댓글