Docker

류연찬·2023년 5월 14일
0

GraphQL

목록 보기
5/17

데이터베이스 SQL vs NoSQL

  1. 브라우저에서 백엔드 서버API 요청을 보냅니다.
  2. 요청을 받은 백엔드가 DB로 데이터를 저장하거나, 가져오는 등의 행동을 하기 위해 ORM(Object-Relational Mapper)이나 ODM(Object-Document Mapper)을 사용합니다.
  3. ORM테이블로 이루어진 데이터베이스를 다룰 때 사용하는 SQL을 다른 언어에서 쉽게 사용하도록 해줍니다.
  4. ODM문서(document)collection으로 이루어진 NoSQL 데이터베이스를 다룰 수 있도록 해줍니다.

도커(Docker) 설치

Docker 공식 홈페이지 : https://www.docker.com/

Get Started를 누릅니다.

본인 컴퓨터 시스템에 맞는 파일을 다운로드한 후, 설치하고 재부팅합니다.



Docker 설치 확인

터미널에서 다음의 명령어를 입력해봅니다.

docker --version

💡 zsh: command not found: docker
위와 같은 에러가 뜬다면 따로 연결을 해줘야합니다.

nano ~/.zshrc 를 입력해주고, 하단에 alias docker="/Applications/Docker.app/Contents/Resources/bin/docker" 를 입력해줍니다.

그리고 Ctrl + X 를 누르고 Y 를 누른후 엔터를 치면 저장됩니다.

저장한 환경변수를 적용하기 위해 터미널에 source ~/.zshrc 를 쳐주고 다시 docker --version 을 입력해 버전을 확인합니다.

잘 설치가 되었다면 docker 프로그램을 실행시켜보세요.



Docker를 사용하는 이유

서버를 돌리기 위해서는 먼저 환경이 갖춰줘야 합니다.

새로 컴퓨터를 샀다거나 또는 새로 직원이 들어왔다고 생각해봅시다.

그럼 컴퓨터에 우리가 개발한 환경과 똑같이 만들어야 합니다.

이를 위해 Node.js와 같은 언어 그리고 언어의 버전, 데이터베이스, 수많은 node_modules를 버전을 맞춰서 설치해줘야 합니다.

그래서 예전 회사에서는 환경을 구축하는 과정을 하나씩 캡쳐하고, 기록해서 방법을 정리해두기도 합니다.

가이드 문서가 있다고 한글 매번 이렇게 구축하는 것은 매우 번거로운 일입니다.

이를 간편하게 도와주는 것이 도커(Docker) 입니다.

Docker란?

도커는 개발 환경 요소들이 설치된 모습을 이미지로 저장합니다.

저장한 이미지를 클라우드에 올립니다.

이미지들이 서로 연결되서 동작하는 설정을 문서(Dockerfile)로 저장합니다.

새 컴퓨터에 가서 복사한 문서의 내용대로 이미지를 다운받아 설치합니다.

가상 머신이란 비슷하다고 볼 수 있습니다.

하지만 가상머신보다 훨씬 빠르고, 자원을 효율적으로 사용합니다.

왼쪽이 가상머신, 오른쪽이 오커입니다.

도커에는 불필요한 추가적인 운영체제가 필요 없습니다.

출처 : https://medium.com/@darkrasid/docker%EC%99%80-vm-d95d60e56fdd

도커 허브에는 npm 다운 받는 것처럼 다른 사람들이 올려놓은 이미지를 다운로드 할 수도 있습니다.

또한, 한 컴퓨터에서 다른 환경의 여러 서비스를 실행해야 하는 경우, 컨테이너로 분리되어있기 때문에 서로 독립되어 실행될 수 있습니다.

이것들을 모두 간단한 명령어로 실행할 수 있습니다.

Dockerfile

컨테이너를 실행하기 전에 먼저 해줘야할 것은 이미지를 만드는 것입니다.

Dockerfile 이라는 이름의 파일을 만들고 이미지를 만들기 위한 명령어를 입력합니다.

그리고 docker build 명령어를 통해 이미지를 만들게 됩니다.

Docerfile 작성

07-01-docker 폴더를 만들어주세요.

폴더 안에 Dockerfile 파일을 만들고 안에 코드를 작성합니다.

FROM node:16

WORKDIR /graphql/
COPY . /graphql/

CMD node index.js

FROM 리눅스:최신버전 이런식으로 쓰면, 리눅스의 최신 버전이 깔린 컴퓨터 한대가 만들어집니다.

그런데 우리는 컴퓨터에 node, npm, yarn도 깔아야합니다.

도커에는 다른 사람들이 만들어놓은 여러 이미지가 있는데 우리가 필요한 것들이 이미 깔려있는 이미지도 있습니다.

FROM node:16 을 하면 node, npm, yarn이 모두 깔린 리눅스 컴퓨터가 하나 생기게 됩니다.

index.js 파일을 만들고 안에 콘솔 로그를 작성해주세요.

console.log('안녕하세요! 도커안에서 index.js 파일을 실행했습니다!');

방금 만든 파일을 도커 안에서 실행시켜보겠습니다.

다시 Dockerfile 로 돌아와보겠습니다.

WORKDIR /graphql/ 는 앞으로 실행할 명령어들이 작동할 폴더를 지정해줍니다.

COPY . /graphql/ 는 현재 로컬 폴더에 있는 소스들을 모두 graphql 폴더로 복붙하겠다는 의미입니다.

CMD node index.js 를 통해 복사해서 넣은 파일을 실행시켜줍니다.

docker build

이제 도커 파일을 빌드해줘야합니다.

터미널에서 07-01-docker 폴더로 이동해 docker build . 명령어를 입력해줍니다.

💡아래와 같은 에러가 나온다면 설치한 Docker 프로그램이 켜져있는지 확인해보세요!

Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

빌드가 완료되면 이미지가 생성된 것이고, 이는 docker images 명령어로 확인해볼 수 있습니다.

이렇게 한번 이미지를 만들어놓으면, 언제 어디서든 똑같은 환경의 가상 컴퓨터를 만들 수 있게 됩니다.

docker run

이제 이 이미지를 실행해보겠습니다.

docker run 이미지ID 명령어를 입력해주세요.

이미지ID는 docker images 명령어를 통해 확인할 수 있습니다.



dockerignore

06-03-rest-api-with-sms-email 폴더를 복사하여 사본을 만들고 07-02-docker-with-dockerignore 로 이름을 변경합니다.

폴더 안에 dockerfile 을 생성합니다.

FROM node:16

WORKDIR /graphql/
COPY . /graphql/

CMD node index.js

FROM node:16 : node가 깔려있는 리눅스 컴퓨터를 한대 만들어줍니다.
WORKDIR /graphql/ : 명령어를 입력할 위치를 정해줍니다.
COPY . /graphql/ : 모든 소스코드를 복사해 도커 컴퓨터에 넣어줍니다.
CMD node index.js : 서버를 실행시켜줍니다.

🚨 하지만, 여기에 문제가 있습니다.

각자의 컴퓨터 환경에서 설치된 node_modules 폴더는 새로 만든 도커 컴퓨터와는 환경이 다르기때문에 사용하면 안되고, 사랑 컴퓨터에서 모듈을 따로 설치를 해줘야 합니다.

RUN yarn installdockerfile에 추가해줍니다.

FROM node:16

WORKDIR /graphql/
COPY . /graphql/

RUN yarn install
CMD node index.js

기존에 있는 node_modules 폴더까지 복사할 필요는 없겠죠.

그렇기 때문에 무시하라고 알려주는 설정을 해주겠습니다.

.dockerignore 파일을 새로 만들고 아래와 같이 적습니다.

node_modules/

이렇게 하면 도커해서는 node_modules/ 폴더를 무시해서, 복사가 되지 않습니다.

터미널에서 07-02-docker-with-dockerignore 폴더로 이동하여 도커를 빌드해줍니다.

docker build . 명령어를 입력합니다

이미지가 잘 만들어졌는지 확인해보겠습니다.

docker images 명령어를 입력해주세요.

잘 만들어진 것을 확인하고 방금전에 만들어진 이미지의 아이디를 복사하여 docker run 이미지ID 를 입력해 도커를 실행해주세요.

Docker 내부 접속

도커를 실행시켰으니 안으로 들어가보겠습니다.


현재 도커가 실행중인 터미널은 그대로 두고, 터미널을 분리해 새로운 터미널을 띄워줍니다.

새롭게 생긴 터미널에서 07-02-docker-with-dockerignore 폴더로 이동해줍니다.

docker ps 명령어를 입력해, 현재 프로세스를 확인해봅니다.

방금 실행한 도커(컨테이너) 한개가 실행중임을 확인할 수 있습니다.

STATUS를 보면 UP으로 되어있습니다.

이제 컨테이너 내부에 들어가보겠습니다.

docker exec -it 컨테이너ID /bin/bash 명령어를 입력하면 화면이 bash 쉘로 바뀝니다.

쉽게 얘기하면 도커에서 돌아가고 있는 가상 컴퓨터의 터미널로 들어온 것 입니다.

가상 컴퓨터의 터미널에 왔으니 우리의 소스코드가 잘 복사되어있는지 확인해보겠습니다.

ls 를 입력해주세요.

모든 코드파일이 잘 들어와있는 것을 확인할 수 있습니다.

이제 분리했던 터미널을 닫고, 도커로 띄운 서버의 API가 잘 작동하는 postman으로 확인해보겠습니다.

/boards/GET 요청을 해보겠습니다.

안됩니다...

여기에는 포트 문제가 있습니다.

여태까지 node index.js 로 3000번 포트에서 실행하고 localhost:3000 에 접속하면 되었지만 docker 환경에서는 내 컴퓨터 안에 도커라는 프로그램이 있고, 그 안에 node index.js 가 실행중입니다.

그니까 가상 컴퓨터 안에서는 3000번이 잘 접속되지만, 내 컴퓨터에서는 3000번에 아무것도 없습니다.

따라서, 가상 컴퓨터의 3000번과 내 컴퓨터의 포트를 연결해줘야합니다.

💡 이것을 포트 포워딩(Port-Forwaring) 이라고 부릅니다

실행되고 있는 컨테이너를 멈춰주겠습니다.

새로 터미널을 열고 07-02-docker-with-dockerignore 폴더로 이동합니다.

docker ps 명렁어를 입력해서 컨테이너 아이디를 복사한 후, docker stop 컨테이너ID 명령어를 실행해 중지시킵니다.

이제 도커를 다시 실행하는데, 내 컴퓨터의 1000번 포트도커 컴퓨터의 3000번 포트를 연결해주겠습니다.

docker run -p 1000:3000 이미지ID 명령어를 입력합니다.

그리고 다시 postman으로 요청을 보내서 확인해보겠습니다.

내 컴퓨터의 1000번 포트로 연결했기때문에, http://localhost:1000/boards 으로 ㅎGET 요청을 해야합니다.

정상적으로 응답을 받은 것을 확인할 수 있습니다.

이제 docker stop 컨테이너ID 명령어로 컨테이너를 종료해주세요.

Docker와 package.json

07-02-docker-with-dockerignore 폴더를 복사하여 사본을 만들고 07-03-docker-with-dockerignore-packagejson 으로 이름을 변경합니다.

기존 dockerfile 은 다음과 같습니다.

FROM node:16

WORKDIR /graphql/
COPY . /graphql/

RUN yarn install
CMD node index.js

만약에 index.js 파일의 코드를 일부 수정해서 다시 이미지를 굽고 싶다고 한다면 모든 코드를 다시 복사해 가상 컴퓨터에 붙여넣기 하고, COPY . /graphql/ , RUN yarn install 을 해서 노드 모듈도 다시 설치하게 됩니다.

index.js 파일만 수정하고 package.json 내용을 수정하지도 않았는데 다시 설치를 해야한다는게 매우 비효율적입니다.

docker는 dockerfile 을보면서 명령어를 한줄씩 실행하다가 기존 내용에서 변경되지 않았다면 그대로 쓰고, 아니라면 그 부분부터 새로 굽습니다.

모든 소스 코드를 카피하기 전에 먼저, package.json 을 복사하도록 적어줍니다.

  1. COPY ./package.json /graphql/
  2. 그리고 RUN yarn install 을 하고
  3. COPY . /graphql/ 명령어를 통해 나머지 파일을 복사해오고
  4. CMD node index.js 명령어로 node 서버를 실행해줍니다.
FROM node:16

WORKDIR /graphql/

COPY ./package.json /graphql/
RUN yarn install

COPY . /graphql/
CMD node index.js

이렇게 쓰면 package.json 이 수정되지 않았다면 yarn install 까지는 기존 것을 그대로 쓰고, 밑에 실제로 코드가 고쳐진 부분만 실행됩니다.

여기서 끝나면 안되고, yarn lock 파일도 같이 움직여야합니다.

이 파일도 복사해주는 코드를 추가해줍니다.

FROM node:16

WORKDIR /graphql/

COPY ./package.json /graphql/
COPY ./yarn.lock /graphql/ <-- 코드 추가
RUN yarn install

COPY . /graphql/
CMD node index.js

0개의 댓글