Kernal
: 시스템을 제어하기 위한, 운영체제의 핵심적인 프로그램container
: 도커라는 서비스 위에서 운영되고 있는 가상의 독립된 공간(별도의 격리된 네트워크, 리소스를 사용할 수 있다.)port
: IP에서 네트워크 간 애플리케이션을 구분하기 위한 번호
✔ Docker와 Virtual Machine(가상머신)과의 차이
(1) Docker
(2) Virtual Machine
Immutable Infrastructure Paradigm
이라는 개념을 기반으로 한다.=> 하나의 HostOS(Host Operating System) 위에 Docker를 설치하여 그 위에 각각의 서비스(Application) 환경들을 설치/운영하는 형태이다.
✔ 컨테이너 실행, 수정, 종료 등
기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌 해당 파일을 추가하기 위한 개념
이미지와 레이어는 같은 의미로도 사용된다.
DockerHub 및 개인 저장소에서 이미지를 공유할 때는 바뀐 부분(Layer = image)만 주고받기 가능하다.
💡 참고
플랫폼 : 서비스에서 플랫폼은 다른 서비스들이 나의 서비스 기능을 쉽게 사용할 수 있게 해주는 인터넷 기반의 기술 환경
위에서 설명을 적기는 했는데 실제 프로젝트를 개발하다 보니, 두 개의 차이점을 잘 모르겠다.
한 줄로 표현하면
✔️ docker image(이미지)
docker에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태
ex) 요리사는 음식 준비를 완료 했다.
✔️ docker container(그릇)
docker image를 실행한 상태, 격리된 공간에서 프로세스를 동작시키는 기술이다. (프로세스 : 실행 중인 프로그램)
ex) 준비된 음식을 먹는다.
✔ docker 이전 버전 제거
$ sudo apt-get remove docker docker-engine docker.io containerd runc
✔ 패키지 업데이트 및 apt 패키지 설치
$ sudo apt-get update
$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
✔ Docker의 공식 GPG 키를 추가
$ sudo mkdir -p /etc/apt/keyrings
$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
✔ 리포지토리 설정
$ echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
✔ docker 엔진 설치
$ sudo apt-get update
✔ docker 최신 버전 설치
$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
✔ hello-world
이미지를 실행하여 Docker 엔진 설치가 성공했는지 확인
$ sudo docker run hello-world
=> 실행 성공
✔️ docker server에서는?
docker server
: 컨테이너를 생성하고 실행하며 이미지를 관리하는 주체 -> docker 프로세서로 동작한다.
docker engine
: 외부에서 API 입력을 받아 docker 엔진의 기능을 수행한다.
docker daemon
: docker process가 실행되어 서버로서 입력을 받을 준비가 된 상태
✔️ docker client에서는?
docker daemon
은 API 입력을 받아 docker engine
의 기능을 수행한다.
이 API를 사용할 수 있도록 docker client는 CLI를 제공한다.
✔️ 사용자 입장에서 보면?
(1) 사용자가 docker로 시작하는 명령어를 입력한다? => docker client를 사용하는 것!
(2) docker client -> docker daemon
: 입력된 명령어를 local에 존재하는 docker daemon에게 전달
(3) docker client는 /var/run/docker.sock
에 위치한 유닉스 소켓을 통해 docker daemon의 api를 호출
(4) docker client가 사용하는 unix socket은 같은 host 내에 있는 docker daemon에게 명령을 전달할 때 사용된다. (tcp로 원격으로 docker daemon을 제어하는 방법도 있다.)
✔️ 사용자가 terminal에서 docker가 설치된 host에 접속하여 docker 명령어를 입력할 시 동작 구조 (docker 제어)
(1) 사용자가 docker ps와 같은 docker 명령어를 입력한다.
(2) /usr/bin/docker
는 /var/run/docker.sock
유닉스 소켓을 사용해 docker daemon
에게 명령어를 전달!
/usr/bin/docker
/var/run/docker.sock
(3) docker daemon
은 이 명령어를 parsing하고 명령어에 해당하는 작업 수행
(4) 수행 결과를 docker client에 반환, 사용자에게 결과를 출력한다.
=> 이 과정은 아무런 설정을 하지 않았을 때, docker daemon
을 제어하는 순서, 각종 옵션을 추가해 실행한다면 위 순서에서 별도의 과정이 포함될 수 있다.
💡 참고
✔️ 프로세스란?
- 실행중에 있는 프로그램
- 프로세스 내부에는 최소 하나의 스레드를 가지고 있다. 스레드 단위로 스케줄링을 한다.
- 프로세스 메모리 구조 :
code <-> data -> heap <-> stack
✔️ docker.sock 이란?
파일 위치 :
/var/run/docker.sock
docker daemon
(프로세스)와 통신하기 위해 사용한다.Docker API의 진입점
왜 사용하는가? Docker CLI에 의해 docker command를 실행하기 위해 사용한다!
✔️ daemon이란?
- unix 운영체제에서 부팅 시 자동으로 켜져, 백그라운드에서 계속 실행되는 프로세스
둘 다 image를 만드는 명령어이다.
commit
: 사용하고 있는 container를 image를 만드는 (backup과 같은 느낌)
build
: dockerfile을 통해서(개발자가 원하는 속성을 추가한 후) 해당 image를 만들 수 있다. 예를들면, 개발자가 원하는 시간의 순서에 따라 image를 만들 수 있다. (생성)
참고