상세 컨텐츠

본문 제목

비전공자출신 개발자의 Docker 적응기

오왕성 인턴

by rowan256 2024. 4. 10. 01:39

본문

728x90

 안녕하세요, 오왕성(五王星) 인턴입니다. 🙂

 간단히 저의 이력을 설명하자면 저는 자산운용사에서 4년(마케팅, ELF, 퀀트운용, 주식운용, 인덱스펀드, ETF 운용)의 세월을 보내고 엄청난 대격변(?)으로 갑자기 IT회사에서 2년 조금 넘게 개발을 하고 있는 개발자입니다.(컴퓨터 전공도 아님)

블록체인에서 "컨트랙트" 개발을 하고 있는데 다행히도 제가 이 "컨트랙트" 개발을 시작할 때는 컴퓨터에 대한 배경지식이 약간은 모자라도 어느 정도는 참여가 가능한 분야였습니다. (컨트랙트로 금융서비스를 만드는데 금융적인 조언이나 설계로도 할 일이 많았거든요)

하지만 그래도 여기는 IT회사고 .. 개발팀이고... 다 같이 힘을 합쳐 프로젝트를 빌드하다 보니... ㅎㅎ 개발에 대해서 공부해야 할 것이 많더라구요! 오늘은 그중 너무나 오래 미루고 미뤄왔던 Docker에 대한 공부를 하고 기록을 남겨보려고 합니다.

 

컨트랙트 + 백엔드를 하면서 Docker에 대해서는 사실 귀에 딱지 앉도록 들어왔지만 저에겐 든든한 팀원들이 있었기 때문에 (ㅋㅋ) 제가 인프라에 깊게 관여하지 못해도 문제없이 2년 반을 버텨온 것 같습니다. 🙏 사실 혼자 알고리즘 트레이딩이나 전략 벡테스팅이나 하려고 파이썬 살짝 배워서 혼자만의 코드를 짜던 저는 Docker라는 게 뭔지 들었을 때 알아들을 수 있는 단어가 거의 없었습니다.

Docker의 Docs에서 Docker에 대한 설명을 보면 다음과 같이 적혀있습니다.

"Docker는 애플리케이션 developping, shipping, running을 위한 오픈 플랫폼이다."

 

"애플리케이션"이라는 단어도 명확히 정의할 줄 모르며 배포는 무엇인지, 서버는 무엇이고 클라이언트는 무엇인지 모르는 단어가 너무 많았던 제게 Docker의 docs를 읽어도, 동료들의 멋진 설명을 들어도 Docker라는 것을 왜 써야 하는지 새기는 일은 좀 어려웠던 것 같습니다. 물론 지금도 모르는 것이 너무나도 많지만 😂 그래도 우당탕탕 얼렁뚱땅 2년 반 동안 컨트랙트개발을 하며 주변 동료들에게 귓동냥으로 들으며 배운 서당개 2년 반 짬밥으로 다시 Docker Docs를 차근차근 읽어보고 튜토리얼을 진행해 보니 오오.. 확실히 예전보다는 더 이해가 되는 것 같아요 (?)

그럼 서론은 여기까지 하고 본격적으로 공부한 내용을 요약해보겠습니다. (대부분 Docs의 요약&번역입니다. ㅎㅎ)

 

Docker란?

docker는 docker는 앱 개발, shipping(build, test, release and deploy..), 실행하기 위한 오픈된 플랫폼입니다. 개발을 할 때 docker를 쓰지 않는 것과 쓰는 것에는 아래와 같은 차이가 있다고 할 수 있습니다.

(docker 안씀 👿) 코드를 짠다 -> 서버에 코드를 올린다. -> 코드를 실행한다.

(docker 씀 😇) 코드를 짠다 -> 코드를 image로 만들어 Hub에 올린다. (build & push) -> Hub로부터 이미지를 가져와서 이미지의 인스턴스인 container를 생성하고 실행한다. (pull & run)

 

뭔가 과정만 추가된 것 같지만 이렇게 이미지를 빌드하고 빌드한 이미지를 컨테이너에 올려 실행시키는 것에서 다음과 같은 장점이 생깁니다.

  1. 앱을 인프라로부터 분리하여 소프트웨어를 신속하게 제공할 수 있다.
  2. 앱 관리하는 것과 마찬가지로 인프라를 관리할 수 있다.
  3. 코드를 신속하게 shipping과 테스트, 배포할 수 있는 Docker의 methodology를 사용하면 코드작성과 프로덕션에서의 실행 사이의 간격을 크게 줄일 수 있다.

라는 장점이 있습니다. 한 프로젝트에서 여러 개의 앱을 만들어서 실행시키고, 손쉽게 껐다 켰다 하고, lifecyle을 관리하여 (봇이 죽으면 새로운 봇을 실행시킨다거나) 안정성을 높일 수도 있고 공통의 환경설정값을 적용시키는 것도 가능합니다. 또 여럿이 공동작업도 가능하고, 서버와 로컬 PC의 개발환경이 달라도 영향이 없습니다. 그래서 Docker를 사용하는 간단한 프로젝트에서는 아래와 같이 앱을 실행시킵니다.

  1. 개발자가 앱을 위한 소스코드를 작성합니다.
  2. 이후 docker run 실행했을 때 실행시킬 명령어들을 모아둔 dockerfile 을 생성합니다.
  3. 해당 소스코드를 빌드하여 이미지를 생성합니다. (docker build ...)
  4. 이미지를 레지스트리(도커 이미지를 저장시키는 원격 저장소. ex. Docker Hub)에 push 합니다. (docker push)
  5. 서버에서 원격으로부터 이 이미지를 가져와 컨테이너를 생성합니다. (docker pull ...)
  6. 컨테이너를 실행시킵니다. (dockerfile에 app을 실행하기 위한 명령어들이 있습니다.)

Docker Architecture

도커는 클라이언트-서버 아키텍처를 사용합니다. 도커 클라이언트는 도커 컨테이너를 빌드, 실행, 배포하는 무거운 작업을 수행하는 Docker daemon과 통신합니다. (💡 Daemon이란 사용자가 직접 제어하지 않고 백그라운드에서 돌며 작업하는 프로그램을 말함. 일반적으로 뒤에 d를 붙임.) Docker 클라이언트와 데몬은 동일한 시스템에서 실행할 수도 있고 Docker 클라이언트를 원격 Docker 데몬에 연결할 수도 있습니다. Docker client와 deamon은 REST API, UNIX소켓, 또는 네트워크 인터페이스를 통해 통신합니다. 다른 도커 클라이언트로는 컨테이너 집합으로 구성된 앱으로 작업할 수 있는 Docker Compose 가 있습니다.

In Docker docs, Docker의 아키텍처.

Docker daemon?

도커데몬(dockerd)은 도커 API 요청을 수신하여 이미지, 컨테이너, 네트워크, 볼륨과 같은 도커 객체를 관리합니다. 또한 다른 데몬과 통신하여 Docker 서비스를 관리할 수 있습니다.

 

Docker client?

도커 클라이언트(docker)는 많은 도커 사용자가 상호작용하는 수단입니다. docker run과 같은 명령을 사용하면 클라이언트는 이러한 명령을 dockerd로 전달하며 명령이 실행됩니다. docker명령은 Docker API를 사용합니다. 도커 클라이언트는 여러 데몬과 통신 가능합니다.

Docker desktop?

docker desktop이란 컨테이너화된 앱과 마이크로서비스를 빌드하고 공유할 수 있는 Mac, Windows, Linux 환경용 앱으로 설치가 간편합니다. dockerd, docker, docker compose, docker content 신뢰, Kubernetes, Credential 등이 포함되어 있습니다.

Docker registry?

도커 레지스트리는 도커이미지를 저장합니다. (ex. Docker Hub) 도커는 기본적으로 Docker Hub에서 이미지를 찾습니다. 자신만의 비공개 레지스트리를 실행할 수도 있습니다.

docker pull, docker run 등의 명령을 실행하면 docker는 구성된 레지스트리에서 필요한 이미지를 가져오고, docker push를 실행하면 이미지를 레지스트리로 푸시합니다.

💡 일반적인 의미의 Registry란? 시스템의 모든 설정값을 모아두는 저장소라고 할 수 있음. (key-value)

Docker Objects

도커를 사용하면 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체를 만들고 사용하게 됩니다.

image?

이미지도커 컨테이너를 만들기 위한 지침이 포함된 읽기 전용 템플릿입니다. Often, 이미지는 다른 이미지를 기반으로 하며 약간의 추가 사용자지정이 이루어집니다. 예를 들어 우분투 이미지를 기반으로 하지만 Apache 웹서버와 앱을 설치하고 애플리케이션을 실행하는 데 필요한 구성 세부정보를 포함하는 이미지를 빌드할 수 있습니다.

직접 이미지를 만들거나 타인이 레지스트리에 게시한 이미지만 사용할 수 있습니다. 자체적으로 이미지를 빌드하려면 이미지를 만들고 실행하는데 필요한 단계를 정의하는 간단한 구문을 사용하여 dockerfile을 만들어야 합니다.

💡 참고로, dockerfile의 각 명령어마다 이미지에 레이어를 만듧니다. dockerfile을 변경하고 이미지를 다시 빌드하면 변경된 레이어만 다시 빌드됨. 다른 가상화 기술과 비교할 때 이미지가 가볍고 작으며 빠른 이유 중 하나입니다.

container?

컨테이너실행 가능한 이미지의 인스턴스입니다. 컨테이너를 생성, 시작, 중지, 이동, 삭제할 수 있는 Docker API 또는 CLI를 사용할 수 있습니다. 컨테이너를 하나 이상의 네트워크에 연결하거나 스토리지를 연결하거나 헌재상태에 따라 새 이미지를 만들 수 있습니다.

기본적으로는, 컨테이너는 다른 컨테이너 및 호스트머신으로부터 비교적 잘 격리되어 있습니다. 컨테이너의 네트워크, 스토리지 또는 기타 기본 하위 시스템이 다른 컨테이너 또는 호스트머신으로부터 격리되는 정도를 제어할 수 있습니다.

컨테이너는 이미지와 컨테이너를 만들거나 시작할 때 제공하는 모든 구성옵션에 의해 정의됩니다. 컨테이너가 제거되면 영구 스토리지에 저장되지 않은 상태의 변경사항은 모두 사라집니다.

 

(나머지는 나중에...)

관련글 더보기