Docker란 ?
데이터 또는 프로그램을 격리시키는 기능을 제공하는 소프트웨어
1. 컨테이너 :
2. 도커 엔진 : 컨테이너를 생성하고 구동시킬 수 있는 Docker software의 본체
3. 이미지 : 컨테이너의 빵틀과 같은 역할로, 담고 있는 SW의 종류에 따라 다양한 이미지를 사용할 수 있다.
- 아파치 컨테이너 → "아파치 이미지" 필요 , MySQL 컨테이너 → "MySQL 이미지" 필요
※ 도커의 제약 사항 ( 리눅스 OS )
docker를 사용하는데는 리눅스 OS가 사용된다.
윈도우나 mac에서도 구동은 할 수 있지만 결국 내부적으로 리눅스가 사용된다.
또한 컨테이너에서 동작시키는 프로그램도 리눅스용 프로그램으로 구성되어 있다.
데이터, 프로그램 격리
프로그램 격리란 ?
도커 컨테이너는 다른 컨테이너와 완전히 분리된 환경으로, 컨테이너 안에 들어있는 프로그램은 다른 프로그램과 격리된 상태로 도커 컨테이너를 사용해 프로그램을 격리하면 여러 프로그램이 한 서버에서 실행되어 발생하는 문제를 대부분 해결할 수 있다.
따라서 격리 상태로 도커 컨테이너에서는 여러 컨테이너에 버전이 같든 다르든 같은 프로그램을 실행 할 수 있다.
도커는 주로 서버 환경을 격리하기 위해 사용하는데 데이터나 프로그램을 독립된 환경에 격리해야 하는 이유는 무엇일까
대부분의 프로그램은 단독으로 동작하지 않고 "실행 환경, 라이브러리, 다른 프로그램 등"을 이용하면서 동작한다.
예를 들면 내가 주로 짜던 파이썬 코드들도 실행 환경 , 참조 라이브러리 등을 파이썬과 함께 사용하는 것을 예로 들 수 있다.
즉, 소프트웨어는 단일 프로그램이 아닌, 여러 개의 프로그램으로 구성된 경우가 많기 때문에 프로그램 하나를 업데이트 하여 수정하게 된다면 다른 프로그램에도 영향을 끼칠 수 있게된다. 즉 이유를 정리하면 아래와 같다.
- 서로 공유되는 SW, 실행 환경, 라이브러리, 설정 파일 등의 수정 또는 업데이트 문제
- 서버 구축 시, 설계 때 문제 없던 프로그램 끼리 실제 설치 시 서로간의 공유 간 오류를 일으키는 문제
컨테이너의 장점
[1] 여러 가지 서버 기능을 안전하게 함께 실행하는 것이 가능
- 한 대의 서버에서 실행하던 웹 서버, 메일 서버, DB 서버, 시스템 등 각 독립적인 환경에서 안전하게 운용이 가능함 (격리)
- 웹 서버 한 벌 밖에 실행 못하던 기존의 서버 컴퓨팅과 달리 여러 개의 웹 서버를 올릴 수 있다.
- 물리 서버 한 대에 여러 웹 서버를 띄워 물리 서버 수를 줄일 수 있다.
- 다른 개발 환경과 운영 환경으로 쉽게 넘어갈 수 있다
[2] 지유롭게 옮기는 것이 가능함
- 컨테이너 정보를 내보내기 한 다음, 다른 도커 엔진에서 복원하는 형태가 가능함
- 똑같은 상태로 튜닝한 컨테이너를 팀원 전체에게 배포해 모두가 동일한 개발 환경을 적용할 수 있다.
- 도커를 이용해 물리적 환경의 차이, 서버 구성의 차이를 무시할 수 있다. ( 운영 서버, 개발 서버 환경 차이 X )
도커의 구조
물리 서버가 존재하고, 물리 서버에서 동작하는 서버 운영체제가 존재한다. 여기까지는 일반적인 서버와 같다.
도커는 일반적으로 운영체제 위에 프로그램이나 데이터가 직접 올라가는 것이 서버의 형식 구조가 아니라,
운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작하는 구조로 이루어져 있다.
(컨테이너 안에서는 프로그램과 데이터 들이 존재한다.)
컨테이너의 구조
모든 컨테이너에는 리눅스 운영채제와 비슷한 무언가가 들어있다. 이는 빈 컨테이너가 생성되어도 따라 생성되는 것으로, 운영체제와 비슷하지만 실제 운영체제는 아니다.
실제 운영체제의 역할은 소프트웨어나 프로그램 명령을 처리가능하도록 번역하여 하드웨어에 전달하는 역할로, 크게 2가지 부분으로 나눌 수 있다. (커널 + 그 외 주변 부분)
- 커널 : 실제 하드웨어를 다루는 역할을 수행함
- 주변 부분 : 프로그램에서 명령을 전달받거나, 커널의 결과를 다시 전달하는 역할
도커의 컨테이너 구조에서 운영체제는 두 가지 형태로 존재한다.
- 도커 엔진과 서버 컴퓨터 사이 동작하는 서버 OS ( 리눅스 ) → "커널"
- 컨테이너 안에 들어가 있는 리눅스 운영체제와 비슷한 무언가 .. → "주변 부분"
도커의 컨테이너가 완전히 서로 분리되어 있으므로 각 컨테이너에 서버 OS를 따로 설치하는 것은 비효율적이고 무거울 것이다.
따라서 도커는 커널의 역할을 수행하는 영역과 명령과 결과를 전달하는 주변 부분을 수행하는 OS를 따로 두어서 도커의 큰 특징임 가벼움을 살릴 수 있다.
도커는 기본적으로 리눅스용으로 리눅스 OS상에서만 동작한다.
리눅스 운영체제가 동작하는 것을 전제로 하기 때문에 컨테이너 안의 주변 부분도 리눅스 운영체제의 주변 부분이어야 한다.
또한 컨테이너에서 실행할 소프트웨어(프로그램)도 리눅스 용 소프트웨어를 전제로 한다.
즉 도커는 리눅스 컴퓨터에 독립된 격리 환경을 만들고, 리눅스에서만 동작하고, 컨테이너에서 동작할 프로그램도 리눅스용 프로그램이다.
( 도커는 대개 서버 환경을 전제로 하므로, 리눅스가 서버용 OS로 자주 사용되기 때문에 이러한 구조로 예상된다. )
윈도우나 MAC OS를 통해 도커를 사용하는 경우는 아래와 같다.
(1) VirtualBox나 VMware 같은 가상 환경 위에 리눅스 운영체제를 설치하고 그 위에서 도커를 실행시키는 방법
(2) 패키지 형식으로 리눅스 운영체제를 포함하는 패키지를 설치해 사용하는 방법
따라서 다른 OS에서 도커를 사용하기 위해서는 리눅스 운영체제를 끌어들여 도커를 실행해야 하고, 어떤 형식으로든 리눅스 운영체제를 갖춰야 한다.
도커 허브와 이미지 그리고 컨테이너
이미지
이미지는 컨테이너를 만드는 데 사용하는 틀의 종류로 붕어빵으로 치면 빵틀, 자바로 치면 Class를 예로 들 수 있다.
즉 설정해둔 이미지 파일을 통해서 컨테이너를 생성하고 이러한 컨테이너를 도커 엔진을 통해 구동한다.
- 이미지를 통해 동일한 여러 개의 컨테이너를 생성 할 수 있다.
- 이미지로 컨테이너를 만드는 것도 가능하고, 컨테이너로 이미지를 만드는 것도 가능하다.
- 컨테이너로 이미지를 만들고 수정하면서 버전 관리가 가능해졌다. ( 컨테이너 생애관리 )
- 컨테이너로 만들어진 새로운 이미지를 통해서 개조된 컨테이너를 대량 생산하는 것이 가능하다.
- 다른 물리 서버에 설치된 도커 엔진으로 컨테이너를 이동시킬 수 있다.
- 컨테이너는 도커 엔진만 설치되면 구동 가능하므로, 다른 서버에 도커 엔진을 설치하고 새로운 도커 엔진에 이미지를 이용해 똑같은 컨테이너를 생성할 수 있다.
도커 허브
도커 허브는 스마트폰의 구글 플레이 스토어 같이 공개된 컨테이너 이미지가 모여 있는 곳이다.
이를 통해서 사용자는 처음부터 이미지 파일을 생성하는 것이 아니라 원하는 컨테이너의 이미지를 내려받을 수 있다.
도커 허브는 다양한 공개 이미지를 공개하고 업로드 할 수 있고 다양한 종류의 이미지가 존재한다.