컴퓨터 사이언스 (CS)/Docker & Git

01. 도커란 무엇인가?

한소희DE 2021. 6. 10. 08:19

데이터 엔지니어를 준비하며, 도커 학습의 필요성을 종종 들어왔다.

그러던 중, 이번에 쬰과 함께 전주시 빅데이터 공모전 준비를 할 때, 플젝 후반부에서 쬰의 PC와 내 PC 사이의 간극을 좁히는 과정에서, 도커의 필요성을 직접적으로 느꼈다. 

 

이번 해상물류 프로젝트를 할 때는, 어김없이 도커가 필요할 것 같았기 때문에, 이번 프로젝트에서는 팀원들과 함께 도커를 쓰기로 먼저 약속을 했다. 플젝을 하며 자유자재로 도커를 활용하고자 공부를 해야만 한다. (세상은 넓고 할 공부는 많다.)

 

그래서 오늘부터 도커 공부에 돌입했다! 아자아자 화이팅! 🔥🔥🔥

 

 

 

 

 

 

 

 

목차

도커란 무엇인가?

도커를 사용할 때의 흐름

기존의 기술, 가상화, 도커

 

 


 

 

 

01. 도커란 무엇인가?

컨테이너를 사용해 응용 프로그램을
더 쉽게 만들고 배포하고 실행할 수 있도록 설계된 도구이며
컨테이너 기반 오픈소스 가상화 플랫폼이며 생태계다.

 

 

만약 프로젝트1을 수행하기 위해, A & B & C 설치환경이 필요하다고 가정해보자.

 

컴퓨터를 새로 구매한 경우에는 A & B & C를 또 일일이 설치해야 한다.

 

친구와 프로젝트1을프로젝트 1을 함께 수행하는 경우에는, 친구의 컴퓨터에도 A & B & C를 일일이 설치해야 프로젝트 1을 수행할 수 있을 것이다.

 

이런 경우, 우리는 필요한 A & B & C 설치환경을 사진처럼 촬영해, 도커허브에 저장한다.

 

그리고, 이 파일들을 설치해야 하는 환경에 허브에 올린 이미지를 다운로드한다. 마치 클라우드 드라이브에 저장한 파일을 어느 컴퓨터에서든 내려받는 것처럼 말이다.

 

이렇게 이미지를 저장하면, 도커는 자동적으로 우리의 컴퓨터에 독립적 설치 공간(도커 컨테이너)을 생성하고, 그 공간에 (이미지에 저장된) 파일을 설치해준다.

 

즉, 도커가 없다면 갖고 있는 서버나 패키지 버전이나 운영체제에 따라 프로그램을 설치하는 과정에서 에러가 발생할 수 있고, 설치할 게 많으면 매우 복잡해진다.

 

하지만 도커가 있다면 다른 컴퓨팅 환경에서도 프로그램을 수월히 실행시켜 줄 수 있다.

 

 

 

도커 이미지란?

만약 카카오톡 이미지가 있다고 가정하면, 카카오톡 이미지에는 카카오톡을 실행해야 할 때 필요한 모든 설정등이나 종속성을 도커 이미지가 갖고 있다. 그것으로 여러 개의 도커 컨테이너를 생성한다. 따라서 도커 컨테이너는 도커 이미지의 인스턴스라고 볼 수 있다.

도커 이미지는 변하지 않으며 상태를 갖지 않는다 특징이 있다.


🔥 수정하고 싶으면 어떻게 해야 할까?
문득 궁금해졌다. 찾아보고 구글링 해두자!

 

여기서 컨테이너가 가장 중요한 개념이다.

 

컨테이너란 무엇인가?

실제 컨테이너는 물품을 넣어 화물차량을 통해 이동한다. 이처럼, 서버에서 컨테이너는 다양한 프로그램이나 실행환경을 컨테이너로 추상화하고, 이를 이동 배포 관리를 손쉽게 하도록 한 곳에 저장해둔 것이 컨테이너다. 컨테이너는 실행, 정지, 파기 3가지 상태들로 상태가 주어진다.

 


 

 

02. 도커를 사용할 때의 흐름

 

도커는, 도커 CLI(클라이언트)를 통해 도커 서버로 접근한다.

 

 

이 말이 무슨 뜻이냐면, 만약 컴퓨터를 통해서 CLI에 명령어로 특정 이미지를 불러오라고 명령하면, 그 명령어가 도커 서버로 전달되고, 수행한다. 특정 이미지를 불러오라는 명령이었으므로, 이미지 Cache 보관 장소에 해당 이미지가 존재하는지 확인한다. 만약 없으면, 알아서 Docker Hub에 가서 해당 이미지를 검색해 가져온다.

 

백견이 불여일행, 이 흐름을 감잡기 위해서 한번 실행해보자.

 

 

 

2-1. 도커 실행하기

 

나는 우선 윈도우 도커를 다운로드했다. 도커를 설치한 뒤, 도커를 시작한다는 명령어를 명령 프롬프트에 쳐주자.

 

docker run -d -p 80:80 docker/getting-started​

그러면 위와 같은 것들이 쭉쭉 뜨고, 명령어가 종료된다. 그러면 도커를 시작할 수 있다는 뜻이 된다!

이제 특정 이미지를 가져오는 명령어를 명령해보자.

 

 

 

2-2. 'hello-world' 이미지 실행하기

 

docker run hello-world

위와 같은 명령은, 'hello-world' 이미지를 실행한다는 뜻이다.

따라서 위와 같이 치면, 아래 사진처럼 뜰 것이다. 이를 해석해보겠다.

 

 

 

❓❗ Unable to find image 'hello-world:latest' locally

현재 내 이미지 보관 Cache에 해당 이미지가 없다는 의미다.
❓❗ latest: Pulling from library/hello-world

이미지가 보관 장소에 없으므로, 도커 허브에서 Pulling 해오겠다는 의미다. (그 아래 의미는 다운로드를 받아오는 과정을 보여 준 것이다.)

 

그래서 허브에서 가져온 결과가 바로 아래와 같다. 이렇게 뜬다면 성공이다!

 

 

 

 


 

03. 기존의 기술, 가상화, 도커

 

가상화 출현 이전, 하나의 서버를 하나의 용도로만 사용해왔다. 즉, 하나의 서버에 하나의 운영체제를 활용했다. 이는 안정적이지만 비효율적이다.

 

이를 해소하기 위해 하이퍼바이저 기반 가상화가 출현했다. 논리적으로 공간을 분리해서 다양한 소프트웨어 운영체제로 구현이 가능해졌다.

 

하이퍼바이저란 무엇일까?

호스트 시스템에서 다수의 게스트 OS를 구동할 수 있게 하는 소프트웨어(중간 관리자)를 말한다.
이는 네이티브 하이퍼바이저와 호스트형 하이퍼바이저로 분리된다.

1. 네이티브 하이퍼바이저: 하이퍼바이저를 하드웨어 바로 위에 실행한다.
2. 호스트형 하이퍼바이저(가장 많이 쓰임. 가상화도 이에 해당): OS위에 하이퍼바이저를 실행한다.



만약 한 VM에 오류가 발생하면 다른 VM에도 영향을 미칠까?

궁금해서 찾아봤는데, 그렇지 않다고 한다. 호스트형 하이퍼바이저 기반의 VM 구조는 각 VM마다 독립된 가상 하드웨어 자원을 할당받는다. 즉 논리적으로 분리되어 있어, 한 VM에 오류가 발생해도 다른 VM으로 퍼지지 않는다는 특징이 있다.

 

 

 

2-1. 도커 컨테이너와 가상 머신의 공통점과 차이점

 

 

공통점 차이점
격리된 환경 내 애플리케이션을 배치한다 컨테이너는 하이퍼바이저와 게스트 OS가 필요하지 않으므로 더 가볍다. (OS가 무거운 소프트웨어기 때문이다.)

 

차이점을 조금 더 설명해보겠다.

VM은 호스트 OS에 VM 띄우고 게스트 OS 설치하고 그 위에 애플리케이션을 설치해야 하는 반면, 

도커는 그저, 호스트 OS위에 어플리케이션 이미지를 배포하기만 하면 된다. 따라서 동일한 커널을 공유한다. 

 

 

그럼에도 사람들이 VM을 쓰는 이유는 무엇일까?
비록 속도가 느려지지만 설치 과정이 비교적 간단하기 때문이다. 하지만 이제는 도커를 더 많이 쓰는 추세다.

 

어떻게 도커 컨테이너를 내 PC에서 격리시키는가?

이는 어떻게 하냐면, 리눅스 커널의 C group과 Name Space 기술을 컨테이너 기술에 도입했기에 가능해졌다.

1. C Group(Control Groups)이란, 각 컨테이너별 CPU나 메모리, 네트워크, I/O 등 프로세스 그룹의 시스템 리소스 사용량 관리를 맡는다.
2. Name Space이란, 하나의 시스템에서 프로세스를 격리시킬 수 있는 기술이다. 이는 독립된 환경을 제공한다.