[Infra] 도커(docker)(0) 도커의 개념, 컨테이너?

업데이트:

도커(docker)(0) 도커의 개념, 컨테이너?

참고 링크

1. 우리의 상황

일반적으로 파이썬, 자바, 루비 같은 다양한 프로그래밍 언어를 이용해 개발을 하면 다양한 라이브러리를 사용합니다. 그리고 시간이 지날수록 언어의 버전이 달라지고 라이브러리도 업데이트 됨에 따라 기존에 사용하던 문법이 달라지거나 새로운 함수가 등장하기도 합니다.

따라서 개발자는 소프트웨어의 버전이 달라짐에 따라 이에 따라 안정성을 유지하기가 힘들어집니다.

이러한 문제를 해결하기 위해 도커의 컨테이너 개념을 사용합니다.

2. 가상서버 vs 컨테이너

컨테이너는 하나의 리눅스 프로세스가 마치 전용 서버에서 동작하고 있는것 같은 분리 상태를 만들어 넵니다. 이는 리눅스 커널의 네임스페이스와 컨트롤 그룹(cgroup)이라는 기술을 기반으로 합니다.

위 그림에서 하이퍼바이저는 가상 머신(VM)을 생성하고 실행하는 프로세스입니다. 하이퍼바이저의 종류에는 버추어박스(virtual box)나 VMware 등이 있습니다.

또는 다음 그림과 같이 가상서버와 컨테이너를 함께 사용할 수도 있습니다.

3. 도커 아키텍쳐

전체적인 도커 구조는 다음과 같습니다. 도커는 일단 큰 틀에서 클라이언트(client), 호스트(host), 레지스트리(registry)로 나눌 수 있습니다. 먼저 클라이언트는 사용자 쪽에서 명령 커맨드를 입력하는 터미널이라고 생각할 수 있습니다. 그리고 호스트(host)는 사용자의 명령을 받아 작업을 수행하는 서버라고 생각할 수 있겠습니다. 그리고 레지스트리(Registry)는 전세계 사람들이 도커 이미지를 올리는 곳인 도커 회사라고 생각할 수 있습니다. 레지스트리는 도커 허브(docker hub)라고 하는데, https://hub.docker.com/를 의미합니다.

위 그림에서 도커 데몬은 도커 엔진(docker engine)이라고도 부르는데 호스트의 백그라운드에서 실행중인 도커를 의미합니다. 쉽게 생각해서 클라이언트에서 내린 명령을 받고 수행하는 녀석이라고 생각하시면 편합니다.

위 그림의 코드를 설명하면 다음과 같습니다.

  • docker build : 호스트에서 직접 도커 이미지를 만들어 저장합니다.

  • docker push : 호스트에서 만든 이미지를 레지스트에 올림

  • docker pull : 레지스트리에 존재하는 이미지를 호스트로 다운로드 받아서 저장

  • docker run : 호스트에 존재하는 이미지를 컨테이너로 가동시킴, 만약 호스트에 이미지가 없다면 레지스트리에서 다운로드 받음.