격리된 공간에서 프로세스가 동작하는 기술이다.
다양한 프로그램, 실행 환경을 컨테이너로 추상화하고 동일한 인터페이스를 제공하여 프로그램의 배포 및 관리를 단순하게 해준다.
컨테이너는 가상 머신이 아니다.
컨테이너 관리 서비스로 agile 기반 프로젝트 수행에 용이하다.
도커는 가상화를 위해서 사용하며 기본적으로 가상 머신처럼 사용한다.
즉, 도커를 사용하면 환경 설정에 용이하다.
docker file을 이용하여 이미지 생성
docker file 은 Dockerfile
이라는 이름으로 생성한다.
FROM → ex. FROM ubuntu:version
-> FROM절에 있는 것을 상속 받아서 쓴다고 보면 된다.(= Base image)
-> version 대신 latest를 쓸 수도 있지만 latest라는 것은 상대적인 개념이기 때문에 쓰지 않는 것이 좋다.
-> : 뒤에 버전명이 적히지 않는다면 latest를 가져다가 쓴다.
MAINTAINER : 이미지 관리자 명시 - email ID 작성
RUN 실행 명령어 : 이미지와는 다른 것을 실행시키고자 할 때 사용
-> 작성된 명령어를 수행하면서 이미지가 변경될 수 있다.
COPY : 파일을 이미지에 추가
CMD, ENTRYPOINT
docker file은 base image와 다른 추가적인 파일들을 이용하여 이미지를 생성해낸다.
docker file로부터 도커 이미지 생성 👇
$> docker build [-t] [ImageName:TagName] [dir]
Docker file을 수정하여 이미지를 재생성할 경우, docker는 변화를 추적하여 동일한 부분은 재사용하기 때문에 경량적으로 사용할 수 있다.
생성한 이미지는 docker registry에 옮겨 놓고 사용하고 싶을 때 가져다가 쓰면 된다.
registry는 docker를 사용할 수 있도록 하기 위한 외부 저장소를 의미한다.
AWS에서는 ECR(Elastic Container Registry)라는 registry 서비스를 별도로 제공한다.
$> docker run image이름
# + 환경 변수(설정)
# + 파일 (= volume mount)
# + 네트워크 관리 -> ex. docker 설정을 통해 컴퓨터에서 해당 net으로 접근시 docker 실행
기본적인 명령어는 위와 같고, 추가적인 환경 설정을 원한다면 option으로 달아서 명령어를 실행하면 된다.
Docker를 실행시키고 종료할 때 저장된 정보가 날아가는 경우가 발생할 수 있는데, 이를 방지하기 위해서 영구적인 저장소를 mapping 해두고 사용하면 데이터가 보관되는 것처럼 동작이 가능하다.
Docker 명령어👇
$> docker ps #docker로 존재하는 container들을 확인 가능
$> docker top ContainerID #해당 container 내의 top process 확인
$> docker rm ContainerID #삭제
$> docker stats ContainerID #통계 확인
$> docker stop ContainerID #종료
$> docker pause ContainerID #정지
$> docker unpause ContainerID #재시작
$> docker kill ContainerID #강제 종료
도커를 이용하여 서비스를 제공하는 방법은
등이 존재한다.
이 중 쿠버네티스는 컨테이너 오케스트레이션 서비스로 컨테이너를 편하게 관리할 수 있도록 한다.
컴퓨팅 자원을 쓰는 것들로 컴퓨터라고 보면 된다.
도커 컨테이너가 돌아가는 곳으로 한 개 이상의 컨테이너로 구성되어있다.
사용할 pod에 대한 설정이 작성된다. (= pod 생성을 위한 설계도)
deployment를 이용해서 pod를 생성하면 생성 및 관리가 편리하다.
deployment를 통해 생성된 pod에는 label이 달리게 되고, 이 label 별로 pod가 관리되게 된다.
label로 구성된 것들을 하나의 그룹으로 관리하여 로드 밸런싱을 진행해준다.
네트워크의 접근 제어를 가능하도록 한다.
Service만 존재할 경우, 내부에서의 접근만이 가능하다.
외부에서 들어오는 접근을 처리해준다.
Service를 이용해서 외부 노출이 되도록할 수 있으나 관리하기가 힘들고 private한 network를 만드는 것에 어려움이 있기 때문에 ingress를 사용하는 것이 좋다.