docker 기본 개념

LeeKyoungChang·2023년 1월 16일
1
post-thumbnail

docker, jenkins 실행 목록

 

📚 1. Docker 사전 지식

  • Kernal : 시스템을 제어하기 위한, 운영체제의 핵심적인 프로그램
  • container : 도커라는 서비스 위에서 운영되고 있는 가상의 독립된 공간(별도의 격리된 네트워크, 리소스를 사용할 수 있다.)
  • port : IP에서 네트워크 간 애플리케이션을 구분하기 위한 번호
    • 이론상 0 ~ 65535까지 지정할 수 있으며, 보통 0~2048까지는 시스템에서 예약되어 있다.

 

✔ Docker와 Virtual Machine(가상머신)과의 차이

image

(1) Docker

  • Host의 OS가 Linux Kernel을 가지고 있다면, 컨테이너에서도 Host의 커널을 그대로 사용한다.
  • Host의 OS가 Window/macOS라면, Docker에서 별도의 Linux Kernel을 가상화하여 그 위에 컨테이너를 올려 사용한다.
  • 각 컨테이너는 격리된 공간에서 서비스를 운영할 수 있다.
  • 컨테이너에 대한 이미지를 만들어 사용할 수 있다.
  • 컨테이너에 대한 유지/보수/관리가 유용하다.

 

(2) Virtual Machine

  • Host의 OS와는 별개로, 그 위에 가상화된 OS를 운영한다.
  • 가상화된 OS 위에 서비스를 별도로 구축해야 하기 때문에 중복되는 리소스를 낭비하게 된다.
  • 각 서비스별로 OS를 통째로 운영해야 하기 때문에 비효율적이며, 가상화된 OS를 하나로 사용하게 되면 서비스별로 보안 문제가 발생하기 쉽다. (보안성 측면에서 효율적이다.)

 

 

📚 2. Docker 기본 개념

📖 A. docker란?

  • 부두(항만) 노동자, 컨테이너 기반의 오픈소스 가상화 플랫폼
  • Immutable Infrastructure Paradigm 이라는 개념을 기반으로 한다.
  • 서비스 환경(서비스 인프라) 부분을 이미지화(실행 파일화)하여 배포한 뒤 가급적 변경하지 않고 사용한다. (서비스 환경 업데이트 : 이미지를 교체하는 식으로 이루어진다.)
  • 도커를 이용하여 각종 Application들을 어떤 환경에서도 자유롭게 사용할 수 있다.

=> 하나의 HostOS(Host Operating System) 위에 Docker를 설치하여 그 위에 각각의 서비스(Application) 환경들을 설치/운영하는 형태이다.

 

📖 B. 컨테이너란?

  • 플랫폼에 상관없이 Application을 실행할 수 있는 기술
  • 프로세스 단위의 분리 독립된 환경(공간)안의 가상공간
  • 이미지를 실행한 상태, 응용 프로그램의 종속성과 함께 응용프로그램 자체를 패키징 or 캡슐화하여 격리된 공간에서(독립된 환경안의 가상공간) 프로세스를 동작시키는 기술

 

✔ 컨테이너 실행, 수정, 종료 등

  • 컨테이너는 이미지 Layer에 읽기/쓰기(read-write) Layer를 추가하는 것로 생성/실행된다.
  • 컨테이너는 종료되었다고 메모리에서 삭제되지 않고 남아있다. 삭제하려면 명시적으로 삭제해야 한다.
  • 컨테이너를 삭제했다는 것은 컨테이너에서 생성한 파일이 사라진다는 것 (DB에서 그동안 쌓였던 데이터가 모두 사라진다는 뜻과 동일하다.)
  • 컨테이너는 각각 독립적으로 실행된다.
  • 컨테이너는 커널 공간과 호스트 OS 자원(시스템 콜)을 공유한다.

 

 

📖 C. Docker Image(이미지)란?

  • 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태
  • 특정 프로세스를 실행하기 위한 모든 파일과 설정값을 지닌 것으로, 더 이상의 의존성 파일을 컴파일하거나 이것저것 설치할 필요가 없는 상태의 파일
  • ex) Ubuntu 이미지는 Ubuntu를 실행하기 위한 모든 파일을 가지고 있으며, Oracle이미지는 Oracle을 실행하는데 필요한 파일과 실행 명령어, port 정보를 모두 가지고 있다.

 

 

📖 D. 레이어

  • 기존 이미지에 추가적인 파일이 필요할 때 다시 다운로드받는 방법이 아닌 해당 파일을 추가하기 위한 개념

  • 이미지와 레이어는 같은 의미로도 사용된다.

  • DockerHub 및 개인 저장소에서 이미지를 공유할 때는 바뀐 부분(Layer = image)만 주고받기 가능하다.

 

💡 참고
플랫폼 : 서비스에서 플랫폼은 다른 서비스들이 나의 서비스 기능을 쉽게 사용할 수 있게 해주는 인터넷 기반의 기술 환경

 

 

📖 E. docker image와 container 어떤거지?

위에서 설명을 적기는 했는데 실제 프로젝트를 개발하다 보니, 두 개의 차이점을 잘 모르겠다.

한 줄로 표현하면

✔️ docker image(이미지)
docker에서 서비스 운영에 필요한 서버 프로그램, 소스코드 및 라이브러리, 컴파일된 실행 파일을 묶는 형태

ex) 요리사는 음식 준비를 완료 했다.

 

✔️ docker container(그릇)
docker image를 실행한 상태, 격리된 공간에서 프로세스를 동작시키는 기술이다. (프로세스 : 실행 중인 프로그램)

ex) 준비된 음식을 먹는다.

 

 

📚 3. Ubuntu에 Docker 엔진 설치

docker 공식문서

✔ 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 설치 완료

=> 실행 성공

 

 

📚 4. docker 동작 구조

📖 A. docker container에서 docker image build

docker란

 

📖 B.. docker client와 docker server

✔️ 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

스크린샷 2023-01-21 오후 5 26 48

 

/var/run/docker.sock

스크린샷 2023-01-21 오후 5 27 56

(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 운영체제에서 부팅 시 자동으로 켜져, 백그라운드에서 계속 실행되는 프로세스

 

 

📚 5. docker commit, docker build

둘 다 image를 만드는 명령어이다.

📖 A. docker commit

commit : 사용하고 있는 container를 image를 만드는 (backup과 같은 느낌)

생활 코딩 강의 참고

스크린샷 2023-01-23 오후 4 41 26

 

 

📖 B. docker build

build : dockerfile을 통해서(개발자가 원하는 속성을 추가한 후) 해당 image를 만들 수 있다. 예를들면, 개발자가 원하는 시간의 순서에 따라 image를 만들 수 있다. (생성)

스크린샷 2023-01-23 오후 5 21 37

 

 


참고

profile
"야, (오류 만났어?) 너두 (해결) 할 수 있어"

0개의 댓글