스터디/Tech

[Docker] 도커란?

_leezoee_ 2023. 2. 26. 17:20

머신러닝 파이프라인 실무 과정에서 쿠베플로우를 사용해 파이프라인을 만드는데 이때 꼭 필요한 베이스 테크기술이 도커기 때문에 따로 블로그 포스팅을 준비했다.

 

Docker : 애플리케이션을 개발, 제공, 실행하기위한 개방형 플랫폼

 

Docker를 사용하면 애플리케이션을 인프라에서 분리할 수 있다는 장점이 있다.

애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리 하는 것.

코드를 신속하게 전달하고 테스트 및 배포가 가능하며 코드 작성과 프로덕션 실행 사이의 지연을 크게 줄일 수 있다.

 


<Docker 플랫폼>

 

Docker 컨테이너는 느슨하게 격리 된 환경에서 애플리케이션을 패키징하고 실행할 수 있는 기능을 제공한다.

격리 및 보안을 통해 주어진 호스트에서 여러 컨테이너를 동시에 실행 할 수 있다.

컨테이너는 가볍고 애플리케이션을 실행하는데 필요한 모든 것이 포함되어 있으므로 현재 호스트에 설치된 로컬에 의존 할 필요가 없다.

컨테이너를 모든 작업자와 쉽게 공유할 수 있으며, 공유자는 동일한 방식으로 작동하는 동일한 컨테이너를 가진다.

 

Docker는 컨테이너의 수명주기를 관리하기 위한 도구와 플랫폼을 제공.

- 컨테이너를 사용해 애플리케이션 지원 및 지원 구성 요소를 개발.

- 컨테이너는 애플리케이션을 배포하고 테스트하는 단위.

- 준비가 되면 애플리케이션을 컨테이너 또는 오케스트레이션(컴퓨터 시스템과 애플리케이션, 서비스의 자동화된 구성, 관리, 조정을 의미) 된 서비스로 프로덕션 환경에 배포.

 


<Docker 사용처>

 

Docker는 개발자가 애플리케이션과 서비스를 제공하는 로컬 컨테이너를 사용해 표준화 된 환경에서 작업할 수 있도록 함으로써 개발 수명주기를 간소화.

컨테이너는 지속적 통합 및 지속적 배포(CI/CD) 워크플로우에 적합.

 

- 개발자 로컬에서 코드를 작성, Docker 컨테이너를 사용해 동료와 작업 공유.

- Docker를 사용해 애플리케이션을 테스트 환경으로 푸시, 자동 혹은 수동 테스트를 진행.

- 개발자가 개발 환경에서 버그를 수정하고 테스트 및 검증을 위해 테스트 환경에 재배포.

- 테스트가 완료되면 업데이트 된 이미지를 프로덕션 환경에 푸시하듯이 고객에게 수정사항을 제공.

 

 


 

<Docker 아키텍쳐>

 

클라이언트-서버 아키텍쳐 사용.

Docker 클라이언트는 Docker 컨테이너를 빌드, 실행, 배포하는 무거운 작업을 수행하는 Docker 데몬과 통신.

Docker 클라이언트와 데몬은 동일한 시스템에서 실행되거나 Docker  클라이언트를 원격 Docker 데몬에 연결할 수 있음.

 

Docker 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해 REST API를 사용해 통신.

(

유닉스 소켓의 풀네임은 Unix Domain Socket. 머신 내부의 프로세스들끼리 통신만을 위해 사용되는 양방향 통신 소켓.

 = IPC(Inter process communication) Socket 

  • SOCKET_STREAM : TCP와 비교되는 타입. stream 위주의 소켓.
  • SOCKET_DGRAM : UDP와 비교되는 타입. datagram 위주의 소켓.

SOCKET_SEQPACKET : SCTP와 비교되는 타입.

)

또 다른 Docker 클라이언트는 Docker Compose로 컨테이너 세트로 구성된 애플리케이션으로 작업 할 수 있음.

 

docker architecture

 

 

<Docker 데몬>

 

:  Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리. 

데몬은 다른 데몬과 통신하여 Docker 서비스를 관리할 수 있음.

 

<Docker 클라이언트>

: docker run 같은 명령어를 사용하면 클라이언트가 명령을 dockerd에 전송해 실행.

이러한 docker 명령은 Docker API를 사용.

Docker 클라이언트는 둘 이상의 데몬과 통신할 수 있음.

 

 


 

 

<Docker 레지스트리>

Docker 이미지를 저장. Docker Hub는 누구나 사용할 수 있는 공용 레지스트리이며 Docker는 기본적으로 Docker Hub에서 이미지를 찾도록 구성됨 (개인 레지스트리를 실행할 수도 있음)

 

docker pull , docker run  명령을 사용하면 구성된 레지스트리에서 필수 이미지를 가져옴.

docker push 명령을 사용하면 이미지가 구성된 레지스트리로 푸시.

 

 


 

<Docker 객체>

Docker를 사용하면 이미지, 컨테이너, 네트워크, 볼륨, 플러그인 및 기타 객체를 생성/사용

docker build를 하면 이미지가 생성(정적인 파일)

컨테이너는 이미지를 실행하면 생김

 

① Image

: 도커 컨테이너를 만들기 위한 읽기전용 템플릿. from 이라는 명령어로 시작해 다른 이미지를 상속받아 추가 정의와 함꼐 사용하는 경우가 있음. 

고유한 이미지를 빌드하려면 이미지를 만들고 실행하는데 필요한 단계를 정의하는 간단한 구문으로 Dockerfile을 만듦.

 

②Container

: 컨테이너는 이미지의 실행가능한 인스턴스. 

Docker API, CLI를 통해 컨테이너를 생성, 시작, 중지, 이동, 삭제 할 수 있음.

컨테이너를 하나 이상의 네트워크에 연결하거나 스토리지를 연결하거나 현재 상태를 기반으로 새 이미지로 만들 수 있음.

(OOP 관점으로 class가 이미지, 인스턴스가 컨테이너라고 볼 수 있음)

 


<Docker 명령>

$docker run -i -t ubuntu/bin/bash

위의 명령 실행 시 

1. ubuntu 로컬에 이미지가 없는 경우 Docker는 docker pull ubuntu 수동실행과 마찬가지로 구성된 레지스트리에서 이미지를 가져옴.

2. Docker는 docker container create 명령을 수동으로 실행 한 것처럼 새 컨테이너를 만듦.

3. Docker는 읽기 쓰기 파일 시스템을 최종 레이어로 컨테이너에 할당. 이를 통해 실행중인 컨테이너는 로컬 파일 시스템에서 파일과 디렉토리를 만들거나 수정할 수 있음.

4. Docker 기본 네트워크 옵션으로 인터페이스를 만듦. 

5. Docker는 컨테이너를 시작하고 /bin/bash 컨테이너가 대화형으로 실행되고 터미널에 연결되어있기 때문에(-i, -t 플래그) 출력이 터미널에 기록되는 동안 키보드를 사용해 입력을 제공 할 수 있음.

 

 

도커 공식 깃허브 참조.

https://github.com/collabnix/dockerlabs

 

GitHub - collabnix/dockerlabs: Docker - Beginners | Intermediate | Advanced

Docker - Beginners | Intermediate | Advanced. Contribute to collabnix/dockerlabs development by creating an account on GitHub.

github.com