Docker
❤️ 머신러닝 엔지니어 실무(인프런) 강의, Docker Document 를 참고해 작성하였습니다.
Docker
What is Docker?
애플리케이션을 개발, 제공, 실행하기 위한 개방형 플랫폼.
Docker을 사용하면 애플리케이션을 인프라에서 분리할 수 있으므로 소프트웨어를 빠르게 제공할 수 있다.
또한, 애플리케이션을 관리하는 것과 동일한 방식으로 인프라를 관리할 수 있다.
코드를 신속하게 전달, 테스트 및 배포하기 위한 Docker의 방법론을 활용하면 코드 작성 프로덕션 실행 사이의 지연을 줄일 수 있다.
- 서버 운영체제에 따라 설치가 안되는 라이브러리가 있을 수 있다. (로컬 -> 리눅스)
- Docker은 컨테이너라고 하는 격리된 환경에서 애플리케이션을 패키징하고 실행할 수 있는 기능을 제공.
- 격리 및 보안을 통해 주어진 호스트에서 여러 컨테이너를 동시에 실행할 수 있음.
- 컨테이너는 가볍고 애플리케이션을 실행하는 데 모든 것이 포함되어 있으므로 현재 호스트에 설치된 항목에 의존할 필요가 없음
- 작업하는 동안 컨테이너를 쉽게 공유할 수 있으며 공유하는 모든 사람이 동일한 방식으로 작동하는 동일한 컨테이너를 갖게 됨.
Docker Architecture
- Docker은 클라이언트-서버 아키텍쳐를 사용.
- 클라이언트는 Docker 컨테이너를 빌드, 실행 및 배포하는 Docker 데몬과 통신.
- 클라이언트와 데몬은 동일한 시스템에서 실행되거나 Docker 클라이언트를 원격 Docker 데몬에 연결할 수 있다.
- 클라이언트와 데몬은 UNIX 소켓 또는 네트워크 인터페이스를 통해
REST API
를 사용하여 통신한다. - 또 다른 Docker 클라이언트는 Docker Compose로, 컨테이너 세트로 구성된 애플리케이션으로 작업할 수 있다.
이미지를 띄우면 컨테이너가 생성
리소스가 할당되는 것이 컨테이너, 서버 돌고 있다면 컨테이너이다.
Daemon & Client & Registry
Docker Daemon
😈Daemon
사용자가 직접적으로 제어하지 않고, 백그라운드에서 돌면서 여러 작업을 하는 프로그램
Docker 데몬(dockerd)은 Docker API 요청을 수신하고 이미지, 컨테이너, 네트워크 및 볼륨과 같은 Docker 객체를 관리.
데몬은 다른 데몬과 통신하여 Docker 서비스를 관리할 수도 있다.
Docker Client
Docker 클라이언트 (docker)은 Docker와 상호 작용하는 기본 방법.
docker run
와 같은 명령을 사용하면 클라이언트가 이 명령은 dockerd(도커 데몬)에 전송하여 실행한다.
이 명령은 Docker API를 사용하며 클라이언트는 둘 이상의 데몬과 통신할 수 있다.
Docker Registry
Docker 레지스트리는 이미지를 저장.
Docker hub는 누구나 사용할 수 있는 공용 레지스트리이며 도커는 기본적으로 Docker hub에서 이미지를 찾도록 구성.
물론 자신의 개인 레지스트리를 실행할 수도 있다.
docker pull
또는 docker run
명령을 사용하면 구성된 레지스트리에서 필수 이미지를 가져온다.
docker push
명령을 사용하면 이미지가 레지스트리로 푸시된다.
Object : Image & Container
Image
컨테이너를 만들기위한 읽기 전용 템플릿.
가끔, 이미지는 몇 가지 추가 사용자 정의와 함께 다른 이미지를 기반으로 한다.
자신의 이미지를 만들거나 다른 사람이 만들어 레지스트리에 게시한 이미지만 사용할 수 있다.
고유한 이미지를 빌드하려면 이미지를 만들고 실행하는 데 필요한 단계를 정의하는 간단한 구문으로 Dockerfile
을 만든다.
Dockerfile
의 각 명령어는 이미지에 레이어를 생성한다. Dockerfile
을 변경하고 이미지를 다시 빌드하면 변경된 레이어만 다시 빌드 된다.
Container
컨테이너는 이미지의 실행 가능한 인스턴스
Docker API 또는 CLI를 사용하여 컨테이너를 생성, 시작, 중지, 이동 또는 삭제할 수 있다.
컨테이너를 하나 이상의 네트워크에 연결하거나 스토리지를 연결하거나 현재 상태를 기반으로 새 이미지를 만들 수도 있다.
기본적으로 컨테이너는 다른 컨테이너 및 호스트 시스템과 비교적 잘 격리되어 있다.
컨테이너의 네트워크, 스토리지 또는 기타 기본 하위 시스템이 다른 컨테이너 또는 호스트 시스템에서 분리되는 방식을 제어할 수 있다.
컨테이너는 이미지와 사용자가 생성하거나 시작할 때 제공하는 구성 옵션에 의해 정의된다. 컨테이너가 제거되면 영구 저장소에 저장되지 않은 상태 변경 사항이 사라진다.