프로젝트 배포하기 using Docker

강두연·2020년 12월 10일
3
post-thumbnail

Docker 란?

컨테이너 가상화 시스템이다.

컨테이너 (Container)
운영 체제 가상화의 한 형태다. 작은 마이크로 서비스나 소프트웨어 프로세스에서 더 큰 애플리케이션에 이르기까지 모든 것을 실행하는 데 단일 컨테이너가 사용될 수 있다.

컨테이너는 호스트 OS 커널과 바이너리와 라이브러리도 공유한다.
컨테이너는 크기가 메가바이트에 불과하고 부팅하는 데 몇 초밖에 걸리지 않는다.

컨테이너와 VM의 주요 차이점은 VM에서 물리적 하드웨어를 가상화하는 데 하이퍼바이저가 사용된다는 점이다. 각 VM에는 OS가 실행하는 데 필요한 하드웨어의 가상 복사본인 게스트 OS가 포함되어 있으며, 컨테이너에서는 운영 체제를 가상화하여 각 컨테이너에는 애플리케이션과 해당 라이브러리만 포함되도록 한다.

또한, 부팅 속도에서도 큰 차이가 있다.

하이퍼바이저 (Hypervisor)

  • 호스트 컴퓨터에서 다수의 운영 체제(operating system)를 동시에 실행하기 위한 논리적 플랫폼(platform)을 말한다.
    가상화 머신 모니터 또는 가상화 머신 매니저(영어: virtual machine monitor 또는 virtual machine manager, 줄여서 VMM)라고도 부른다.

음... 그렇다고 한다..

사실 정확하게 전부 이해하지는 못했지만 그래도 내가 이해한 느낌에 대해서 공유하기 위해 작성하고있다.

내가 이해한 도커의 구조를 설명하자면 이러하다.
우리의 컴퓨터에 cd를 여러개 넣어서 동시에 여러개를 돌릴 수 있다고 가정하면
각 cd(이미지)는 우리가 배포하고 싶은 프로젝트를 담고 있고, cd를 cd-rom에 넣고 돌리면 그 돌아가는 상황 자체가 컨테이너 인것이다.

그리고 해보면서 느낀 것이 git과 굉장히 유사한 구조라는 것이다.
(잘 몰라서 그럴지도)

실습해보기

현재 내가 도커를 활용해 AWS EC2서버에 배포하는 과정은 이러하다.

1. 프로젝트 레파지토리에서 Dockerfile 생성

2. Dockerfile 내용을 알맞게 수정

3.이미지 빌드하기

명령어
$ docker build -t [도커유저네임]/이미지이름:[tag] .
예시
$ docker build -t username/myproject:0.1 .

주의! 저 마지막에 . 은 Dockerfile 이 있는 위치를 표시한 것[필수]

명령어를 제대로 입력했다면 아래와 같이 진행이 될 것이다.
생각보다 시간이 좀 걸린다.

빌드가 제대로 되었는지 알아보기 위해서 빌드된 이미지들을 확인해보자

이미지 확인
$ docker images -a

이런 식으로 나온다면 일단 빌드에는 성공한 것이다.

4. 로컬환경에서 실행시켜 보기

아래 명령어를 입력하면 컨테이너가 생성되면서 실행이 된다.

명령어
$ docker run -d -p [로컬포트]:[도커포트] [빌드한 이미지 이름]

예시
$ docker run -d -p 8000:8000 username/projectname:0.1

컨테이너 이름을 정하고 싶다면
$ docker run --name [컨테이너 이름] -d -p [로컬포트]:[도커포트] [빌드한 이미지 이름]

명령어를 입력하면 해쉬값을 보여주고 이제 컨테이너가 잘 실행이 되고있는지 확인하면 된다.

실행중인 컨테이너 확인하기
$ docker ps

모든 컨테이너 확인하기
$ docker ps -a


컨테이너에 대한 정보가 나오고 STATUS가 시간과 관련된 내용이라면 성공적으로 실행이 되고 있다는 것이다. 만약 문제가 있다면
'Exited' 등 부정적인(?) 단어들이 나온다.

이런 경우에는 이미지 빌드가 잘못된 경우가 대부분이며 문제를 해결한 후 다시 이미지를 빌드해서 실행해야한다.

5. 도커 푸쉬

이제 우리는 AWS EC2 환경에서 도커를 사용하기 위해 GitHub과 비슷한 개념으로 해당 이미지를 푸쉬를해서 나의 도커허브 레파지토리에 업로드 해야한다. 명령어는 아래와 같다.

도커허브에 로그인
$ docker login

도커허브에 업로드하기
$ docker push [이미지 이름]

성공한다면 해쉬값을 보여준다.

6. AWS EC2 인스턴스에서 이미지 받아오고 실행하기

혹시 AWS EC2 인스턴스에 Docker를 설치 하지 않았다면 해당 명령어를 한줄한줄 순서대로 입력하면 된다. (우분투 기준)

$ sudo apt update
$ sudo apt install apt-transport-https ca-certificates curl software-properties-common
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu bionic stable"
$ sudo apt update
$ apt-cache policy docker-ce


$ sudo apt install docker-ce

성공적으로 Docker를 설치했다면, 아까 업로드한 이미지를 EC2 환경에서 사용하기 위해 pull을 해야한다.

로그인
$ sudo docker login

도커허브에서 이미지 가져오기
$ sudo docker pull [이미지 이름]

해당 이미지를 확인하고 실행하기 위해 앞선 과정에서 적은 명령어들을 입력하면 된다. 다만, 우분투 환경에서는 명령어 앞에 sudo를 붙여야 실행이 된다는 것을 주의하기 바란다.

$ sudo docker run -d -p [PORT]:[PORT] [이미지 이름]


위 이미지 같은 경우 본인은 팀 프로젝트 진행중이라 팀원의 PR이 merge됐다고 하여 새로운 컨테이너를 실행시키는 거라 실행중이던 컨테이너를 종료한 뒤 실행하였다.

이제 정상적으로 실행이 되는 것 가지 확인했으니, 실제로 요청을 보내고 응답을 받아보자

해당 엔드포인트는 같이 프로젝트 진행중인 분이 구현해주신 엔드포인트 이다.
이로써, 도커를 사용하여 프로젝트 배포하는 과정이 마무리 되었다.

마무리하며

사실 오늘 도커세션을 듣고, 내 프로젝트에 바로 적용해보려고 했을 때 컨테이너가 실행이 되지않는 오류를 경험하였다...
살짝 겁이 나기도했지만 처음에 미리 산전수전 겪어보는것이 나에게 있어서 큰 재산이 된다는 것을 알고있다.

Docker에 관해 정확하고 깊은지식은 아직 없지만, 이렇게 부딪혀보고 하다보면 언젠가는 익숙해질 것이라 믿는다.

도커를 사용하는 가장 큰 이유중에 하나가 CI/CD에 있어서 유리하다는 것으로 아는데 얼른 익숙해져서 '이래서 유용하구나!' 라고 몸소 느끼고 싶다.

profile
Work hard, Play hard

1개의 댓글

comment-user-thumbnail
2021년 1월 20일

Docker docker .... 🐳

답글 달기