해당 게시물은 앞에서 작성한 Pennyway CI/CD 파이프라인 설계 (1) - Github Actions + AWS Amplify에 연속되는 글이다. 이번 게시물에서는 도커에 대해 알아보자.
Pennyway 프로젝트를 진행하면서 CI/CD 파이프라인을 구축하는 과정에서 서버 개발자분들의 도움을 받아가며 구축하는 과정에서, 도커에 대해 알게 되었다. 근데 도커가 무엇인지, 어떤 역할을 하는 것인지 그리고 도커를 사용하였을 때와 사용하지 않았을 때의 장단점은 무엇인지..? 등 아는 것이 없이 단순 적용만 한다는 느낌이 들어 도커에 대한 이해를 하고자 이렇게 블로그에 글을 작성하게 되었다.
도커에 대해 알아보기 이전에, 이 귀여운 고래 녀석이 얼마나 인기가 많은지 그리고 얼마나 많은 개발자들이 사용하고 있는지에 대해 확인해보자.
위 survey는 stackoverflow 2023 survey - section-most-popular-technologies-other-tools 개발자들 사이에서 가장 많이 사용되는 기타 도구 중 1위를 차지하였다. 작년까지만 해도 2위였던 도커가 1위로 등극한 것을 보아 인기가 어마어마 한 것 같다. 인기있고, 많은 사람들이 사용하는 데에는 이유가 있겠지?
기술에 대한 Overview를 알아볼 때에는 공식 문서만큼 좋은게 없다고 생각한다. 그렇기 때문에 공식 문서를 먼저 확인해보자! 자 그럼 Docker 🚀
Docker Docs를 확인해보면 도커에 대해 다음과 같이 설명하고 있다.
Docker is an open platform for developing, shipping, and running applications. Docker enables you to separate your applications from your infrastructure so you can deliver software quickly. With Docker, you can manage your infrastructure in the same ways you manage your applications. By taking advantage of Docker's methodologies for shipping, testing, and deploying code, you can significantly reduce the delay between writing code and running it in production.
사실 첫 문단을 읽었을 때 도커에 익숙한 사람이라면 이해가 되겠지만, 적어도 나는 이 한문단을 가지고서 도커가 무엇인지 크게 와닿지 않는 것 같다. 그리고 이를 가지고 다시 누군가에게 설명해보라고 한다면 설명할 자신도 없을 것 같다. 그러니 한 문장씩 쪼개서 분석해보자.
Docker is an open platform for developing, shipping, and running applications.
도커는 애플리케이션을 개발, 제공 및 실행하기 위한 개방형 플랫폼입니다.
사실 나는 첫 문장부터 제대로 이해가 되지 않는다. 이 개방형 플랫폼이라는 단어가 주는 의미를 명쾌하게 이해하지 못하고 있기 때문인 것 같다. 우선 플랫폼이 무엇인지에 대해 알아보자.
플랫폼은 구획된 땅이라는 'Plat'과 형태라는 뜻의 'Form'을 합성한 말로, 경계가 없던 땅이 구획되면서 용도에 따라 다양한 형태로 활용될 수 있는 공간을 상징한다.
대국민 서비스 네이버를 예로 들어보겠습니다. 네이버는 처음에는 포털 사이트로 시작하여 한국의 인터넷 사용자들에게 다양한 정보를 제공하는 역할을 했습니다. 그러나 시간이 흐름에 따라 네이버는 그 플랫폼을 더욱 확장하고 다양한 형태로 발전시켰습니다. 이제 네이버는 웹 검색 엔진뿐만 아니라 뉴스, 영화, 음악, 쇼핑, 블로그, 카페, 지식인, 지도, 비디오 등 다양한 서비스를 통합한 종합 플랫폼으로 발전하였습니다.
즉 지식을 공유하는 사용자와 지식을 탐구하는 사용자를 만나게 했던 네이버가 별도의 마케팅 없이 비즈니스 모델을 만들어서 수익을 창출할 수 있는 공간으로 탈바꿈하게 된 것입니다. (물론 어느정도 마케팅이 있었긴 하겠지만, 마케팅 없이 노출로 인한 수익도 있으니..)
따라서 플랫폼은 공급자와 수요자가 직접 참여해서 각자 얻고자 하는 가치를 거래할 수 있도록 만들어진 환경으로 정의할 수 있습니다.
그렇다면 도커 플랫폼을 이렇게 나타낼 수도 있을 것 같다.
도커는 BangDori가 제작한 애플리케이션을 업로드하고, 해당 애플리케이션을 필요로하는 다른 개발자들은 도커에서 이를 제공받아서 실행할 수 있다.
그럼 앞에서 말했던 플랫폼에 대한 정의에서 나온 용어들과 함께 위 구조를 살펴보자.
와 대박 이래서 도커를 플랫폼이라고 하는구나!
🤚 선생님 도커는 개방형 플랫폼이라고 하는데, 개방형이 뭐에요?
아 ㅋㅋ 내가 올린 애플리케이션을 다른 사람들이 사용할 수 있으면 개방형인거고, 아니면 폐쇄형인거겠죠~~
그럼 다음 문장으로 이동!
Docker enables you to separate your applications from your infrastructure so you can deliver software quickly.
도커를 사용하면 애플리케이션을 환경에서 분리하여 소프트웨어를 신속하게 제공할 수 있습니다.
해당 게시물은 경험이 그렇게 많지 않는 내가 예시와 함께 설명을 하게 되면 왜곡된 정보를 제공할 수 있을 것이라 판단하여, 44bits에서 작성한 게시물인 왜 굳이 도커(컨테이너)를 써야 하나요?를 첨부하겠습니다. 해당 게시물은 위 게시물을 읽어보는 것이 이해하는 데 큰 도움이 될 것 같습니다!
위 내용을 요약해보자면, 컨테이너는 애플리케이션을 환경에 구애 받지 않고 실행하는 기술입니다. 깃랩이라는 도구를 우분투에 설치하려면 깃랩 공식 문서에서는 다음과 같이 안내하고 있습니다.
$ sudo apt-get update
$ sudo apt-get install -y curl openssh-server ca-certificates
$ sudo apt-get install -y postfix
$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.deb.sh | sudo bash
$ sudo EXTERNAL_URL="http://gitlab.example.com" apt-get install gitlab-ee
하지만 CentOS를 사용한다면? 명령어가 조금 달라지게 됩니다.
$ sudo yum install -y curl policycoreutils-python openssh-server
$ sudo systemctl enable sshd
$ sudo systemctl start sshd
$ sudo firewall-cmd --permanent --add-service=http
$ sudo systemctl reload firewalld
$ sudo yum install postfix
$ sudo systemctl enable postfix
$ sudo systemctl start postfix
$ curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ee/script.rpm.sh | sudo bash
$ sudo EXTERNAL_URL="http://gitlab.example.com" yum install -y gitlab-ee
즉 환경에 따라 다른 명령어를 입력해주어야합니다. 매번 환경이 동일하다면 큰 문제가 되지 않겠으나, 환경이 달라지게 된다면 실행 과정을 찾아보아야 하는 불편함을 겪게 됩니다.
하지만 컨테이너 도구인 도커가 설치되어 있다면 환경에 구애받지 않고 다음 명령어를 사용하여 깃랩을 실행할 수 있습니다.
$ docker run --detach \
--hostname gitlab.example.com \
--publish 443:443 --publish 80:80 --publish 22:22 \
--name gitlab \
--restart always \
--volume /srv/gitlab/config:/etc/gitlab \
--volume /srv/gitlab/logs:/var/log/gitlab \
--volume /srv/gitlab/data:/var/opt/gitlab \
gitlab/gitlab-ce:latest
이렇듯 도커는 Ubuntu, CentOS 환경뿐만 아니라 Window 등 다양한 환경에서 분리하여 소프트웨어를 신속하게 제공할 수 있습니다.
With Docker, you can manage your infrastructure in the same ways you manage your applications.
도커를 사용하면 애플리케이션을 관리하는 것과 동일한 방식으로 환경을 관리할 수 있습니다.
우리가 애플리케이션을 구축하면, 해당 애플리케이션이 구축된 환경을 사용한다. 예를 들어 NodeJS 18.x.x 버전을 이용하여 프로젝트를 구축하였다면 NodeJS 18.x.x 버전에 대한 환경 설정을 한 이후 가동될 것이고... 사실 이건 그림으로 보는게 더 편한 것으니 그림으로 이해해보자!
Node, Python, C 개발자가 있다고 가정해보자. 각 개발자가 자신이 만든 애플리케이션을 배포한다고 하면, 이 애플리케이션을 제공받아서 실행하는 개발자는 각 애플리케이션에 맞는 환경을 설정해주어야 할 것이다.
현재는 Node, Python, C 밖에 없지만 Java, C++을 넘어 수 많은 언어와 프레임워크로 구축된 애플리케이션을 실행할 때 모든 환경에 대한 설정을 해줘야하는 상황이 발생하게 된다..
하지만 도커에 자신이 구축한 애플리케이션을 배포하게 된다면, 어떻게 될까?
도커에 자신이 구축한 애플리케이션을 도커에 배포하게 되면, 도커 컨테이너에는 자신이 개발한 어플리케이션과 어플리케이션의 환경이 컨테이너에 구축되어 있기 때문에 다른 개발자들은 자신의 운영체제에 해당 애플리케이션에 맞는 환경 설정을 가질필요 없이 도커에 업로드된 애플리케이션을 실행할 수 있게 된다.
By taking advantage of Docker's methodologies for shipping, testing, and deploying code, you can significantly reduce the delay between writing code and running it in production.
코드 전달, 테스트 및 배포를 위한 Docker의 방법론을 활용하면 코드 작성과 프로덕션 환경 실행 사이의 지연 시간을 크게 줄일 수 있습니다.
앞서 도커에 대해서 설명했던 부분을 제대로 읽었다면, 해당 문장을 이해하는데에는 큰 무리가 없을 것이다!
도커를 실제 사용자의 환경과 격리된 도커 환경 자체에서 애플리케이션을 테스트하고 실행할 수 있기 때문에, 코드를 전달하고, 설치하고 테스트하고 배포하는 등의 지연 시간을 크게 줄일 수 있다는 의미이다.
우리는 해당 게시물을 통해 도커가 무엇인지에 대해 간략하게 알아보았다. 다시 위로 올라가서 도커의 Overview를 읽어보고, 자기 자신에게 스스로 설명하는 시간을 가져보자!
제가 공부하면서 작성한 게시글인 만큼 틀린 부분이 있을 수 있습니다. 만약 틀렸다거나 오해의 소지가 있는 부분이 있다면 주저없이 저에게 말씀해주세요!! 😀
참고