도와줘요 문어맨!! docker-compose

양진영·2022년 1월 19일
0

docker-compose란 무엇일까?

docker-compose는 도커를 통해 생성된 여러개의 컨테이너를 연결하여 효율적으로 운영한다. 만약 이 글을 읽는 사람중 정의만 듣고 한번에 이해가 간다면 당신은 이미 IT 고수일 것이고 나의 글이 귀엽게만 보이겠지만 그래도 나와 비슷한 이들을 위해 docker compose의 정의를 쉽고 이해가 갈만한 예시를 들어 풀어 보도록 하겠다.

docker compose는 중앙난방 이라고 보면 편할것이다. 자취를 한번이라도 해본사람이면 보통 자취방은 자취방 주인이나 총무가 난방을 한곳에서 컨트롤 할것이다. 보통 방은 적게는 10개에서 많게는 30곳 이상있는데 주인이 일일히 각 방을 돌며 "난방은 23도로 맞춰주세요!" 라고 말하고 다닌다면, 그렇게 돌기만 해서 하루가 갈것이다. 하지만 중앙에서 한번에 23도로 온도를 세팅 한다면? 그냥 그것으로 모든 결과를 동일하게 맞출수 있을것이다. docker compose도 이것과 다를것이다. 아니, 오히려 더좋을수도 있다. docker compose는 모든 컨테이너에 대해 동일한 명령을 내릴수 있지만 개별적으로 제어 하는것도 가능하다. 따라서 정의에 대한 정리를 조금 해보자면 docker compose는 여러가지의 컨테이너를 한번에 컨트롤할수도 개별적으로 컨트롤 할 수도 있어 효과적인 운영이 가능하다고 보면된다.

docker compose와 yaml

docker compose가 우리의 명령어를 이해하려면 yaml파일 만들고 그 파일에서 yaml 형식으로 파일을 작성한다. 작성이 완료 되었다면, 해당 yaml파일이 존재하는 경로의 터미널에서 docker compose build 라는 명령어 하나면 yaml에 작성한대로 컨테이너들이 실행되기 시작할것이다.

우선 컨테이너를 만들기 위해 컨테이너 이미지들을 이루고 있는 Dockerfile을 작성해야 한다. 연습을 위해 두가지 컨테이너를 생성해보는 것부터 시작해 보겠다.

우선은 node.js이미지를 build하기 위한 Dockerfile을 만들어 보겠다.

위 사진을 조금 설명 해보자면
FROM node:16 ==> node.js 버전 16을 FROM명령어로 설정하겠다
WORKDIR /myfolder/ ==> 기본적으로 내가 작업하는 디렉토리는 myfolder로 하겠다
COPY ./package.json /myfoler/ ==> package.json의 내용을 myfolder안에 임시 저장해두겟다 (부연설명을 조금하자면 package.json의 정보를 임시저장 해둠으로서 yarn install이 매번 이미지를 build할때 node_module을 만들지 않을것이다. package.json에 내용이 수정됫을때만 package.json이 다시 install 될것이다.

COPY ./yarn.lock /myfolder/ ==> yarn.lock정보를 myfolder에 임시 저장해둘것이다.
(여기도 부연설명을 하자면, package.json에 있는 패키지 뿐만 아니라 그 패키지를 이루고 있는 dependancies의 버젼을 그대로 가져오겠다는 뜻이다. ==> 버전이 달라져 오류나는 것을 방지하고자 하는것임)

RUN yarn install 필요한 모듈을 install하는것

COPY . /myfolder/ => 모든 내용을 myfolder 라는 디렉토리에 넣자 (패키지를 새로 받지않고 그냥 소스코드만 달라진다면 그 소스코드 내용만 copy해올 것이다.)


이제 노드를 만드는 dockerfile을 만들었으니 mongodb를 만드는 dockerfile.mongo를 만들자.

node 때와는 달리 너무 심플한거 아니야...? 라고 생각할수있다. 왜냐면 나도 그랬으니.. 하지만 docker-compose는 컨테이너마다 개별 설정이 가능하다 하였다. mongodb는 dockerfile에서 설정한다기 보다 docker-compose에서 설정하는것이 옳은듯하다.

version: 3.3은 누가봐도 docker-compose 버전 3.3인걸 아니까 넘어가겠다.

services: =>

docker-compose가 연결할 컨테이너들을 정의하는 부분이다. myfolder를 build할때 . 으로 그안에 있는 모든것을 빌드할것이고 이 컨테이너를 정의하는 도커 이미지는 Dockerfile이 될것이다. 그리고 port는 외부에서 1000으로 접근시 3000번으로 안내하겠다 라는뜻

마찬가지로 my_database라는 컨테이너를 만들것이고 context는 Dockerfile.mongo에 담긴것들 전부 가져올것이고 포트는 외부 1001번으로 접근시 27017(몽고db 디폴트 폴더이다.)로 연결하겠다 라고 정의한것이다

쉽게 설명한다고 설명했는데 잘 이해가 갔는지 모르겠다. 지금까지 읽어주셔서 감사하다

profile
왜? 라는 질문을 중요시하는 서버 개발자입니다

0개의 댓글