Docker

Jae·2023년 8월 17일
0

백엔드 - Node.js

목록 보기
7/10

Docker

  • 컨테이너 기반의 오픈소스 가상화 플랫폼이다. 개발 환경 요소들이 설치된 모습을 이미지로 저장하며 저장한 이미지를 클라우드에 올린다. 이미지들이 서로 연결 되어 동작하는 설정을 Dockerfile 문서로 저장하며 새 컴퓨터에서 복사한 문서의 내용대로 이미지를 다운받아 설치 한다.

  • 가상머신과 비슷하다고 볼 수 있지만 Docker가 훨씬 빠르고 자원을 효율적으로 사용한다. (Docker는 불필요한 운영체제 추가 설치가 필요 없다.)
  • 또한 Dockerhub에서는 npm 다운로드와 비슷하게 다른 사람들이 올려 놓은 이미지를 다운 받을 수 있다.
  • 한 컴퓨터에서 다른 환경의 여러 서비스 실행 시, 컨테이너로 분리되어 있기 때문에 서로 독립되어 실행 된다.

🚨 💻Docker를 사용해야 하는 이유

  • 팀원 및 서버와 개발 환경을 쉽게 동기화 할 수 있다. => 도커 이미지에 언어나 프레임워크 버전을 미리 모두 정해놓을 수 있고 해당 이미지를 컨테이너화 시키면 그 컨테이너는 로컬 환경의 간섭 없이 독립적으로 구동 가능

Docker 명령어

# 가상 컴퓨터 만드는 방법

# 1. 운영체제 설치(node 14버전과 npm과 yarn이 모두 설치되어있는 리눅스)
FROM node:14

# 2. 내 컴퓨터에 있는 폴더나 파일을 도커 컴퓨터 안으로 복사하기
COPY ./파일명 /파일명

# 3. 도커안에서 파일 실행시키기
CMD node 파일명
  • docker build . : 빌드가 완료 되면 이미지가 생성된 것이고 docker images 명령어로 확인 가능하다. ➡️ 이렇게 한 번 이미지를 만들어놓으면, 언제 어디서든 똑같은 환경의 가상 컴퓨터를 만들 수 있다.
  • docker run 이미지 ID : 이렇게 이미지를 실행 시키면 가상 컴퓨터 하나가 만들어진다. 이 때, 도커로 만들어진 가상의 컴퓨터를 우리는 컨테이너라고 부른다.

    RUN vs CMD
    RUN ~ : run 명령어 까지 실행 시킨 후 최종 이미지로 저장 (여러번 실행 가능)
    CMD ~ : CMD 명령어는 빠지고 그 윗줄 까지만 이미지로 저장 --> CMD는 이미지로 저장된 컴퓨터를 실행시킬 때 사용 (파일에서 한 번만 실행 가능)


🚨 Docker는 변경 사항으로 재실행시 cache가 한 번 깨지기 시작하면 그 후로는 모든걸 다시 새로 설치하기 시작한다. ➡️ 소스코드 변경 하고 다시 시작할 때마다 yarn install (비효율적)
이를 방지하기 위해 코드를 아래와 같이 수정하여 실행한다.

# 1. 운영체제 및 컴퓨터 설치 ( 리눅스, node, npm, yarn 까지 모두 깔려있는 컴퓨터 다운로드)
FROM node:14

#2. 내 컴퓨터에 있는 폴더나 파일을 도커 컴퓨터 안으로 복사
COPY ./package.json /폴더명/
COPY ./yarn.lock /폴더명/
WORKDIR /폴더명/
RUN yarn install

COPY  . /폴더명/

#3. 도커안에서 파일 실행
CMD yarn start:dev

포트포워딩

하지만 이렇게 파일을 실행하고 postman을 통해 docker로 띄운 서버의 api가 잘 작동하는지 확인해보면 동작하지 않는다. 지금까지는 yarn start:dev 명령어로 express 서버를 3000번 포트에서 실행시키고 localhost:3000에 접속하면 문제가 없었지만
Docker 환경에서는 내 컴퓨터 안에 Docker라는 프로그램이 있고 그 안에서 express 서버가 실행중이므로 가상 컴퓨터 안에서는 3000번 포트로 잘 접속 되지만 내 컴퓨터의 3000번 포트에는 아무것도 존재하지 않게 된다. 따라서 가상 컴퓨터의 3000번 포트와 내 컴퓨터의 포트를 연결 시켜줘야 한다.

  • docker run -p 8000:3000 이미지 ID : 내 컴퓨터의 8000번 포트와 Docker 컴퓨터의 3000번 포트 연결
    ➡️ 이후 postman을 사용해 https://localhost:8000/로 접속해보면 잘 띄워져 있는걸 확인할 수 있다.

  • docker ps : 실행중인 docker 프로그램 확인 가능
  • docker ps -a : 종료된 docker 프로그램까지 확인 가능
  • docker rm 컨테이너 ID : 컨테이너 삭제
  • docker rm docker ps -a -q : 컨테이너 전체 삭제 ( 백틱으로 감싸준 부분부터 먼저 처리 )
  • docker rmi 이미지 ID : 이미지 삭제
  • docker rmi docker images -q : 이미지 전체 삭제 (백틱으로 감싸준 부분부터 먼저 처리 )
profile
Back-end Developer

0개의 댓글