반응형
Jake Seo
제이크서 위키 블로그
Jake Seo
전체 방문자
오늘
어제
  • 분류 전체보기 (715)
    • 일상, 일기 (0)
    • 백준 문제풀이 (1)
    • 릿코드 문제풀이 (2)
    • 알고리즘 이론 (10)
      • 기본 이론 (2)
      • 배열과 문자열 (8)
    • 데이터베이스 (15)
      • Planet Scale (1)
      • MSSQL (9)
      • 디비 기본 개념 (1)
      • SQLite 직접 만들어보기 (4)
    • 보안 (7)
    • 설계 (1)
    • 네트워크 (17)
      • HTTP (9)
      • OSI Layers (5)
    • 회고 (31)
      • 연간 회고 (2)
      • 주간 회고 (29)
    • 인프라 (52)
      • 도커 (12)
      • AWS (9)
      • 용어 (21)
      • 웹 성능 (1)
      • 대규모 서비스를 지탱하는 기술 (9)
    • 깃 (7)
    • 빌드 도구 (7)
      • 메이븐 (6)
      • 그레이들 (0)
    • Java (135)
      • 이펙티브 자바 (73)
      • 자바 API (4)
      • 자바 잡지식 (30)
      • 자바 디자인 패턴 (21)
      • 톰캣 (Tomcat) (7)
    • 프레임워크 (64)
      • next.js (14)
      • 스프링 프레임워크 (28)
      • 토비의 스프링 (6)
      • 스프링 부트 (3)
      • JPA (Java Persistence API) (5)
      • Nest.js (8)
    • 프론트엔드 (48)
      • 다크모드 (1)
      • 노드 패키지 관리 매니저 (3)
      • CSS (19)
      • Web API (11)
      • tailwind-css (1)
      • React (5)
      • React 새 공식문서 요약 (1)
      • HTML (Markup Language) (5)
    • 자바스크립트 (108)
      • 모던 자바스크립트 (31)
      • 개념 (31)
      • 정규표현식 (5)
      • 코드 스니펫 (1)
      • 라이브러리 (6)
      • 인터뷰 (24)
      • 웹개발자를 위한 자바스크립트의 모든 것 (6)
      • 팁 (2)
    • Typescript (49)
    • 리눅스와 유닉스 (10)
    • Computer Science (1)
      • Compiler (1)
    • IDE (3)
      • VSCODE (1)
      • IntelliJ (2)
    • 세미나 & 컨퍼런스 (1)
    • 용어 (개발용어) (16)
      • 함수형 프로그래밍 용어들 (1)
    • ORM (2)
      • Prisma (2)
    • NODEJS (2)
    • cypress (1)
    • 리액트 네이티브 (React Native) (31)
    • 러스트 (Rust) (15)
    • 코틀린 (Kotlin) (4)
      • 자바에서 코틀린으로 (4)
    • 정규표현식 (3)
    • 구글 애널리틱스 (GA) (1)
    • SEO (2)
    • UML (2)
    • 맛탐험 (2)
    • 리팩토링 (1)
    • 서평 (2)
    • 소프트웨어 공학 (18)
      • 테스팅 (16)
      • 개발 프로세스 (1)
    • 교육학 (1)
    • 삶의 지혜, 통찰 (1)
    • Chat GPT (2)
    • 쉘스크립트 (1)
    • 컴파일 (2)
    • Dart (12)
    • 코드팩토리의 플러터 프로그래밍 (4)
    • 플러터 (17)
    • 안드로이드 스튜디오 (1)
    • 윈도우즈 (1)
    • 잡다한 백엔드 지식 (1)
    • 디자인 패턴 (1)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • item7
  • 서버리스 컴퓨팅
  • 자바 검증
  • Java
  • 이펙티브자바
  • Next.js
  • 자료구조
  • 토비의 스프링
  • 자바스크립트 인터뷰
  • 스프링 검증
  • 객체복사
  • 자바스크립트
  • try-with-resources
  • 작업기억공간
  • 이펙티브 자바
  • 빈 검증
  • NEXT JS
  • 싱글톤 패턴
  • pnpm
  • 플라이웨이트패턴
  • 외래키 제약조건
  • 메이븐 골
  • 슬로우 쿼리
  • 도커공식문서
  • 싱글톤
  • 자바스크립트 면접
  • 추상 팩터리 패턴
  • 자바 디자인패턴
  • item9
  • 자바
  • item8
  • 러스트
  • Javadoc 자바독 자바주석 주석 Comment
  • 메이븐 라이프사이클
  • 참조 해제
  • 프로그래머의 뇌
  • 싱글턴
  • rust
  • 느린 쿼리
  • 알고리즘
  • serverless computing
  • bean Validation
  • 이펙티브 자바 item9
  • 팩터리 메서드 패턴
  • MSSQL
  • 메이븐 페이즈
  • next js app
  • prerendering
  • 디자인패턴
  • Pre-rendering

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Jake Seo

제이크서 위키 블로그

도커 소개 (Docker overview - get started 공식문서 번역)
인프라/도커

도커 소개 (Docker overview - get started 공식문서 번역)

2022. 5. 28. 16:06

도커 개요

  • 애플리케이션의 개발, 배포, 실행을 위한 오픈 플랫폼이다.
  • 애플리케이션과 인프라를 분리하여 어느곳에서든 빠르게 애플리케이션을 실행할 수 있게 해준다.
  • 코드를 작성하는 것과 실제로 프로덕션에서 애플리케이션을 구동하는 사이의 딜레이를 최소화해준다.

도커 플랫폼

애플리케이션을 패키징하고 느슨하게 분리된 환경인 컨테이너에서 구동시켜준다. 한 호스트에서 여러 개의 컨테이너를 실행시킬 수도 있다. 컨테이너는 실행에 필요한 모든 것을 포함하고 있어서 호스트에 무엇이 설치되었는지에 의존할 필요가 없다. 컨테이너는 쉽게 공유도 가능해서, 다른 동료와 같은 방식으로 동작하는 컨테이너를 쉽게 공유할 수 있다.

도커는 컨테이너의 라이프사이클을 관리할 수 있는 도구와 플랫폼을 제공한다.

  • 컨테이너를 이용하여 컴포넌트와 애플리케이션을 개발한다.
  • 컨테이너는 애플리케이션의 배포와 테스팅을 위한 구성 단위가 된다.
  • 준비가 되면, 운영 환경에 컨테이너로 혹은 잘 구성된 서비스(orchestrated service)로 애플리케이션을 배포한다.
  • 컨테이너로서의 애플리케이션은 운영 환경이 로컬 데이터 센터이든 클라우드 제공자이든 두개 하이브리드이든 항상 동일하게 동작한다.

도커로는 무엇을 할 수 있는가?

빠르고 일관된 배포를 제공한다.

개발자가 표준화된 환경에서 작업할 수 있도록 해준다. 컨테이너는 지속적 통합(CI)과 지속적 배포(CD)에 유리하다.

다음 시나리오를 살펴보자.

  • 도커를 이용하는 개발 그룹에서 앱의 테스트를 수행한다.
  • 앱의 수동 테스트 중 버그를 찾았다.
  • 개발 그룹의 일원이 해당 버그를 고쳤다.
  • 다시 테스트를 마쳤을 때, 버그의 수정사항을 반영하려면 업데이트된 이미지를 푸시하기만 하면 된다.

스케일링과 배포에 빠르게 대응할 수 있다.

도커에서 작업된 내용은 빠르게 반영이 가능하다. 도커 컨테이너는 개발자의 로컬 랩탑이나 데이터 센터의 물리, 가상 머신 혹은 클라우드 제공자에 상관없이 잘 작동한다.

도커의 이동성과 가벼움은 워크로드를 동적으로 관리하기 쉽게 만들어주며 스케일링 업다운을 편하게 만들어준다.

같은 하드웨어에서 더 많은 일을 하게 해준다.

가상 머신에 비교했을 때 하드웨어를 더 알뜰하게 사용할 수 있도록 만들어준다. 적은 리소스를 가진 컴퓨팅 환경에 배포를 해야할 경우, 도커가 좋은 선택이 될 수 있다.

도커 아키텍처

도커는 클라이언트 서버 아키텍처를 사용한다. 도커 클라이언트는 도커 데몬에게 명령을 전달한다. 도커 데몬은 빌드, 구동, 배포와 같은 무거운 작업을 수행한다. 도커 클라이언트와 데몬은 같은 시스템에서 동작할 수도 있고 도커 클라이언트를 원격 도커 데몬에 연결하여 사용할 수도 있다. 도커 클라이언트와 데몬은 REST API 를 이용해 UNIX 소켓 혹은 네트워크 인터페이스를 통해 통신한다. 도커 클라이언트인 Docker Compose 는 컨테이너의 집합으로 이루어진 애플리케이션 작업을 할 수 있게 해준다.

 

도커 데몬 (The Docker Deamon)

도커 데몬(dockerd)은 API 요청을 받아들이고 이미지, 컨테이너, 네트워크, 볼륨과 같은 도커 오브젝트를 관리한다. 데몬은 도커 서비스를 관리하기 위해 다른 데몬과 소통할 수도 있다.

도커 클라이언트 (The Docker Client)

도커 클라이언트(docker)는 사용자가 도커와 소통하기 위해 주로 사용하는 방법이다. docker run 과 같은 명령어를 사용할 때, 클라이언트는 명령어를 실제로 수행하는 dockerd 로 명령을 넘긴다. docker 명령어는 Docker API 를 사용한다. 도커 클라이언트는 1개 이상의 데몬과도 소통할 수 있다.

도커 데스크탑 (Docker Desktop)

컨테이너화된 애플리케이션과 마이크로 서비스를 빌드하고 공유할 수 있도록 해준다. 도커 데스크탑에는 Docker Deamon, Docker Client, Docker Compose, Docker Content Trust, Kubernetes, Credential Helper 가 포함되어 있다.

도커 데스크탑 설명 웹사이트 에서 더 자세한 설명을 볼 수 있다.

도커 레지스트리 (Docker Registries)

도커 레지스트리는 도커 이미지를 보관한다. 도커 허브는 누구나 사용할 수 있는 Public registry 로 볼 수 있다. 도커는 기본값으로 도커 허브에서 이미지를 찾도록 설정되어 있다. 원한다면 Private registry 를 만들고 운영할 수 있다.

docker pull, docker run 명령어를 사용할 때, 설정된 레지스트리에서 필요한 이미지를 끌어온다. docker push 명령어를 입력하면, 설정된 레지스트리에 이미지가 올라간다.

도커 오브젝트

도커를 이용할 때 이미지, 컨테이너, 네트워크, 볼륨, 플러그인과 다른 오브젝트를 만들고 사용한다. 이 섹션에서는 몇몇 오브젝트에 대한 간단한 개요만 알아본다.

이미지

도커 이미지는 도커 컨테이너를 만들기 위해 명령어를 가진 읽기 전용 템플릿이다. 많은 이미지는 다른 이미지 위에 몇몇 커스터마이징만을 더해서 만들어진다. 만일 내 앱이 설치된 우분투 이미지를 만들고 싶다면, 우분투 이미지에 앱을 설치하고 몇가지 설정만 더해서 이미지를 만들면 될 것이다.

레지스트리에 올라온 이미지를 그대로 사용하거나 자체적으로 이미지를 만들 수 있다. 이미지를 만들려면, 이미지를 만들고 구동하기 위한 몇가지 단계를 간단한 문법으로 정의하는 Dockerfile 을 작성하면 된다. 도커 파일을 변경하고 이미지를 다시 빌드할 때는 변경된 레이어만 다시 빌드된다. 이러한 이유 때문에 다른 가상화 기술과 비교했을 때 도커 이미지가 가볍고 작고 빠르다.

컨테이너

컨테이너는 이미지의 실행 가능한 인스턴스이다. 도커 API 혹은 CLI 를 이용하여 컨테이너를 만들고, 시작하고, 정지하고, 옮기고, 삭제할 수 있다. 컨테이너를 하나 혹은 그 이상의 네트워크에 연결할 수 있다. 또는 컨테이너에 저장소를 연결하거나 현재의 상태를 기반으로 하여 새로운 이미지를 만들어낼 수도 있다.

기본값으로, 컨테이너는 호스트 머신과 다른 컨테이너들과 상대적으로 잘 격리되어 있다. 컨테이너의 네트워크, 스토리지 혹은 호스트 머신이나 다른 컨테이너가 제공하는 서브 시스템들이 어떻게 격리될지 제어할 수도 있다.

컨테이너는 이미지와 만들거나 시작 시에 설정하는 옵션들에 의해 정의된다. 컨테이너가 지워지면, 컨테이너에 저장된 상태 값은 날아간다.

예시 docker run 명령어

아래의 명령어는 ubuntu 컨테이너를 실행한다. 로컬 커맨드라인 세션과 붙어 상호작용한다. 그리고 /bin/bash 를 실행한다.

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

이 명령어를 실행하면, 아래와 같은 일이 일어난다. (이 경우 기본 레지스트리 설정값을 상정한다.)

  1. 로컬에서 ubuntu 이미지를 갖고 있지 않다면, 도커는 docker pull ubuntu 를 수동으로 실행시킨 것처럼 설정된 레지스트리에서 이미지를 가져온다.
  2. docker container create 명령어를 수동으로 입력한 것처럼 도커는 새로운 컨테이너를 만든다.
  3. 도커는 마지막 레이어로 읽기-쓰기 파일시스템을 할당한다. 동작하는 컨테이너가 로컬 파일시스템에서 파일과 디렉토리를 생성하거나 수정할 수 있도록 만들어준다.
  4. 네트워킹 옵션을 명시하지 않았다면, 도커는 기본 네트워크에 연결하기 위해 네트워크 인터페이스를 생성한다. 이는 컨테이너에 IP 주소를 할당하는 것을 포함한다. 기본 값으로, 컨테이너는 호스트 머신의 네트워크 커넥션을 이용하여 외부 네트워크에 연결할 수 있다.
  5. 도커는 컨테이너를 시작하고, /bin/bash 명령어를 실행한다. 컨테이너는 -i와 -t 옵션에 의해 터미널에 붙어서 상호작용하게 된다. 우리는 터미널을 통해 컨테이너에 명령어를 전송할 수도 있고 결과를 받아볼 수도 있다.
  6. /bin/bash 명령을 종료하기 위해 exit 을 입력하면, 컨테이너는 멈추지만 제거되진 않는다. 컨테이너가 멈춘 이후에 컨테이너를 다시 실행할지 제거할지 결정할 수 있다.

기저에 깔린 기술들

도커는 Go 프로그래밍 언어 로 쓰여졌고, 기술을 제공하기 위해 리눅스 커널의 여러 기능을 가져다 썼다. 도커는 컨테이너라 불리는 고립된 워크스페이스를 제공하기 위해 namespaces 라 불리는 기술을 사용한다. 컨테이너를 실행할 때, 도커는 그 컨테이너를 위한 여러 네임스페이스를 만든다.

이러한 네임스페이스가 레이어간의 고립을 제공해준다. 컨테이너의 각각 다른 부분이 개별 네임스페이스에서 실행된다. 또한 접근 권한 자체도 해당 네임스페이스에 제한되어 있다.

다음으로 알아볼만한 것들

  • 도커 설치에 대해 읽어보자.
  • 도커 시작하기 튜토리얼과 함께 실제로 도커를 이용해보자.

레퍼런스

Docker overview - get started

반응형
저작자표시 비영리 (새창열림)

'인프라 > 도커' 카테고리의 다른 글

하이퍼바이저 (Hypervisor) 란 무엇인가?  (1) 2024.02.04
도커 실무 - Mariadb 를 사용하는 스프링부트 프로젝트 배포해보기  (0) 2022.06.07
도커 명령어의 run -it 옵션은 어떤 의미일까?  (0) 2022.06.04
도커 자주 쓰이는 명령어 정리 (Docker Cheat Sheet)  (0) 2022.06.03
도커 (Docker) 가 무엇인지 알아보자.  (0) 2022.05.24
    '인프라/도커' 카테고리의 다른 글
    • 도커 실무 - Mariadb 를 사용하는 스프링부트 프로젝트 배포해보기
    • 도커 명령어의 run -it 옵션은 어떤 의미일까?
    • 도커 자주 쓰이는 명령어 정리 (Docker Cheat Sheet)
    • 도커 (Docker) 가 무엇인지 알아보자.
    Jake Seo
    Jake Seo
    ✔ 잘 보셨다면 광고 한번 클릭해주시면 큰 힘이 됩니다. ✔ 댓글로 틀린 부분을 지적해주시면 기분 나빠하지 않고 수정합니다. ✔ 많은 퇴고를 거친 글이 좋은 글이 된다고 생각합니다. ✔ 간결하고 명료하게 사람들을 이해 시키는 것을 목표로 합니다.

    티스토리툴바