백엔드/Kubernetes

가장 쉽게 배우는 도커

묘걍 2023. 12. 20. 17:31

✏️ 도커가 뭐고 왜 쓰는건가요?

출처: 얄팍한 코딩사전

프로듀싱 일을 하는 A씨 🙎🏻

계약건마다 현지로 다니며 일하는데 매번 많고 복잡한 장비들을 새 업무현장으로 옮겨 조립하고 설치하는 일에 신물이 나있다

이때 나타난 🐡 복커(도커)

🐡"먼저 장비들을 사본들로 박제할게요"

🐡"하나하나 할 수 도 있고, 서로 연결되고 조립된 모습까지 문서를 저장하듯 보관할 수 있어요"

출처: 얄팍한 코딩 사전

🐡"그 박제된 사본을 새 작업실에 가져가서 그대로 설치할 수 있어요"

저장한 사본은 복커허브(도커 허브)☁️라는 공간에 업로드

"클라우드를 쓰는 것 처럼 어디서든 내려 받아 설치하면 돼요"

🙎🏻"같은 공간에서 다른 작업을 하는 B씨. 물건들 두는 곳도 겹치고 전선도 꼬여. 서로 방해되지 않게 설치하고 작업하는 게 골치아파"

🐡"분리된 작업 공간을 만들면 돼요"

곤테이너(컨테이너)를 이용

출처: 얄팍한 코딩 사전

같은 물리적 공간에서도 곤테이너(컨테이너)로 분리되고 필요에 따라 연결독립된 업무환경을 구축할 수 있다

한 번 저장된 장비들은 얼마든 새로 불러낼 수 있다

* 도커만 있으면 도커 허브에 한 번 업로드한 장비들을 내가 지정한 형태로 어디든 설치할 수 있고 장비들에 문제가 생겨도 고칠 필요 없이 그냥 새로 복원, 같은 곳의 다른 비품들과 서로 방해하지 않는 업무 환경을 만들 수 있다

 

서버를 돌리기 위한 환경을 구축하는 건 복잡하고 머리아프다

언어, 웹서버, 데이터베이스, 자동 배포 툴 등.. 여러가지 버전을 신경써 서로 잘 맞물려 동작할 수 있도록 설정해야한다

서버를 운영하다보면 더 성능 좋은 서버로 옮겨가거나 늘어난 접속량을 처리하기 위해 서버를 여럿 추가해야될 수도 있다

그러면 그것들도 똑같이 설치해줘야한다.

(와중에 어디가 잘못돼서 뭘 어떻게 고쳐야할지도 모르게 되면 더 큰일)

또, 여러 서비스를 돌리는 경우 각각이 다른 실행 환경에서 동작해야할 때 일이 까다로워질 수도 있다

기존 사이트를 Java7에서 돌리고 있었는데 새 서비스가 Java8에서 동작하는거면 이것저것 맞추고 신경써야한다

 

도커는 이런 문제들을 깔끔하게 해결해준다

먼저 각 요소들이 설치된 모습을 이미지란 형태로 박제해서 저장한다

출처: 얄팍한 코딩사전

각 제품마다 공식적으로 제공되는 이미지도 있고 우리가 원하는대로 만들어낼 수도 있다

Git으로 저장된 내용들이 Github에 올려지는 것 처럼 도커 이미지들은 DockerHub이란 곳에 업로드되어 공유되고 다운받을 수 있다

이렇게 이미지로 저장된 항목들이 함께 연결돼서 동작하도록 설정된 상태를 명령어 텍스트나 문서 형태로 저장할 수도 있다

마치 이것들을 설치하는 과정을 어디서든 컴퓨터가 자동으로 재현할 수 있도록 녹화해둔다는 느낌

문서만 잘 복원해두면 이 요소들이 언제 어디서든 미리 지정된, 서비스에 필요한 설정대로 도커허브로부터 다운받아 설치

 

도커는 이것들을 컴퓨터에 바로 설치하지 않는다

각각을 컨테이너라 불리는 독립된 가상 공간을 만들어내서 복원한다

서로 다른 버전의 자바를 돌리는 서비스들도 각각의 컨테이너 안에서 서로 방해하는 일 없이 돌아갈 수 있는 것

출처: 얄팍한 코딩 사전

버추어박스 같은 가상컴퓨터처럼 들릴 수도 있는데 도커는 가상 컴퓨팅과는 다른 구조다

가상 컴퓨팅은 한 물리적 컴퓨터 안에 각각 OS를 가동하는 가상 컴퓨터들이 물리적 자원을 분할해서 사용하기 때문에 성능에 한계가 생긴다

출처: 얄팍한 코딩 사전

도커는 OS단까지 내려가는 것이 아니라 실행 환경만 독립적으로 돌리는 거라서 컴퓨터에 직접 요소들을 설치하는 거랑 별 차이 없는 성능을 낼 수 있고

가상 컴퓨팅보다 훨씬 가볍고 빠르게 각각을 설치하고 실행하고 켜고 끄고 연동할 수 있다

그래서 이제는 서버에 뭔가 문제가 생겨 고쳐야하거나 일부 업그레이드 할 경우 일일이 요소를 정지, 지우고 새로깔 필요 없이 그냥 컨테이너들을 통째로 교체해서 새로 실행하면 된다

 

서버를 관리하고 서비스들을 배포하는 일이 전과는 비교도 안되게 쉬워진 것

 

이제는 도커가 보편화 되어있다

 


☝🏻 상황 가정

건물 방문자들을 기록하는 방문자 기록부 웹페이지 (Service A)

  • 프론트엔드: Svelte로 짜서 build한 결과물을 node.js의 http-server에 올린다
    • html, css, js 파일들을 브라우저에서 사이트로 볼 수 있도록 웹서버를 돌림
  • 백엔드: Python언어로 된 Flask 프레임워크 사용
    • REST API로 데이터를 프론트엔드와 주고 받음
  • Database: MySQL

✅ 브라우저에서 이 웹사이트를 열면

- 프론트엔드에서 백엔드로 데이터를 요청

- 백엔드는 데이터베이스로부터 데이터를 받아서 프론트엔드로 보내줌

 

👉🏻 개발 작업

  1. 개발자의 컴퓨터에서 코딩
  2. 테스트 (후 별 이상이 없으면)
  3. 그것들을 서버에 올려 사람들이 사이트를 볼 수 있도록 서버에서 프로그램 실행 = 배포

- 그러면 개발용 컴퓨터와 서버용 컴퓨터 모두에 이 모든 것이 가능한 버전이 동일하게 깔려 있어야 한다

출처: 얄팍한 코딩사전

👉🏻 집에 비유해보기

컴퓨터에 각각이 깔려 있는 것을 근무자들이 입주해서 일하는 것에 비유

개발자들이 Service A만 만드는거면 별 문제가 없지만

이 집에서 새로 Service B도 진행하며, Node.js이 새로운 버전을 사용하는 반면

Service A는 구버전의 Node.js를 사용한다면

출처: 얄팍한 코딩사전

이 집에는 두 버전의 Node.js가 입주해있어야 한다

하지만 두 노드가 부딪히는 등 혼란이나 오류를 방지하기 위해서는 번거로운 설정들이 필요

(다른 것들도 마찬가지)

여러 프로젝트가 진행되면 입주자들이 함께 지내기가 힘들어진다

 

✅ 이를 해결하기 위한 방법이 Virtualization

  • Virtual Box, VMWare, 페러릴리즈..
    • OS안에 또 다른 OS를 설치해서 각 서비스를 개발

이는 집 안에 또 다른 집을 짓는 것과 마찬가지

출처: 얄팍한 코딩사전

- 환경들을 확실히 분리해주기는 하지만 효율적인 방법은 아니다

- 저택에 제공되는 전기와 수도를 이 집들이 특정 비율로 분할해서 끌어가기 때문

- 컴퓨터의 성능과 자원이 환경마다 칼같이 제한되는 것

- 큰 집에 부엌과 화장실(OS기능)이 이미 있는데 각각의 집들에도 또 만드니 낭비일 수 밖에

- 성능 활용이 중요한 서버에서는 더더욱 곤란함

 

🧩 도커의 컨테이너 활용하기

출처: 얄팍한 코딩사전

- 근무자들이 업무 공간으로만 활용하는 컨테이너들이 들어감

- 한 컨테이너 안에 여럿이 들어갈 수도 있고, 각각이 들어 있는 컨테이너들이 서로 연결되어 서비스를 돌릴 수도 있다

출처: 얄팍한 코딩사전
출처: 얄팍한 코딩 사전

- 딱 필요한 공간만 차지

- 전기와 수도도 함께 공유

- 컴퓨터 자원 낭비도 적음

- 각각의 업무 공간이 나눠져 버전이 다른 업무자들로 인한 혼란 방지

 

 

👉🏻 서버 배포시에도 문제

  • 여러 근무자들이 함게하는 복잡한 서비스일수록 서버환경을 개발 환경과 동일하게 맞추는 것도 일

출처: 얄팍한 코딩사전

- 개발 저택에 입주해있는 근무자들이 서버 저택으로 이사짐 나르고 사무실 똑같이 세팅해야하는 상황

- 작은 것 하나만 잘못돼도 서버에서 안 돌아갈 수 있음

  • 도커의 컨테이너로 해결할 수 있다
  • 개발자들은 각 컨테이너들이 어떻게 설계되고, 지정한 곳에 어떻게 설치되며 어떤 업무를 수행할지 여러 컨테이너들이 어떻게 연결되어 함께 서비스 구성 및 동작할지 하나하나 명시할 수 있다

출처: 얄팍한 코딩사전

- 개발한 코드들을 설계도와 함께 서버 저택으로 보내면

- 서버에서 그 설계도대로 컨테이너들을 설치해서 근무자들이 동일하게 서비스를 실행하도록 해줌

 

 

지금 도커 자체보다는 쿠버네티스가 더 급해서 실습은 나중에..!

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

출처: https://www.youtube.com/watch?v=tPjpcsgxgWc

https://www.youtube.com/watch?v=hWPv9LMlme8