도커의 구조
일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가겠지만
도커를 사용하는 경우에는 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다.
프로그램이나 데이터는 컨테이너 안에 위치한다.
모든 컨테이너는 리눅스 운영체제 비슷한 무언가가 들어 있다.
최소한의 컨테이너에도 리눅스 운영체제 비슷한 무언가가 들어 있다는 것이다.
빈 컨테이너라고 말해도 엄밀히 말하면 텅 빈 컨테이너는 아니다.
위 그림을 보면 도커 엔진 아래에는 운영체제가 있고, 컨테이너 속에 또 리눅스 운영체제(비슷한 것)이 있다.
이 부분이 도커의 가장 큰 특징 중 하나다.
본래 운영체제는 커널과 그 외의 주변 부분으로 구성된다.
주변 부분이 프로그램의 연락 내용을 커널에 전달하고, 커널이 하드웨어를 다룬다.
도커에서는 컨테이너가 완전히 분리돼 있으므로,
밑바탕이 되는 리눅스 운영체제의 주변 부분이 컨테이너속 프로그램의 명령을 전달받을 수 없다.
따라서 컨테이너 속에 운영체제의 주변 부분이 들어있어 프로그램의 명령을 전달받고 이를 밑바탕이 되는 커널에 전달하는 구조로 돼 있다.
컨테이너 속에 리눅스 운영체제 비슷한 것은 바로 이 때문이다.
전체 리눅스 OS가 들어간 것이 아니라 주변 부분만 들어있어서 '비슷한 것'이라 묘사한 것이다.
커널을 밑바탕에 있는 것을 사용하면서, 도커의 가장 큰 특징인 가벼움을 얻을 수 있다.
다시 한 번 강조!
- 도커는 기본적으로 리눅스 OS에서만 동작한다.
- 컨테이너 안에 들어 있는 주변 부분도 이에 맞춰 리눅스 운영체제의 주변 부분이다.
- 컨테이너에서 실행할 소프트웨어도 역시 리눅스용 소프트웨어다. 윈도우나 맥 용 소프트웨어는 컨테이너에 넣어도 동작하지 않는다.
도커 허브와 이미지, 컨테이너
이미지 복습
컨테이너를 생성하려면 먼저 이미지를 만들어야 한다.
이미지는 컨테이너를 만드는데 사용하며, 컨테이너를 찍어내는 '빵틀'과 같은 것으로 컨테이너의 설계도 역할을 한다.
빵틀과 같은 역할이므로 이미지 1개만 있으면 동일한 여러 개의 컨테이너를 만들 수 있다.
신기하게도 이미지로만 컨테이너를 만들 수 있는 것이 아니라 컨테이너로도 이미지를 만들 수 있다고 한다.
컨테이너로 이지를 만드는 것은 이미 만든 컨테이너에 손을 대서 컨테이너의 빵틀을 새로 만드는 과정이다.
컨테이너로부터 이미지를 만들 수 없다면 여러 개의 컨테이너를 일일이 수정해야 한다. 이는 매우 불편!
개조된 컨테이너로부터 이미지를 만들고 나면 새로 만든 이미지를 사용해 개조된 컨테이너를 여러개 만들 수 있다.
소프트웨어나 시스템을 넣은 새로운 이미지를 만들면 다수 의 서버를 준비하는 과정이 매우 간단해진다.
또한 이전 시간에 학습했지만 해당 도커 엔진에서 다른 도커 엔진으로 컨테이너를 옮기는 것이 가능하다.
정확히 말하면 이미지를 통해 컨테이너가 이동하는 것과 같은 효과를 얻는 것이다.
도커 허브
이미지는 주로 도커 허브에서 구한다. 도커 허브는 공식적으로 운영되는 도커 레지스트리(도커 이미지를 배포하는 서비스)의 이름이다.
주소는 https://hub.docker.com 이다.
도커 허브는 공개된 컨테이너 이미지가 모여 있는 곳이다. 이곳에서 원하는 컨테이너 이미지를 다운로드할 수 있다.
도커 허브에는 운영체제(비슷한 것)만 들어 있는 이미지부터, 다양한 소프트웨어가 함께 포함된 것까지 다양한 이미지가 제공된다.
또한 같은 소프트웨어라도 다양한 배포판과 배포판의 버전마다 이미지가 제공된다. 정말 많은 이미지가 도커허브에서 제공되는 것이다.
그러면 우리 개발자들은 이미지를 사용해 셀 수 없이 많은 이미지 조합을 만들 수 있다.
유명한 소프트웨어들은 대부분 공식 이미지를 제공한다.
너무 많은 이미지를 자유롭게 등록할 수 있으므로 안전하지 못한 이미지가 있을 수도 있다.
안전한 이미지를 고르는 방법은 다음과 같다.
- 공식 이미지를 사용한다.
- 커스텀 이미지를 직접 만들어 사용한다.
참고로 운영체제(비슷한 것)만 들어있는 컨테이너부터 직접 만드는 것은 추천하지 않지만, 운영체제가 포함된 이미지에 소프트웨어를 넣는 것은 그리 어렵지 않다고 한다. - 그러므로 우리의 경우는 운영체제(비슷한 것)이 들어있는 운영체제에서 공식 소프트웨어 이미지를 추가하는 것이 좋을 것 같다.
컨테이너의 조합은 보통 2가지 경우가 있다고 한다.
- 하나의 컨테이너에 하나의 프로그램.
- 하나의 컨테이너에 모든 프로그램.
전자의 경우는 보안 및 유지 관리 측면에서 유리하기 때문에 많이 쓰인다.
후자의 경우는 한 번에 때려박으면 편해서 사용하는걸까?? 아니면 이미지를 옮길 때 편해서?? 어느 경우에 사용하는지 궁금하다.
놀란 부분 - 운영체제(비슷한 것)을 한 종류로 통일해야 할까?
리눅스는 여러 배포판이 있다. 그러면 호스트 컴퓨터와 컨테이너에서 각각 다른 리눅스 배포판을 사용해도 괜찮을까?
결론을 말하면 괜찮다. 호스트 컴퓨터와 컨테이너끼리 서로 다른 배포판을 사용할 수 있다. (겁나 신기)
도커를 보통 사용하는 경우에는 컨테이너에 세세한 설정을 하지도 않고,
이미지를 선택할 때도 '운영체제(비슷한 것)'이 무엇인지도 크게 신경 쓰지 않고 최신 버전을 선택하는 경우가 많다.
다만 컨테이너에 로그인할 필요가 있거나 특정 DBMS를 사용할 때는 운영체제 종류에 따라 문제를 일으킬 수 있으므로
배포판을 정확히 선택해야 한다.
도커 컨테이너의 생애주기와 데이터 저장
컨테이너는 쓰고 버리는 일회용품 같은 것이다.
컨테이너느 쉽게 만들 수 있으므로, 컨테이너 하나를 업데이트하면서 계속 사용하기보다는 업데이트된 소프트웨어가 들어있는
새로운 컨테이너를 사용하는 것이 좋다. 즉 새로운 버전이 나오면 새로운 컨테이너로 갈아타는 것이다.
여러 개의 컨테이너를 하나하나 업데이트하려면 많은 수고가 든다.
초기 구축은 간단히 마쳤는데 유지 보수할 때마다 컨테이너를 일일이 업데이트하려니 컨테이너의 장점이 반감된다.
유지보수 횟수가 훨씬 많은 것도 그렇다.
따라서 오래된 컨테이너를 버리고 새로운 이미지로부터 새로운 컨테이너를 만들어 갈아타는 방식을 사용한다. 굿.
이렇게 컨테이너를 만들고 ,실행하고 ,종료하고, 폐끼한 다음, 다시 컨테이너를 만드는 일련의 과정을 컨테이너의 생애주기라고 부른다.
데이터 저장
컨테이너를 폐기했다면 컨테이너에 들어있던 데이터는 어떻게 될까?
컨테이너를 폐기하면 해당 컨테이너 안에서 편집했던 파일은 당연히 사라진다. 이 파일은 컨테이너 안에 들어있었기 때문이다.
이런 일을 방지하기 위해 보통은 도커가 설치된 물리적 서버(호스트)의 디스크를 마운틀해 이 디스크에 데이터를 저장한다.
마운트는 쉽게 말해서 도커 컨테이너도 물리적 컴퓨터의 디스크를 연결해 데이터를 기록하는 것이다.
이런 방식으로 컨테이너가 폐기되고, 도커 엔진에 문제가 생겨도 데이터는 컨테이너 외부에 안전하게 저장되어 사라지지 않는다.
도커는 운영체제와 소프트웨어 부분은 컨테이너 형태로 만들었다가 쓰고 버리는 것을 반복하고,
데이터는 다른 곳에 저장해두고 같은 것을 계속 사용한다고 보면 된다.
설정파일도 마찬가지로 파일을 수정했다면 삭제되지 않을 곳에 저장한다.
그러나 프로그램을 개발할 때는 다른 저장소에 저장하지 않는 경우도 있으므로 컨테이너를 폐기하기 전에
중요한 데이터가 컨테이너에 포함돼 있지 않은지 확인해야 한다.
도커의 장단점
도커의 핵심적인 특징은 다음과 같다.
- 독립된 환경: 독립된 환경 덕분에 여러 개의 컨테이너를 띄울 수 있다.
- 이미지를 만들 수 있다. 이동성이 좋고, 교체가 쉽고, 업데이트도 쉽다.
- 컨테이너에 커널을 포함하지 않는다. 덕분에 컨테이너가 가벼워진다.
도커의 장점
- 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다.
- 서버 관리가 용이하다.
- 서버를 다루기 쉬워진다.
도커의 단점
- 호스트 서버에 문제가 생기면 전체 컨테이너에 영향이 생긴다.
- 리눅스 서버에서만 사용이 가능하다.
도커의 주 용도
- 팀원 모두 동일한 개발환경을 편하게 사용.
- 새로운 버전의 테스트에 유용하다.
- 동일한 서버가 여러 대 필요한 경우 편하게 세팅이 가능하다.
이상으로 포스팅을 마치겠습니다. 감사합니다.
참고 자료
그림과 실습으로 배우는 도커 & 쿠버네티스(2단원)
댓글