패스트캠퍼스 데브캠프 60일차 [Docker]

Su Min·2024년 8월 14일
0
post-thumbnail

Docker 🐳

컨테이너 기반의 오픈소스 가상화 플렛폼으로 컨테이너 이미지를 생성, 관리, 공유, 구동하는 작업을 손쉽게하는 컨테이너 런타임 도구이다.

가상화란 하드웨어를 효율적으로 활용하기 위해서 하드웨어 공간 위에 가상의 머신을 만드는 기술을 말하며 컨테이너는 어떤 환경에서도 애플리케이션을 실행할 수 있도록 필요한 모든 요소(애플리케이션, 시스템툴, dependencies 등)를 포함하는 소프트웨어 패키지이다.
도커는 독립된 환경을 만들어 하드웨어를 효율적으로 활용하는 기술이다!

개발 과정에서 다른 라이브러리와 충돌하는 것을 방지하기 위해 격리된 환경이 필요할 때, 완성된 서비스를 배포할 때, 혹은 배포중인 서비스를 받아서 실행해 볼 때 도커를 사용하면 편리하다. 애플리케이션과 애플리케이션이 구동하는데 필요한 모든 것들을 도커 컨테이너에 담아서 저장하고 구동하고싶은 서버에 해당 도커 컨테이너를 다운받는다면 어떤 pc에서도 동일하게 구동할 수 있기 때문이다.

너 pc에서는 되는데 왜 난 안돼?? 🤬

애플리케이션을 구동하는데 필요한 여러가지들(npm, node.js, dependencies 등)을 설정하고 준비하는 번거로움을 도커로 해결 가능하다!

Container 만들기

컨테이너를 만들고 사용하기 위해서는 Dockerfile, Image, Container가 필요하다. 도커파일을 만들고 이미지를 만들어서 컨테이너를 구동할 수 있다.

  • Dockerfile
    어떤 이미지를 만들건지, 컨테이너를 어떻게 만들어야 하는지에 대한 설명서로 애플리케이션을 구동하기 위해 필요한 파일은 무엇이 있는지(Copy files), 어떤 dependencies를 설치해야하는지(Install dependencies), 필요한 환경변수 설정(Set environment variables), 어떻게 구동해야하는지에 대한 script(Run setup scripts)이다.

  • Image
    어플리케이션을 실행하는데 필요한 코드, 런타임 환경, 시스템툴, 시스템 라이브러리 등을 담은 바이너리 파일이며 이미지는 한번 만들어지면 변경이 불가능한 읽기 전용으로 컨테이너에 변경이 일어나도 이미지는 영향을 받지 않는다.

  • Container
    이미지를 개별적인 시스템 안에서 실행할 수 있는 공간으로 컨테이너 안에서 이미지를 이용해 애플리케이션이 구동한다.
    * Container 배포
    Dockerfile을 build시켜 Image로 만들고 만든 Image를 Container Repository에 Push한다. 실서버에 Docker나 Docker와 같은 컨테이너 엔진을 설치한 후 Container Repository에서 Image를 Pull로 당겨오고 Docker에서 Image를 run 한다.

Docker사용해보기 🐳

간단한 node.js 애플리케이션에서 Docker를 사용해보았다. 빈 디렉토리를 열고 터미널에서 초기화를 하고 express를 설치한다.

npm init -y
npm i express

index.js에 간단한 서버를 만든다.

const express = require("express")

const app = express()

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

app.listen(8080, () => console.log("server listening on port"))

Dockerfile

Dockerfile을 만들어 어떤 이미지를 만들고 프로젝트에 어떤 것들이 필요한지 명시한다.

FROM node:16-alpine  
// FROM BASEIMAGE 초기에 어떤 baseImage를 사용할건지 명시
// node에서 만들어둔 baseImage활용, node 16 버전

WORKDIR /app
// 컨테이너 안에서 어떤 경로에서 실행할건지, 어떤 디렉토리에 복사할건지 명시
// 리눅스 cd와 같은 명령어

COPY package.json package-lock.json ./
// 프로젝트 설정 파일을 app으로 복사
  
RUN npm ci
// 복사한 프로젝트의 모든 설정들을 설치할 명령어
// install을 사용하면 개발한 버전과 실제로 설치한 버전이 다를 수 있는 문제점이 있음
// ci명령어를 사용하면 COPY에 명시되어있는 packeage.json, package-lock.json의 
// dependencies버전을 그대로 설치할 수 있음

COPY index.js .
// 소스파일 COPY

ENTRYPOINT [ "node", "index.js" ]
// 실행 명령어

Dockerfile은 명령어 하나하나가 레이어로된 시스템이어서 가장 빈번히 변경되는 것을 제일 나중에 적으면 레이어 제일 위쪽으로 위치하게 된다. 그렇기 때문에 이미지를 만들고 나중에 소스파일이 변경되어 새로운 이미지를 만들어야 될 때 레이어를 제일 위쪽에 배치하게 되면 변경된 최상단의 레이어만 업데이트해주고 나머지 레이어는 다시 만들지 않아도 된다. 변경되지 않은 레이어는 재사용, 캐시된 걸 사용하고 변경된 레이어부터 그위까지 다시 build하기때문에 이미지를 다시 만드는 시간을 단축할 수 있다.

Image

도커파일을 만들었으면 터미널에서 명령어를 이용하여 이미지를 생성한다.
docker build -f 도커파일명 -t 이미지명 .

명령어설명
.build context 도커에게 도커파일이 최상위 경로에 있음을 알려준다. 즉, 현재경로를 지정
-f어떤 도커파일을 사용할건지 명시 use -f to point to a Dockerfile
-t도커이미지의 이름을 부여 use -t to name the image

도커파일을 기반으로 정상적으로 이미지가 생성되었음을 확인 할 수 있다. 👏

Container

생성된 이미지를 이용해서 컨테이너를 실행한다.
docker run -d -p 8080:8080 first-docker

명령어설명
-d백그라운드 모드로 실행,
백그라운드에서 도커가 동작해야하므로 터미널에게 '나 끝날때까지 기다리지말고 너 하던거해'라고 분리하는 것 (detached)
-p호스트-컨테이너 간 포트 바인딩, 호스트머신 포트8080과 컨테이너 포트8080을 연결해주는 것 -p is port publishing
각각의 컨테이너는 개별적인 환경에서 동작하고 있으므로 호스트머신에있는 포트와 연결해주는 작업을 해야한다.

실행 명령어를 치고 컨테이너 아이디가 프린트되면 정상적으로 실행됬음을 의미한다.

추가 명령어

명령어설명
docker ps현재실행중인 컨테이너 리스트 확인
docker logs 컨테이너ID컨테이너의 로그메세지 확인
docker image이미지 리스트 확인
docker tag 기존이미지명 변경이미지명이미지이름 바꾸기

Docker app에서 생성된 container, Image, log 등을 확인할 수 있다.

Docker hub 🐳

container를 업로드하려면 Docker hub에 레파지토리를 생성하고 생성한 레파지토리 명과 이미지명이 같도록 변경해준다. 이미 같다면 변경하지 않아도 된다.
vscode 터미널에서 docker login 명령어를 통해 로그인을 하고 Docker hub에 push한다.

docker push 계정이름/레포명&이미지명:tagname

정상적으로 푸시되면 Docker hub Repository에서 확인 할 수 있다.

profile
성장하는 과정에서 성취감을 통해 희열을 느낍니다⚡️

0개의 댓글

관련 채용 정보