[ 따라하며 배우는 도커와 CI 환경 : 안재현 지음 ] 에서 공부한 내용을 정리한 페이지입니다.
도커란?
- 어플리케이션을 신속하게 구축, 테스트 및 배포할 수 있는 소프트웨어 플랫폼입니다.
- 도커는 소프트웨어를 컨테이너라는 표준화된 유닛으로 패키징한다.
- 이 컨테이너에는 라이브러리, 시스템 도구, 코드, 런타임 등 소프트웨어를 실행하는데 필요한 모든 것이 포함되어 있습니다.
- 도커를 사용하면 환경에 구애받지 않고 애플리케이션을 신속하게 배포 및 확장할 수 있으며 코드가 문제없이 실행될 것임을 확신할 수 있습니다.
- 도커에서는 다양한 프로그램과 실행 환경을 컨테이너에 담고, 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 합니다.
도커 컨테이너
- 코드와 모든 종속성을 패키지화하여 응용 프로그램이 한 컴퓨팅 환경에서 다른 컴퓨팅 환경으로 빠르게 안정적으로 실행되도록 하는 소프트웨어의 표준이다.
도커 이미지
- 코드, 런타임, 시스템 도구, 시스템 라이브러리 및 설정과 같은 응용 프로그램을 실행하는데 필요한 모든 것을 포함하는 가볍고 독립적이며 실행 가능한 소프트웨어 패키지이다.
도커 컨테이너와 도커 이미지 관계
- 즉, 도커 이미지가 있어야지 도커 컨테이너가 생성되며 도커 이미지에는 응용프로그램에 실행에 필요한 관련 스프트웨어 패키지가 있고, 이 패키지를 실행하면 컨테이너가 생성된다. 쉽게 설명하면 도커 이미지는 클래스이며 이를 인스턴스화한 것이 도커 컨테이너이다.
- 도커 이미지 -> 도커 컨테이너 -> 프로그램 실행 순으로 진행된다.조금 더 자세하고 살펴보면..
- 1. 도커 클라이언트(CLI) 명령어 입력하면 해당 명령 ---> 도커 서버
2. 도커 서버(도커 데몬) : 명령받은 이미지 생성, 컨테이너 실행, 프로그램 실행함.
▶ 더 자세히 해당 과정에 대해서 알아보면 2가지 경우의 수가 있다.
- 도커 이미지가 로컬에 있는 경우
- 도커 클라이언트에 명령어를 입력하면 클라이언트에서 도커 서버로 요청을 보낸다.
- 도커 서버는 로컬에 도커 이미지가 있는지 확인한다(이미지 있음).
- 해당 도커 이미지가 있기 때문에 컨테이너를 생성한다.
- 컨테이너는 이미지에서 받은 설정과 조건에 따라 프로그램을 실행한다.
- 도커 이미지가 로컬에 없는 경우
- 도커 클라이언트가 명령어를 입력하면 클라이언트에서 도커 서버로 요청을 보낸다.
- 도커 서버에서는 로컬에 해당 이미지가 있는 확인한다(이미지 없음)
- 이미지가 없기 때문에 도커 허브에서 해당 이미지를 가져오고 로컬에 보관한다.
- 이제 해당 이미지가 있기 때문에 도커 서버는 이미지를 해당하는 컨테이너를 생성한다.
- 컨테이너는 이미지에 맞는 설정과 조건에 맞는 프로그램을 실행한다.
가상화 기술이 나오기 전에 서버 사용하는 방식!
- 가상화 기술이 나오기 전에 한 대의 서버는 하나의 용도로만 사용했으며, 서버에 남는 공간이 생기면 그것을 다른 용도로 활용하지 못했다. 만약 다른 용도로 사용하려면 서버가 하나 더 필요하다.
- 즉 1:1 서버와 프로그램의 방식은 안정적이나.....서버를 효율적으로 사용하지 못하는 단점을 가지고 있다.
하이퍼바이저 기반의 가상화 기술
- 한대의 서버를 하나의 용도로 사용했던 비효율적인 부분을 해결함.
- 하이퍼바이저는.. 하나의 호스트 시스템에서 다수의 게스트 운영체제 구동할 수 있게 하는 소프트웨어이다.
- 도커 구조와 가상화 기술의 구조는 굉장히 비슷하다.
- 중요! 도커 컨테이너는 격리되어 운영이 되지만 다른 컨테이너와 동일한 커널을 공유한다. 그러므로 컨테이너 내부에서 실행되는 프로세스는 호스트 시스템에서 볼 수 있다.
- 또한 컨테이너는 전체 OS를 내장할 필요가 없기 때문에 매우 가볍고 용량이 매우 적다.
가상머신과 도커 컨테이너의 차이점
- 가상머신
- 가상 머신 내부에서 실행되는 모든 것들은 하이퍼바이저와 호스트 OS로 부터 독립적이다.
- 도커와 달리 가상머신은 각 VM마다 게스트 OS를 설치해야되기 때문에 크기가 크고 느리다.
- 가상머신은 1) 가상머신 실행하고, 2) 자원할당(infra), 3) 게스트OS 실행, 4) 어플리케이션 실행하기 때문에 느리고 복잡하고 무겁다..
- 도커 컨테이너
- 하이퍼바이저와 게스트 OS가 필요하지 않음.
- 애플리케이션 실행할때 호스트 OS 위에 도커 이미지만 배포하고 컨테이너만 실행하면 됨.
도커 컨테이너
- 1) 컨테이너는 격리돼 있음, 2) 컨테이너는 각각의 프로그램이 실행됨 , 3) 컨테이너는 같은 커널을 공유
- 도커 컨테이너에는 리눅스 커널의 기능 중 Cgroup과 namespace가 있다.
- Cgroup과 namespace는 다른 프로세스 사이의 벽을 만드는 리눅스 커널의 기능이다.
Cgroup
- CPU, 메모리, 네트워크 대역폭, HD I/O 등 시스템 리소스 사용량 관리함. 만약 어떤 애플리케이션이 사용량이 많으면 Cgroup에서 CPU, 메모리 사용량을 제한할 수 있다.
namespace
- 하나의 시스템에서 프로세스를 격리시키는 가상화 기술
- 별개의 독립된 공간처럼!! 격리된 환경을 제공 즉 실제적으로 독립된 건 아니지만 기능적으로 독립된 공간인 것처럼 사용할 수 있도록 함.
커널
다른 컨테이너와 공유함하지만 컨테이너는 다른 컨테이너와 독립되며 프로세스를 작동시키기 위해 필요한 양의 디스크, 네트워크, RAM 등이 할당됨.
도커 이미지
- 도커이미지를 통해서 컨테이너를 만들고 컨테이너를 통해서 에플리케이션을 실행할 수 있다.
- 도커 이미지는 2가지로 구성되어져 있는데 1) 시작시 실행할 명령어, 2) 파일 스냅숏 있다
- 1. 시작시 실행할 명령어
- 도커 이미지를 통해서 컨테이너가 생성되는데, 컨테이너를 실행할 명령어가 필요하다
- 애플리케이션을 실행하려면 해당 도커 이미지는 이를 실행 시켜줄 명령어를 가지고 있어야 한다.
- 2. 파일 스냅숏
- 파일 스냅숏은 파일 또는 디렉토리를 복사한 것을 말한다.
- 즉, 도커 이미지는 1) 실행할 파일/경로과 2) 실행할 명령어 이 2가지를 가지고 있다고 생각하면 된다.
도커 컨테이너가 생성되는 순서
1. 도커 클라이언트에 docker run <이미지> 명령어를 입력한다.
docker run <이미지> : 아래의 1), 2) 을 합친 명령어이기 때문에 컨테이너를 생성하고 실행하는 2가지 작업을 한다.
1) docker create <이미지>(도커 컨테이너 생성하는 명령어)
2) docker start <이미지>(도커 컨테이너 실행하는 명령어)
2. 도커 이미지에 있는 파일 스냅숏을 임시 컨테이너의 하드디스크로 옮겨 준다.
3. 도커 이미지에서 가지고 있는 컨테이너 실행 명령어를 임시 컨테이너로 전달한다.
4. 임시 컨테이너가 사라지고 .. 파일스냅숏과 실행 명령어를 가진 실제 컨테이저가 생성된다.
5. 컨테이너가 실행된다.
윈도우나 mac 에서 Cgroup과 namespace를 쓸 수 있는 이유
Cgroup과 namespace는 리눅스 환경에서 사용할 수 있는 리눅스 커널의 기능이다.
그러나 윈도우나 맥에서도 Cgroup과 namespace를 사용할 수 있는 그 이유는 리눅스 VM 실행되고 그 위에 작동되기 때문이다. 즉, 윈도우 or 맥 위에 리눅스 가상 머신 위에서 작동한다.
하드웨어 -> macOS/Windows -> 리눅스 VM -> 리눅스 커널 , 컨테이너
'docker' 카테고리의 다른 글
도커 클라이언트 명령어 (1) | 2023.03.30 |
---|
댓글