오늘은 컨테이너가 올라간 고래 이미지로 유명한 Docker 에 대해 배웠습니다. 더 잘 사용할 수 있으려면 앞으로도 꾸준한 공부가 필요하겠지만, 맛보기 만으로도 흥미를 느낄 수 있었습니다.
도커의 가장 큰 장점은 여러 환경에 따라 변경할 필요 없이 container
라고 하는 하나의 커다란 틀 안에 넣어 구동할 수 있다는 점이라고 합니다. 개발자 업계에서 유명한 "It works on my machine!" 이라는 말을 해결해냈다고 하는 짤도 찾아볼 수 있을 정도더라구요.
오늘날 대부분의 웹서비스는 자체적으로 서버를 구축하기보다는 클라우드 컴퓨팅 서비스를 제공하는 여러 머기업을 통해 이루어지고 있습니다. 어제까지 배웠던 AWS 처럼 말이죠.
만약 모든 기능이 이미 완벽하게 구현이 끝났고 더 이상의 수정도 추가도 불필요하다면야, 배포 과정에서의 약간의 어려움은 아무 것도 아닐 겁니다. 하지만 웹을 개발한다는건 꾸준히 새로운 기능을 도입하고 낡은 것을 쳐내는 과정을 거쳐야 하죠. 그리고 궁극적으로는 우리가 만든 서비스를 사용하는 유저들이 만족할만한 경험을 제공하는 것이 목표일 겁니다. 이를 위해서는 작성해둔 코드를 수정하고 다시 배포하는 과정을 계속 반복해야만 하죠.
물론 저는 아직까지는 서버와 클라이언트를 로컬 환경에서 연결하는 방식으로만 공부했었습니다. 이번주에 들어서야 실제로 배포하는 과정을 밟아나가게 되었죠. 아마도 배포 과정을 직접적으로 담당할 일이 많지는 않겠지만, 그렇다고 로컬 환경만 공부하는 것은 아무런 의미가 없을 겁니다. 사실 인터넷을 통해 많은 사람들에게 노출되지 않는 웹페이지라면 굳이 개발할 필요가 없겠죠. 내가 개발한 결과물이 많은 사람들의 선택과 사랑을 받아 사용되기를 기대하는건 아마 모든 개발자의 바람이 아닐까 싶어요.
그런 만큼 배포의 과정이 수월해진다고 하는 것은 특히 서버를 담당하는 개발자들에게는 정말 기쁜 일이 아닐 수 없을 겁니다. 도커를 만든 개발자들도 자신들의 서비스를 가리켜 이렇게 말하고 있습니다.
Docker simplifies and accelerates your workflow, while giving developers the freedom to innovate with their choice of tools, application stacks, and deployment environments for each project.
도커에서 사용하는 여러 용어들이 있어서 간략히 정리해보려고 합니다. 정확한 의미를 정리한다기보다는 제 나름대로 이해한 바를 풀어서 적으려고 합니다.
컨테이너(Linux Container) : 우리가 개발하는데 필요한 라이브러리, 애플리케이션 등을 모아서 독립된 하나의 서버처럼 구성하는데 쓰이는 리눅스 기반의 기술이라고 합니다. Docker 라는 프로그램 위에서 개별적인 여러 콘테이너로 나뉘어 동작하기 때문에, 별도의 OS 를 추가적으로 설치해 사용하는 가상 머신보다 더 가벼우면서도 좋은 성능을 낼 수 있다고 합니다. 프로그램이 실행된 것을 프로세스라고 할 때, 프로세스에 해당한다고 할 수 있을 것 같습니다.
이미지(images) : 프로그램이 실행된 것을 프로세스라고 할 때, 이미지는 프로그램에 가깝다고 할 수 있을 것 같습니다. 이미 만들어진 수많은 이미지 자료들이 있기도 하지만, 우리가 개발한 프로그램을 환경과 기타 라이브러리를 한 데 묶어 이미지로 만들 수 있다고 하는데요. 이렇게 만들어놓은 이미지는 Docker 만 있다면 언제든지 컨테이너로 구성해 동작시킬 수 있게 됩니다.
yaml : 확장자 yaml 은 데이터를 표현하는 언어 양식입니다. Docker 에서는
docker-compose
라는 명령어를 통해서 yaml 으로 표현된 소스 파일을 가지고 컨테이너를 손쉽게 구성할 수 있습니다.
commit :
docker container commit
명령어를 이용해 구동시킨 Docker 콘테이너를 이미지로 만들 수 있습니다. git 에서 변경사항을 커밋해 기록으로 남기는 것과 비슷하다고 생각할 수 있을 것 같습니다. 비슷한 용례로 Docker Hub 에 이미지나 레포지토리를 올릴때는docker push
명령어를, 반대로 Docker Hub 에서 가져올 때는docker pull
명령어를 사용합니다.
https://subicura.com/2017/01/19/docker-guide-for-beginners-1.html // 도커에 대해 잘 정리된 블로그 글(작성시점은 2017년이네요)
https://www.youtube.com/watch?v=chnCcGCTyBg // 도커를 소개하는 노마드코더님의 5분짜리 영상
https://www.youtube.com/watch?v=tPjpcsgxgWc // 도커를 소개하는 얄팍한 코딩사전님의 5분짜리 영상
(만약 Section3 HA 를 잘 통과한다면) 다음주부터는 프로젝트를 고민해야 할 단계에 접어들게 됩니다.
프로젝트를 시작하게 되면 일단 클라이언트는 클라이언트대로, 서버는 서버대로, 또 데이터베이스는 데이터베이스대로 아주 간단한 기본 구성을 갖춘 뒤 잘 배포되는지 여부부터 체크하고 진행하라는 조언을 들은 적이 있습니다.
일반적인 생각으로는 잘 만든 결과물을 가지고 배포를 한다고 생각하겠지만, 클라이언트는 hello world 부터 띄워보고, 서버는 get 요청에 응답하도록 만들고, 데이터베이스에는 기본 값 넣어서 불러올 수 있는지 확인부터 해두고 일을 진행하라는 것이죠. 그만큼 배포에서 알 수 없는 변수로 어려움을 겪는 경우가 많다고 합니다.
과연 어떤 결과물을 만들 수 있을 것인지...