왜 도커를 리눅스에서 돌려요 ?
리눅스 커널의 기능들인 chroot, namespace, cgroup을 가지고 컨테이너를 생성하기 때문.
chroot : 독립된 공간 형성
namespace : isolate 기능 지원
cgroup : 필요한만큼 HW 지원
컨테이너 기반 기술 → 리눅스 커널
리눅스 커널이 없으면 컨테이너를 돌릴 수 없다.
window,mac os는요 ? → hypervisor를 활성화시켜서 그 위에 컨테이너를 돌리는 것 !!!
컨테이너? 컨테이너 이미지?
컨테이너
- 컨테이너는 하나의 Application 프로세스 → 각 컨테이너는 독립적으로 운영된다. 간단히 말해서 컨테이너는 앱의 각 구성 요소에 대해 격리(Isolation)된 프로세스이다.
- 각 컨테이너는 호스트 시스템에 사전 설치된 종속성에 의존하지 않고 작동하는 데 필요한 모든 것이 존재한다.
- 독립적으로 관리되며 하나의 컨테이너를 삭제해도 다른 컨테이너는 영향을 받지 않는다.
- 확장성이 좋고, 배포에 용이하다.
- 어떤 환경에서도 동일한 방식으로 작동된다.
컨테이너 이미지
- 도커 이미지는 일련의 레이어로 구성된다. 새 컨테이너를 생성할 때 기본 레이어 위에 쓰기 가능한 새 레이어를 추가한다. 이 레이어를 컨테이너 레이어라고 부른다.
- 새 파일 쓰기, 기존 파일 수정, 삭제 등 실행 중인 컨테이너에 대한 모든 변경 사항은 쓰기 가능한 이 얇은 컨테이너 계층이 기록된다.
- 도커에서 이미지를 빌드할 때 기존 이미지에서 변경된 부분이 있다면, 바뀐 부분만 새로 이미지 레이어를 생성하게 되며 컨테이너에서 실행할 때 베이스 이미지 레이어와 바뀐 레이어를 합쳐서 실행한다.
- 즉, 도커는 이미지를 레이어 단위로 관리하며 밑에서부터 위로 최신 변경 사항들이 레이어로 쌓이게 된다. (like stack)
- 각각의 레이어를 재사용하여 이미지를 효과적으로 빌드하도록 설계되어 있다.
요약
- 도커 호스트에서 도커 데몬 동작 중
- 컨테이너 이미지(Read Only)는 하드디스크에 하나의 파일 형태로 저장, 각 레이어별로 파일이 각각 존재
- 실행 → 메모리에 하나의 애플리케이션 프로세스로 실행 중 → 컨테이너라고 부름
- 컨테이너화되면 그제서야 W/R 이 가능
- 도커 호스트 입장에선 컨테이너는 하나의 프로세스, 컨테이너 이미지는 파일이다.
컨테이너 및 레이어
컨테이너와 이미지의 주요 차이점은 쓰기 가능한 최상위 레이어이다. 새로운 데이터를 추가하거나 기존의 데이터를 수정하는 컨테이너에 대한 모든 쓰기는 이 쓰기 가능한 레이어에 저장된다. 컨테이너가 삭제되면 쓰기 가능한 레이어(최상위 레이어)도 삭제된다. 기본 이미지는 변경되지 않은 상태로 유지된다.
각 컨테이너에는 쓰기 가능한 자체 컨테이너 레이어가 있고 모든 변경 사항이 이 컨테이너 레이어에 저장되므로 여러 컨테이너가 동일한 기본 이미지에 대한 액세스를 공유하면서도 자체 데이터 상태를 가질 수 있다. 아래 다이어그램은 동일한 Ubuntu 15.04 이미지를 공유하는 여러 컨테이너를 보여준다.
간단한 실습
1. 설치한 docker version 확인하기
2. window의 경우, hub.docker.com 로그인을 수행 필수
3. docker hub로부터 nginx 다운로드 테스트
4. 다운로드받은 docker image 확인
5. 실행 : docker run -d -p 80:80 —name web nginx
6. 실행 중인 nginx 확인
- WSL
- Docker Desktop
7. 실습 완료 후 nginx 제거
참고 자료