2. 도커의 동작 원리
Section 1) 도커의 동작 원리
도커의 동작 원리를 설명한다
도커의 구조
일반적인 서버라면 운영체제 위에 프로그램이나 데이터가 직접 올라가겠지만 도커를 사용하는 경우에는 운영체제 위에 도커 엔진이 동작하고 그 위에서 컨테이너가 동작한다 -> 프로그램이나 데이터는 컨테이너 안에 위치한다. 그런데 데이터는 컨테이너 안, 밖에 위치하는 것이 있다. 뒤에서 설명…
컨테이너가 운영되가 위한 구조 [컨테이너1] | [컨테이너2] | [컨테이너3] | …
- [도커 엔진] - 도커 소프트웨어
- [리눅스 운영체제] - 서버 운영체제
- [서버 컴퓨터] - 물리 서버
컨테이너 안에서는 운영체제 ‘비슷한 것’이 들어있다
컨테이너 속은 어떤 구조로 돼 있을까?
컨테이너에 넣는다 -> ‘텅 빈 컨테이너 인가?’
- 실제로 텅 빈 컨테이너가 있지만 거의 사용하지 않음
scratch
이미지를 사용하여 생성 가능
- 모든 컨테이너에는 ‘리눅스 운영체제 비슷한 무언가’가 들어있다
- ‘리눅스 운영체제 비슷한 무언가’: ‘운영체제 비슷한 무언가’일 뿐 실제 운영체제는 아님
운영체제가 하는 일은 뭘까?
- 소프트웨어나 프로그램의 명령을 하드웨어에 전달하는 역할
컨테이너
- 도커 엔진 아래에도 리눅스 운영체제가 있는데, 컨테이너 속에 또 리눅스 운영체제(비슷한 것)이 있다. -> 도커의 가장 큰 특징
운영 체제는 ‘커널’이라는 부분과 ‘그 외의 주변 부분’ 으로 구성된다 -> 주변 부분이 프로그램의 연락 내용을 커널이 하드웨어를 다룬다
- 리눅스 커널과 주변부분(?)를 합친 것이 리눅스 배포판이다.
컨테이너-리눅스가 통신하는 과정
도커에서는 컨테이너가 완전히 분리됨
- 컴퓨터의 리눅스 운영체제의 주변 부분이 컨테이너 속 명령를 직접 전달 받을 수 없음
- 컨테이너 속에 리눅스 운영체제의 주변 부분이 들어 있어 프로그램의 명령을 전달받고 이를 리눅스 커널에 전달하는 구조로 구성
- ‘리눅스 운영체제 비슷한 것’이라고 하는 이유: 전체 리눅스 운영체제가 들어있는 것이 아니라 주변 부분만 들어 있기 때문에 ‘비슷한 것’이라고 설명
- 리눅스 운영체제 전체를 커널에 넣으면 되지 않을까 싶겠지만 주변 부분만 컨테이너에 넣고 커널은 운영체제의 빌려 쓰는 덕분에 도커를 쓰는데 ‘가벼움’이라는 강점을 가질 수 있음
도커는 기본적으로 ‘리눅스용’
- 도커는
리눅스 운영체제
에서만 동작- 이유: 도커는 리눅스 운영체제가 동작하는 것을 전제로하는 구조를 가지기 때문
- 따라서, 도커 컨테이너 안에 들어 있는 주변 부분도 리눅스 운영체제의 주변 부분이어야 함
- 컨테이너에서 실행할 소프트웨어는 리눅스용 소프트웨어 - windows나 macOS는 실행 할 수 없음 즉, 도커는 리눅스 컴퓨터에 독립된 격리 환경을 만드는 것이다.
윈도우와 macOS에서 도커 구동하기
위 설명에 따르면 윈도우와 macOS 운영체제를 사용하는 컴퓨터는 도커를 사용할 수 없어야 한다. 이런 경우 VirtualBox나 VMware과 같은 가상 환경 위에 리눅스 운영체제를 설치하로 그 위에서 도커를 실행하거나 운영체제 전용 ‘도커 데스크톱’ 처럼 도커를 실행하는데 필요한 리눅스 운영체제를 포함하는 패키지를 설치해 사용하는 두 가지 방법이 있다.
- 윈도우, macOS에서는 리눅스 운영체제를 끌어들여 도커를 실행함 -> 우리가 도커를 실행하는 환경(macOS)에서는 가상화 소프트웨어를 통해 리눅스 운영체제를 실행해서 사용중인 것!
Section 2) 도커 허브와 이미지, 그리고 컨테이너
이미지
는 컨테이너를 만드는 ‘빵틀’과 같은 것이며,도커 허브
는 인터넷 상에 도커 이미지를 모아놓은 것. 도커의 장점은 도커 허브와 도커 이미지에서 기인하는 바가 크다.
이미지와 컨테이너
- 컨테이너를 생성하기 위해서는 이미지를 만들어야 함
이미지
는 컨테이너를 생성하기 위한 것으로, 컨테이너의 설계도 역할
이미지는 금형과 같다
- 이미지는 이미지 자체로 큰 쓸모가 없다. 이미지는 컨테이너를 만드는 데 사용된다. -> 이미지 하나로 여러 개의 동일한 컨테이너를 생성할 수 있음
- 우리가 실제로 사용하는 것은 컨테이너이며 이미지를 그대로 사용하는 일은 없다.
컨테이너로도 이미지를 만들 수 있다
- 컨테이너로도 이미지를 생성 할 수 있음
- 컨테이너 -> 이미지 생성는 어떤 의미를 가질까? -> 이미지로 생성된 컨테이너를 추가로 수정한 경우 이를 새로운 이미지로 생성하여 이용할 수 있다.
도커 엔진 간에 이동이 가능하다
- 컨테이너로 이미지를 만드는 것이 가능하기 때문에 동일한 컨테이너를 다른 물리 서버에 설치된 도커 엔진으로 컨테이너를 이동시킬 수 있음
- 이는 실제로 컨테이너 자체가 이동한 것은 아니지만 이미지를 통해 컨테이너가 이동한 것과 같은 효과를 얻을 수 있다.
이미지 익스포트
도커 허브와 도커 이미지
- 초보자가 이미지를 밑바닥부터 만들어낼 일은 거의 없다. 그럴 상황은 상당히 특수하며, 대부분 사용할 이미지는
도커 허브
를 통해서 구하게 됨도커 허브
는 공식적으로 운영되는 도커 레지스트리(도커 이미지를 배포하는 서비스)- https://hub.docker.com
- 공개된 컨테이너 이미지가 모여 있는 곳
- 다양한 공개 컨테이너 이미지가 존재하며, 누구든지 등록하고 다운로드 할 수 있음
도커 허브에는 어떤 이미지가 공개되어 있을까?
- 도커 허브에는 다양한 이미지가 제공됨
- 직접 수정하고 싶다면 간단한 이미지, 편리하게 사용하고 싶다면 설정이 완료된 이미지 등 용도에 따라 원하는 것을 선택가능
- 거의 모든 종류의 리눅스가 갖춰져 있음
- 같은 리눅스 배포판에도 여러 버전이 있음
안전한 컨테이너 이미지를 고르는 방법
도커 허브에는 안전하지 않은 이미지가 있을 수 있음
- 공식 이미지를 사용
- 공식 이미지는 도커에서 직접 배포하거나 해당 소프트웨어를 개발 및 관리하는 기업이나 조직에서 제공
- 다만 컨테이너에 포함된 ‘운영체제(비슷한 것)‘이 특정 운영체제 및 버전으로 한정된 경우가 있어 특정 운영체제 및 버전을 사용해야하는 경우엔 주의가 필요
- 커스텀 이미지를 직접 만들어 사용
- 필요한 최소한의 요소가 들어 있는 이미지에 필요한 소프트웨어를 추가로 설치해 커스텀 이미지를 생성하여 사용
- 운영체제만 들어어있는 컨테이너부터 직접 만드는 것은 비추천
다양한 형태로 조합이 가능한 컨테이너
컨테이너는 이미지의 선택 외에도 다양한 조합을 고려해야 한다.
도커를 사용할 때의 원칙
- ‘한 컨테이너에 한 프로그램’: 하나 프로그램만 담긴 컨테이너를 사용한다. - 보안 및 유지 관리 측면에서 유리 예를 들어 워드프레스를 통해 웹서비스를 구성하는데 있어 두가지 방법이 있을 수 있다
- 하나의 컨테이너 안에 워드프레스, MySQL, Apache Web Service을 한번에 구성 -> 유지보수 측면과 도커의 장점을 누리기 어렵기 때문에 비추천
- 각 컨테이너 안에 필요한 소프트웨어를 하나씩 구성 -> 각 소프트웨어가 독립적으로 운영, 사이드 이펙트가 적고 업데이트가 쉬워 유지보수 측면에서 장점, 가벼움
!‘운영체제(비슷한 것)‘을 한 종류로 통일해야 할까?
호스트 컴퓨터와 컨테이너에서 각각 다른 배포판을 사용해도 괜찮을까? -> 호스트 컴퓨터-컨테이너(또는 컨테이너) 간의 배포판이나 버전 차이가 있더라도 문제가 없다. 컨테이너끼리 서로 다른 배포판을 사용할 수 있다는 것이 도커의 매력 중 하나이다.
Section 3) 도커 컨테이너의 생애주기와 데이터 저장
도커 컨테이너의 생애주기를 알아본다. 컨테이너는 ‘오랫동안 아껴 쓰는’ 물건이 아니라 ‘그때그때 쓰고 버리는’ 일회용품에 가깝다. 이 점을 이해해야 컨테이너 기술을 제대로 활용할 수 있다
도커 컨테이너는 ‘쓰고 버리는’ 일회용품
컨테이너의 설명을 듣다 보면 ‘컨테이너의 수명’ 또는 ‘컨테이너의 생애주기’라는 이야기가 반드시 나온다. 그 이유는 컨테이너는 ‘쓰고 버리는’ 일회용품 같은 것이기 때문이다.
- 새로운 버전의 컨테이너가 생기면 기존 컨테이너는 버린다.
- 컨테이너는 일반적으로 여러 개를 동시 가동하는 상황을 전제로 하기 때문에 여러 개의 컨테이너를 하나하나 업데이트하지 않고 기존 컨테이너는 버리고 새로운 이미지를 통해 새로운 컨테이너를 즉시 생성하여 사용한다.
- 컨테이너를 ‘만들고’, ‘실행하고’, ‘폐기한’ 다음, 다시 컨테이너를 ‘만드는’ 일련의 과정을 ‘컨테이너의 생애주기’ 라고 부름
데이터 저장
- 컨테이너를 폐기했다면 컨테이너에 들어있던 데이터는 어떻게 할까?
- 컨테이너를 폐기하면 해당 컨테이너 안에서 편집했던 파일은 당연히 사라진다.
- 파일이 그냥 사라지는 것을 막기 위해서 도커가 설치된 물리적 서버(호스트)의 다른 디스크를 마운트해 이 디스크에 데이트에 저장한다.
마운트
는 ‘디스크를 연결해 데이터를 기록할 수 있도록 한 상태’를 의미함- 이 방식을 통해 컨테이너가 폐기되더라도 데이터는 컨테이너 외부에 안전하게 저장되어 사라지지 않음
- 운영체제나 소프트웨어 부분은 컨테이너 형태로 만들었다가 쓰고 버리는 것을 반복하고, 데이터는 다른 곳에 저장해두고 같은 것을 계속 사용한다.
- 따라서, 컨테이너가 바뀌어도 외부에 저장된 데이터는 그대로 사용할 수 있다.
Section 4) 도커의 장점과 단점
도커의 구조와 성질 및 그 장단점
도커의 성질
'환경을 격리할 수 있음'
ㄴ 독립된 환경
ㄴ (프로그램을)여러 개 띄울 수 있음
ㄴ 똑같은 애플리케이션도 여러 개 띄울 수 있음
ㄴ 이미지를 만들 수 있음
ㄴ 도커 레지스트리(도커 허브)
ㄴ 이미지를 내려받기만하면 됨
ㄴ이미지를 직접 만들지 않아도 됨
ㄴ 교체하기 쉬움
ㄴ 업데이트가 쉬움
ㄴ 소프웨어 교체가 쉬움
ㄴ 이동이 편리함
ㄴ 똑같은 컨테이너를 쉽게 만들 수 있음
ㄴ 환경 이동이 쉬움
ㄴ 개발환경을 배포하기 쉬움
ㄴ 커널이 없음
ㄴ 가벼움
ㄴ 배포판을 바꿀 수 있음
‘환경을 격리할 수 있다’는 것이 핵심
환경을 격리할 수 있는 점이 도커의 핵심
- 독립된 환경
- 이미지를 만들 수 있게됨
- 컨테이너에 ‘커널을 포함시키지 않아도 되는’ 구조
독립된 환경
- 덕분에 여러 개의 컨테이너를 띄울 수 있음
- = 똑같은 애플리케이션도 여러 개 띄울 수 있음
- 그 중 일부를 교체하거나 수정할 수도 있음
- 덕분에 여러 개의 컨테이너를 띄울 수 있음
이미지를 만들 수 있음
- 만들어진 이미지는 ‘도커 허브’를 통해 배포 가능
- 배포된 모든 이미지는 다운로드만 받으면 쉽게 수정, 설치 가능
- 이동성이 좋음
컨테이너에 ‘커널을 포함시킬 필요가 없음’
- 컨테이너에는 커널(운영체제의 핵심이 되는 부분)을 포함시킬 필요가 없으므로 가벼움
- 배포판을 원하는 것으로 사용할 수 있음
도커의 장점과 단점
도커의 장점은 ‘여러 개’, ‘이동성’, ‘생성’, ‘보안’이라는 키워드로 나타낼 수 있다.
도커의 장점
1) 한 대의 물리 서버에 여러 대의 서버를 띄울 수 있다
- 한 대의 물리 서버에서 여러 가지 기능을 안전한 상태로 띄울 수 있음
- 도커는 격리된 환경을 통해 각각 안전한 상태로 실행하며, 일반적인 서버에서는 함께 실행할 수 없는 조합도 가능함
2) 서버 관리가 용이하다
- 컨테이너를 이용해 각 소프트웨어를 독립된 환경에 격리하므로 다른 소프트웨어에 영향을 끼치지 않음
- 각 소프트웨어의 업데이트가 쉬움
- 컨테이너 교체나 수정이 쉬움
- 환경 이전이 간단함
- 생성 및 폐기가 간단하므로 초기 설정에 따르는 시간과 수고를 들일 필요가 없음
- 컨테이너를 수정하고 업데이트된 이미지를 통해 컨테이너를 대량으로 생성 가능함
3) 서버 고수가 아니어도 다루기 쉽다
- 명령어 한 줄로 서버 구축이 가능
도커의 단점
- 리눅스 운영체제를 사용하기 때문에 리눅스용 소프트웨어만 지원
- 물리 서버 한 대에 여러 대의 서버를 띄우는 형태이므로 호스트 서버에 문제가 생기면 모든 컨테이너에 영향이 미침
- 하나의 물리 서버에 하나의 기능을 띄우는 상태와 비교하면 물리 서버에 문제가 생겼을 때 영향이 미치는 범위가 커짐 -> 물리 서버의 이상에 대해 확실한 대책 필요
- 컨테이너 하나를 장기간에 걸쳐 사용하는 경우 그리 큰 장점을 가지기 어려움
- 도커 엔진을 구동해야하는데, 컨테이너를 하나밖에 사용하지 않는다면 도커 엔진이 단순한 오버헤드에 지나지 않음
도커의 주 용도
팀원 모두에게 동일한 개발환경 제공하기(=동일한 환경을 여러 개 만들기)
- 이미지를 통해 동일한 개발환경을 쉽게 제공/배포 가능
- 개발환경-운영환경 간의 차이가 근본적으로 사라짐
새로운 버전의 테스트(=격리된 환경을 이용)
- 운영체제나 라이브러리 등의 새로운 버전을 먼저 개발환경에서 테스트한 후 운영환경에 적용하기 용이함
동일한 서버가 여러 대 필요한 경우(=컨테이너 밖과 독립된 성질을 이용)
- 동일한 서버가 여러 대 필요한 경우에도 컨테이너를 이용 -> 한 대의 물리 서버에 똑같은 서버를 여러개 만들 수 있음
- 명령어 한줄이면 서버를 필요한 만큰 띄울 수 있음
- 스케일링에 유리함