Docker Basis

sorikikikim·2022년 5월 18일
1

Docker

1. Docker란

Docker : Go언어로 작성된 가상화 환경 구축에 이용되는 오픈 소스 프로젝트

Docker에는 Docker Compose, Private Registry, Docker Machine, Kinematic 등 여러 프로젝트가 있는데, 이들은 곧 Docker Engine을 더 효율적으로 사용하기 위한 것이므로 핵심은 Docker Engine이다.

2. Docker를 사용하는 이유

Container(컨테이너) : 어플리케이션을 환경에 구애받지 않고 실행하는 기술
ex) gitlab을 우분투에서 설치하는 경우의 명령어 vs 센트OS에서 설치하는 경우의 명령어
=> Docker에서는 운영체제에 상관없이 하나의 명령어로 설치 및 실행 가능

눈송이 서버 (Snowflake Servers)

서버는 서버를 다루는 기술과 별개로, 각 서버마다 운영 기록이 다르다. 똑같은 일을 하는 두 서버가 있어도 예를 들면 서버 구축 날짜가 다르다면, 운영체제부터 컴파일러, 패키지까지 완벽하게 같기는 쉽지 않다. 그리고 이러한 차이가 장애를 발생시킬 수 있다. 이와 같이 서로 모양이 다른 서버들이 존재하는 상황을 각기 다르게 생긴 눈송이와 같아 눈송이 서버라고도 한다.

이러한 눈송이 서버는 처음에 버전, 추가기능의 버그 등의 작은 차이로 시작하다가 서버를 오래 운영하다보면 점점 커져서 나중에는 거대한 눈덩이가 되어 있을 것이다.

서버를 코드로 구성하고 관리하는 다양한 방법

위와 같은 상황을 개선하고자 다양한 방식으로 서버 운영 기록을 저장해 두곤 한다. 가장 흔하게는 서버에서 어떤 작업을 실행할 때마다 이를 사내 문서 도구에 기록해두거나, 여러 서버에 동시 접속해서 한꺼번에 명령을 실행하는 도구를 사용하기도 한다.(tmux)
운영체제부터 어플리케이션까지를 하나의 이미지로 만들기도 하고(Vagrant), 서버를 코드화하여 이 코드만 관리하는 방식도 있다.(Chef, Puppet, Ansible)

도커에서는 Dockerfile이라는 파일에 서버 기록을 코드화하는 방식으로 서버를 구성하고 관리한다.

3. Dockerfile

  • Dockerfile 예시
//debian 운영체제에서 작동하는 nginx 서버를 만드는 도커 파일 
FROM devian:stretch-slim

RUN apt-get update \
	&& apt-get install -y \
    nginx
    
CMD ["nginx", "-g", "daemon=off;"]
  • Dockerfile -> Doker Image
    도커 파일을 빌드하면 도커 이미지를 만들어 준다.
    Dockerfile : 서버 운영 기록의 코드화
    Docker Image : Dockerfile + 실행시점, Dockerfile의 명령어들을 모두 실행한 결과물이라고 볼 수 있다.

4. 서버 코드화의 장점

서버 제작 과정에 견고함유연성을 더할 뿐 아니라, 다른 이가 만든 서버를 소프트웨어 사용하듯 가져다 쓸 수 있고, 여러 대에 배포할 수 있는 확장성 등이 있다.

5. Docker를 왜 써야하는가?

이럼에도 Docker 없이 배포 및 운영하고 있는데 불편함을 느끼지 못한다, 왜 도커를 써야하는가?
서버 배포와 운영에 도커를 꼭 써야만 하는 것은 아니다. 하지만 현재 상황에 너무 익숙해져 있어 문제라고 느끼지 않는 문제가 있을 수 있다.
예를 들면 수평적 확장이 자유로운가? 서버의 견고함을 보장하면서도 동적으로 바꿀 수 있는 유연함이 존재하는가? 다른 이에게 서버 운영 기록을 인계하는데 시간이 얼마나 걸리는가? 에 대한 답을 생각해보면 도커를 사용하는 이유를 찾을 수 있다.

VM vs Docker

Virtual Machine

공통적으로 하나의 서버가 있고 한서버에는 어떤 운영 체제가 있건 HostOS (맥 OS, 리눅스, 마이크로소프트 윈도우) 가 올라간다. VM의 경우 호스트OS에 의해 VM을 가상화 시켜주는 하이퍼바이저(virtual box, Xen, KVM, VMware)들이 있다. 하이퍼 바이저를 사용하여 원하는 운영체제로 GuestOS를 올려 여러 VM을 만들 수 있다. GuestOS도 HostOS와 같이 하나의 OS를 독립적으로 가지고 있는것처럼 사용가능하다. 여러 어플리케이션들을 설치하고 각각의 서비스를 만들 수 있다.

Continer

VM과 HostOS 까지 설치는 동일하다. 이 OS에 의해 컨테이너를 가상화 시켜주는 여러가지 소프트웨어들(docker, rkt, LXC)이 있고, 도커를 가장 많이 사용한다. 도커가 컨테이너를 만들어준다.
도커(컨테이너 가상화)는 OS에서 제공하는 자원격리 기술을 이용하여 컨테이너라는 단위로 서비스를 분리할수있게 만들어주고, 개발환경에 대한 걱정없이 배포가 가능하다.

차이점

시스템 구조적으로 컨테이너는 한 OS를 공유하는 구조이고 VM은 각각의 OS를 띄워야하는 구조이기 때문에 컨테이너가 빠르다. 하지만 VM은 사용자가 윈도우를 사용하고 있더라도 새로운 GuestOS를 설치할 때 리눅스 OS를 설치해서 사용할 수 있지만, 컨테이너는 리눅스 OS에서 윈도우용 컨테이너를 사용할 수 없다. 또한 보안적으로 VM은 보안적으로 문제가 생겨도 각각의 VM이 분리되어 있기 때문에 서로 피해가 가지 않지만 컨테이너는 보안적으로 문제가 생길 수 있다.

일반적으로 한 서비스를 만들 때 한가지 언어를 사용하여 여러 모듈들이 한 서비스로 같이 돌아간다. A와 B모듈은 괜찮은데 C모듈에 부하가 많이 가는 상황이면 VM을 하나 더 생성해서 띄워야 한다. 반면 컨테이너는 한 서비스를 만들 때 모듈별로 쪼개서 각각의 컨테이너에 담고 그 모듈에 최적화 된 개발 언어를 사용한다. 쿠버네티스는 여러 컨테이너들을 한 파드라는 개념으로 묶을 수 있고 한 컨테이너만도 파드에 담을 수 있는데, 한 파드가 하나의 배포 단위이다. 내가 필요한 파드만 확장할 수 있다. 컨테이너는 시스템을 모듈별로 쪼개서 개발을 했을 때 큰 효과를 발휘할 수 있다.

Docker Client & Daemon

Daemon Process : 데몬 프로세스의 사전적 정의는 지속적으로 실행되어 서비스 요청에 응답하는 백그라운드 프로세스이다.
데몬 프로세스는 백그라운드 프로세스들 중에서도, 부모 프로세스를 갖지 않아 PPID (Parent Process ID)가 1이거나 다른 데몬 프로세스를 부모로 갖는 프로세스를 지칭한다. 이는 쉘이 종료되었을 때 쉘에서 실행된 자식 프로세스들이 모두 종료되는 현상으로 데몬 프로세스도 종료되는 현상을 방지하기 위해서이다.
데몬 프로세스는 일반적으로 이름의 끝에 d를 달고 있으며, 시스템이 시작될 때 자동으로 시작하는 경우가 많다.

docker라는 명령어(파일)dockerd라는 데몬 프로세스는 어떤 관계가 있을까? Docker는 클라이언트로 동작하는 Docker와 서버로 동작하는 Docker로 구분된다. 사용자가 명령어를 입력하는 CLI 프로그램이 Docker 클라이언트이며 되고, API를 외부로부터 받아 Container를 생성하고 실행하는 등 전반적인 Docker Engine의 기능을 수행하는 데몬 프로세스가 Docker 데몬이 된다.
즉 Docker 데몬은 클라이언트와 서버의 관계에서 일종의 서버라고 보면 된다.

Docker 데몬은 API를 입력을 받아 Docker Engine의 기능을 수행한다고 했는데, 여기서의 API가 곧 Docker 클라이언트에 사용자가 명령어로 입력한 것들이 된다. Docker 클라이언트는 사용자가 입력한 명령어를 읽어들인 뒤, 그대로 Docker 데몬에게 보내게 되고, Docker 데몬은 이를 파싱하여 명령어에 해당하는 Docker Engine의 기능을 수행하게 된다. 이 때 Docker 클라이언트와 Docker 데몬이 같은 Host에 위치해 있다면 Docker 클라이언트와 Docker 데몬은 Unix Socket을 이용하여 소통하게 된다.

0개의 댓글