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) 서버 고수가 아니어도 다루기 쉽다
- 명령어 한 줄로 서버 구축이 가능
도커의 단점
- 리눅스 운영체제를 사용하기 때문에 리눅스용 소프트웨어만 지원
- 물리 서버 한 대에 여러 대의 서버를 띄우는 형태이므로 호스트 서버에 문제가 생기면 모든 컨테이너에 영향이 미침
- 하나의 물리 서버에 하나의 기능을 띄우는 상태와 비교하면 물리 서버에 문제가 생겼을 때 영향이 미치는 범위가 커짐 -> 물리 서버의 이상에 대해 확실한 대책 필요
- 컨테이너 하나를 장기간에 걸쳐 사용하는 경우 그리 큰 장점을 가지기 어려움
- 도커 엔진을 구동해야하는데, 컨테이너를 하나밖에 사용하지 않는다면 도커 엔진이 단순한 오버헤드에 지나지 않음
도커의 주 용도
팀원 모두에게 동일한 개발환경 제공하기(=동일한 환경을 여러 개 만들기)
- 이미지를 통해 동일한 개발환경을 쉽게 제공/배포 가능
- 개발환경-운영환경 간의 차이가 근본적으로 사라짐
새로운 버전의 테스트(=격리된 환경을 이용)
- 운영체제나 라이브러리 등의 새로운 버전을 먼저 개발환경에서 테스트한 후 운영환경에 적용하기 용이함
동일한 서버가 여러 대 필요한 경우(=컨테이너 밖과 독립된 성질을 이용)
- 동일한 서버가 여러 대 필요한 경우에도 컨테이너를 이용 -> 한 대의 물리 서버에 똑같은 서버를 여러개 만들 수 있음
- 명령어 한줄이면 서버를 필요한 만큰 띄울 수 있음
- 스케일링에 유리함