Container
Container란 application을 동작시키는 데에 필요한 환경이 있는 독립된 공간
- 기존: Hypervisor 위에 각각의 VM을 두고 그 안에서 앱을 실행
- Docker : OS위에 Container engine (docker)을 두고, 그 위에 container를 동작시킴
-> 확장성 good, 배포 쉬워짐
리눅스에서 돌리는 이유
- 리눅스에 있는 chroot(독립된 공간 형성), namespace(isolate 기능), cgroup(필요한 만큼 HW 지원)과 같은 기능을 기반으로 container를 만들었기 때문 (기반기술이 리눅스 커널)
- Container를 리눅스 커널에서 돌릴 수 있게 해주는 것이 container engine
- 리눅스 커널이 없는 윈도우즈, 맥os에서는 hypervisor 활성화 필요
도커
- 쓰는 이유
환경 제약없이 어디서든 돌아감
scale in/out 쉬움. MSA, DevOps에 적합
- 도커 호스트?
도커 데몬 (dockerd)이 동작하고 있는 시스템
컨테이너를 실행할 수 있음
- 도커 클라이언트?
도커 클라이언트 커맨드를 통해 도커 데몬에게 요청
- 도커 허브
컨테이너 이미지들이 저장되어있는 저장소
docker.com에서 기본 제공하는 것도 있으나, 기업에서는 보통 도커 허브를 자체 운영 (외부 노출 X)
Container / Container image
- 컨테이너는 하나의 application 프로세스
- 컨테이너 간에는 완전히 독립적임 (cpu, memory, network, disk 같은 HW 자원도)
- Container image : base image layer - source image layer - 앱 실행 방법을 모아둔 것
base image layer : 실행에 필요한 환경
source image layer : 실행할 대상
앱 실행 방법 : 어떻게 실행할지 명령어 같은 거
- Container : 도커 호스트 위에서 container image대로 동작중인 프로세스
저장되어있는 것은 container image (read only)
실행중인 프로세스가 container (r,w 가능)
Container 동작 방식
- docker hub에 수많은 컨테이너 이미지가 있음
- search 명령어로 찾아서, pull 명령어로 해당 이미지를 도커 호스트로 가져옴
- run / create / start 등의 명령어로 실행함
Container 만들기
- Dockerfile로 컨테이너를 빌드함
- Dockerfile은 top-down으로 실행됨
- Dockerfile 생성 후, docker build 명령어로 이미지 만들기
- docker push 명령어로 이미지 배포 가능
- 명령어들은 필요할 때 찾아보기 (hub.docker.com에 있는 도커파일 보면 좋음)
Container 사용법
- search, pull 등의 명령어로 이미지를 다운받기
- create : 이미지를 컨테이너화함 (컨테이너 생성만)
- start : 컨테이너를 실행함
- ps : 현재 컨테이너들의 상태를 확인 (목록)
- inspect : 실행 중인 컨테이너를 자세히 봄 (이미지에도 사용할 수 있음)
- run : pull -> create -> start 한번에 함
- stop : 컨테이너 중지
- rm : 컨테이너 삭제
Container 관리
- 기본적으로 컨테이너는 호스트 HW 리소스 사용 제한 받지 않음
- 컨테이너가 필요로 하는 만큼의 리소스만 할당해야함
- Docker command를 통해 제한할 수 있는 리소스는 cpu, memory, disk i/o
- docker run 명령어에 옵션을 줘서 리소스를 제한할 수 있음