컨테이너를 실은 고래 Docker!

양진영·2022년 1월 18일
0

도커(docker)란 무엇일까?

처음 개발 공부를 해야겠다고 마음 먹었을때, 지인으로 부터 들었던 이야기가 있다. "진영아 요즘은 도커 모르면 경쟁력이 없어, 그러니까 어렵더라도 아예 개발 환경을 도커로 세팅 하고 공부하는게 좋을거 같아" 물론 좋은 말씀이었다. 하지만, 당최 도커가 뭐고 왜 좋은거야?? 왜 이걸로 해야하지? 라는 의문을 갖게 되었고 검색해봐도 딱히 와닫는 말은 없었다. 처음 개발을 시작하는 나에게 도커를 설명하길 도커는 오픈소스 가상화 플랫폼 이고 효율적으로 서버를 활용하며 환경설정하는데 용이 하다라고 하는데 이게 뭔소리야,, 하곤했었다. 어느정도 공부를 하고나니 도커가 무엇이고 왜필요한지 알게되어 나와 비슷한 상황에 놓이거나 도커라는 말은 들어봤고 핫하다고 하니 배워보려 하는데 시작이 어려운 사람들에게 조금이라도 도움이 되길 바라며 도커 설명을 시작해보겠다.

위에 설명했듯이 도커는 오픈소스 가상화 플랫폼이다. 근데 이말은 너무 어려우니 이말을 조금 쉽게 풀어서 설명해보도록 하겠다. 우선 우리가 집중해야 단어는 가상화 플랫폼이다. 가상 즉 실제로 존재하지 않는 이라는 뜻이다. 실제로 존재하지 않는다는 말이 오해를 부르기 쉬우니 조금 부연 설명을 하자면 실제로 존재하는 서버에 설치된 운영체제 위에 도커가 동작할수 있는 환경인 도커엔진이 올라가고 그 위에 컨테이너 라고 불리는 실제 서버와 완전하게 독립된 또 다른 작은 컴퓨터 들이 생성된다고 생각하면 쉬울것이다. (실제로는 조금 어려운 설명이 될수 있지만 각 컨테이너들은 컴퓨터 라기보단 특정 software 동작시키기 위한 개발환경 또는 운영환경이다.)

이 사진이 위의 설명을 가장 잘 표현한 사진이라고 생각되어 가져왔다. infrastructure라고 쓰여있는 가장 하단 부분을 서버 라고 생각해주면 이해하기 쉬울것이다. 서버위에 운영체제가 있고 그리고 도커가 운영될수 있는 환경이 탑제 된다. 이후 그 위에는 컨테이너 라고 불리는 독립적인 컴퓨터들이 올라간다.

docker-hub

방금전까지 우리는 가상화 플랫폼에 집중했다면 이번엔 오픈소스 라는 단어에 집중해보겠다. 오픈소스란 쉽게말하면 모두가 사용할수있는 저장소 라고 생각하면 조금 쉬울것이다. 우리가 가장 흔하게 아는 오픈소스는 깃허브이다. 이처럼 도커허브도 저장소 개념으로 사용자가 컨테이너를 생성하고 도커허브에 올리면 언제든 필요할때 도커허브로 부터 본인이 만들어 두었던 컨테이너를 가져와서 사용할수 있다.

도커는 어떤문제를 해결해주고 왜좋을까?

도커는 환경이 다른 운영체제 에서도 충돌없이 동작할 수 있게해준다.

개발환경이 다른 가장 큰 예시를 들어보자면 윈도우 os 환경과 리눅스/유닉스 계열의 os 환경이다. 개발자가 윈도우에서 열심히 개발해서 서버에 배포했는데 환경이 달라 본인이 작업한 코드들이 실행되지 않는다면 정말 곤란한 상황일것이다. 하지만 도커는 가상화 플랫폼이다. 도커파일을 서버와 개발자의 환경이 같아지게 작업하고 도커파일을 만든다면(빌드), 필요한 환경이 생성될 것이다. 예를 들면 도커파일에 같은 버전의 node.js를 설치하고 같은 운영체제등 서버와 개발자 환경이 가상적으로 동기화 시켜 충돌을 막음 으로서 좀더 편하게 개발이나 운영이 가능한것이다. 이 문제를 environment disparity라고 하며 도커는 이 문제를 해결해준다.

컨테이너의 숫자를 늘리고 줄이는게 간단하여 리소스 할당이 유연하다.

컨테이너를 소개할때 실제 컨테이너가 운영되는 서버와 독립되어있다고 소개 했지만 사실 완전한 독립은 아니다, 왜냐하면 환경자체는 독립적이어도 환경이 동작되는 리소스는 실제 서버로 부터 할당받기 때문이다. 비록 리소스의 한계는 있지만 이 한계 내에선 유연한 컨테이너 리소스 할당이 가능하다. 예를 들면 어떤 개발자가 java를 이용한 컨테이너를 만들어서 배포했다. 평소라면 한개의 컨테이너로도 서비스를 감당할 수 있었지만 갑자기 이 서비스가 인기 서비스가 되어 이용자가 급격하게 늘어났다. 그런 상황에선 컨테이너를 두개, 세개로 늘려 급격한 트래픽 증가를 감당 하다가 인기가 줄어들어 몇개의 컨테이너가 필요없어지면 다시 한개로 줄일수도 있는것이다.

도커 설치 및 기본 세팅하기

도커 공식 홈페이지인 www.docker.com에서 자신의 운영체제에 맞는 버전으로 도커를 다운받은후 docker --version을 터미널에 입력하면 현제 자신이 다운받은 도커의 버전이 보인다. 만약 다운 받은후 version을 입력했는데 나오지 않는다면 설치상에 문제가 있을수 있으니 다시 설치해보자.

설치가 완료되었다면 Dockerfile을 만들어주자. 우선 폴더를 만들어 그안에 새파일로 Dockerfile을 만들어 준 후 기본세팅을 해보자.

FROM node:최신버전을 입력하면 node가 설치된 하나의 컴퓨터가 만들어진다. 이때 node에 필요한 기본 패키지들은 FROM으로 받을시 자동으로 받아진다(npm, yarn등)

그리고 WORKDIR /my_backend/ 의 의미는 WORKDIR즉 소스코드가 동작하는 디렉토리를 정하는 것이고 COPY ./my_backend/는 Dockerfile과 같은 위치에 있는 소스코드를 my_backend 디렉토리에 카피해와서 실행할 것이고 실행할때의 명령어는 CMD로 설정하는데 나의 개발환경은 node.js이므로 node 그리고 구동할 파일인 index.js 라고 보면 될것이다.

  • 출처(https://crispypotato.tistory.com/121): 좋은 예시라서 가져와봤는데 문제 되지않겠지...? 블로그 처음이라 잘모르는데 혹시 문제되면 수정하겠습니다 ㅠㅠㅠ

*RUN과 CMD의 차이는 RUN은 CMD로 이미지 포장전 실행하는거라 RUN은 여러번 사용가능
CMD로 이미지 포장을 해야할 부분에 RUN으로 하면 포장이 끝나질 않는다.

이렇게 Dockerfile을 입력했다면 이제 입력한 환경대로 만들어주면 된다(build) 해주면 된다. 이때 Dockerfile을 build할때 사용하는 명령어는 docker build . 이다. 이렇게 build하면 image가 만들어진다. image에 대해서 간략하게 설명하자면 image는 컨테이너를 구동시키이 위해 필요한 하나의 개발 모듈이라고 보면된다. 우리는 node.js로 구동되는 index.js를 image로 뜬것이고 컨테이너는 image들의 결합으로 만들어진다(현재는 index.js밖에 없으므로 image는 하나이다).

보다시피 docker images라는 명령어를 쳤을때 docker build . 으로 생성한 image가 보일것이고 image를 실행하기 위해 docker run 를 입력하면 해당 파일(index.js)가 실행되어 console.log로 찍어두었던 내용이 리턴되는것을 아래의 예시처럼 볼수있다.

이처럼 간단하게 docker image를 구동시켜 봤는데 혹시 docker를 build하여 만들어진 파일중 용량이 너무 크거나 보안상 도커에 올리지 말아야 할 image들은 .dockerignore파일에 넣어주어 도커허브에 올라가지 않도록 할수도있다.

-- docker exec -it /bin/bash 명령어를 입력해주면 container-id에 맞는 컨테이너가 실행된다.

포트포워딩

도커의 컨테이너는 독립적으로 운영된다. 따라서 내 컴퓨터의 포트를 찾으려 하면 도커의 컨테이너는 찾을수가 없다. 따라서 내 포트와 도커의 포트를 이어줘야 한다.

즉 이어질 포트인 입구 포트와 출구 포트를 지정해서 지정된 포트로 들어온 요청은 지정된 포트로 나가야된다.

-- docker ps 하여 동작중인 컨테이너를 확인하고 -- docker stop 로 멈춰준다.

이후 동작하고자 하는 이미지를 --docker images로 찾아 docker run 을 해주되 -- docker run -p 외부포트:내부포트 로 연결한다.

docker와 package.json

docker build를 할때 당연히 새로운 수정사항이 있다면 새롭게 build가 되야된다. 하지만 이미 있는 패키지까지 yarn install 하여 전부 다 다시 build하는건 너무 비효율적이다. 그럴때는 어떻게 해야할까?? 그럴때는 yarn install의 순서를 바꿔줄 필요가 있따.

현재는
COPY . /myfolder/
RUN yarn install 이지만 아래와 같이 한다면

COPY
./package.json /myfolder/

하지만 여기서 끝내면 안되고 COPY ./yarn.lock/myfolder도 해줘야 하는데 그 이유는 yarn.lock은 버전을 관리하여 동일하게 해주는데 이게 없으면 버전이 어긋날수도 있기때문이다.

요렇게 까지 해야 기본적인 도커세팅이 끝나게 된다!!

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

0개의 댓글