Skip to content
Snippets Groups Projects
Select Git revision
  • master default protected
1 result

2020-2-oss-final-project

  • Clone with SSH
  • Clone with HTTPS
  • 2020-2 오픈소스SW입문 기말 최종 과제 보고서

    과제: 도커(Docker)의 기본 개념 및 사용법을 동영상으로 제작

    이름: 황재완

    학과: 소프트웨어학과

    학번: 201420993


    주제 선정 이유

    SW캡스톤디자인을 수강하면서 프로젝트를 수행할 때 도커를 이용하여 많은 개발 능률이 향상되었고 DevOps를 경험할 수 있었다. 또한 교수님께서도 도커와 쿠버네티스를 설명하시면서 이에 대한 중요함을 많이 강조하셨다. 아직까지는 프로젝트 개발과 운영에서 선택사항이지만 마이크로 아키텍처와 클라우드 서비스를 통한 서비스 배포 패러다임이 주류를 이루고 발전해가면서 도커라는 오픈소스 리눅스 컨테이너 플랫폼이 DevOps에서 절대로 빠지지 않는 존재가 될 것이라고 생각한다. 하지만 도커에 대한 우리나라말로된 동영상 강의가 별로 존재하지 않아 오픈소스 소프트웨어 커뮤니티에 기여하기 위해 도커에 대한 기본 개념 및 실습을 동영상 강의로 제작하게 되었다.

    강의 구성

    과제는 "도커 초보편" 이라는 이름의 동영상으로 24분 길이이다. 두 파트로 나눠져 있는데 첫번째 파트는 도커 개념편으로 도커의 개념과 장점, 아키텍처, 주요 구성 요소 및 용어들을 정리한다. 이후 주로 사용되는 도커 명령어들을 실제 터미널 결과와 함께 알아보고 두번째 파트인 실습으로 넘어간다. 실습에서는 스프링부트 애플리케이션을 도커 이미지로 빌드할때 필요한 Dockerfile 설정을 배우고 앞에서 배웠던 도커 명령어들을 응용하여 작성한 Dockerfile을 이용해 도커 이미지를 빌드해본다. 또한 빌드한 이미지를 바탕으로 컨테이너를 생성하고 실행하여 스프링부트 애플리케이션을 구동해본다. 마지막으로 Docker Hub 개의 리포지토리에 빌드한 이미지를 푸시하는 실습을 수행하여 도커 이미지를 원격 레지스트리에서 가져오는 법을 알아본다.

    강의 목표

    • 도커(Docker)의 기본 개념과 장점, 아키텍처를 이해할 수 있다.
    • 도커에서 사용되는 주요 용어들을 이해할 수 있다.
    • 도커의 주요 명령어들을 사용할 수 있다.
    • 도커를 이용하여 스프링부트 애플리케이션의 이미지를 빌드하고 컨테이너를 실행할 수 있다.

    강의를 제작하면서 공부한 것들 정리

    도커

    Docker는 개발자나 시스템 관리자가 애플리케이션 개발 배포 실행을 컨테이너를 통해 할 수 있도록 하는 오픈 플랫폼입니다. 위키피디아를 인용하자면 다음과 같습니다.

    도커 컨테이너는 일종의 소프트웨어를 소프트웨어의 실행에 필요한 모든 것을 포함하는 완전한 파일 시스템 안에 감싼다. 여기에는 코드, 런타임, 시스템 도구, 시스템 라이브러리 등 서버에 설치되는 무엇이든 아우른다. 이는 실행 중인 환경에 관계 없이 언제나 동일하게 실행될 것을 보증한다.

    즉 격리된 공간에서 프로세스가 동작하는 기술입니다. 또한 시스템 인프라에 상관없이 애플리케이션을 격리된 공간에서 빠르게 실행합니다. Nginx나 아파치 웹서버를 우분투에서 실행하려 할땐 보통은 우분투 운영체제가 설치된 하드웨어나 가상머신이 필요합니다. 하지만 도커를 통해 우분투부터 아파치웹서버 그리고 실행할 모든 라이브러리와 애플리케이션 등을 하나의 컨테이너 안에서 모두 실행합니다. 따라서 호스트에 종속적이지 않습니다. 또한 개발과 실제 운영까지의 시간을 획기적으로 단축할 수 있습니다. 따라서 이 모든 것을 종합하면 도커란 곧 컨테이너 기반의 오픈소스 가상화 플랫폼이라 할 수 있습니다.

    도커의 장점

    도커의 장점은 정말 여러가지가 있습니다. 그 중 대표적으로 하나의 호스트에서 여러 컨테이너를 실행가능하다는 것입니다. 하나의 호스트는 도커 엔진을 통해 여러 컨테이너들을 동시에 실행할 수 있습니다. 각각의 컨테이너들을 프로세스로 격리되어 서로에 대해 영향을 미치지 않고 기존의 가상머신을 여러대 활용하는 것보다 획기적으로 성능이 좋습니다. 즉, Hypervisor와 같은 vmware나 virtualbox 등의 가상머신 소프트웨어에서 필요한 가상 머신 매니저를 필요로하지 않습니다. 따라서 이로인한 운영체제와 관련된 오버헤드가 없습니다. 또한 컨테이너가 호스트의 커널을 공유하여 컨테이너가 경량화 될 수 있습니다. 따라서 컨테이너의 빌드와 실행이 정말 빠릅니다

    도커 엔진

    도커의 엔진은 도커 이미지를 생성하거나 컨테이너를 실행하는 데 필요한 핵심 기능을 제공합니다. 또한 Client-Server구조로 3가지의 컴포넌트로 구성됩니다. 도커 서버의 도커 데몬 프로세스는 컨테이너의 빌드, 실행 배포 등 도커의 핵심 기능들을 담당합니다. 도커 REST API는 CLI나 다른 애플리케이션 프로그램들이 도커 데몬에게 명령을 수행하도록 지시할 때 사용하는 인터페이스 입니다. 커맨드를 사용하면 클라이언트는 도커 데몬에 도커 REST API를 통해 받은 커맨드를 보내고 도커 데몬은 이를 수행합니다.

    도커 이미지

    도커의 이미지는 애플리케이션을 실행하는데 필요한 코드, 런타임, 라이브러리 등 필요한 모든 것을 포함한 실행가능한 패키지 입니다. 도커의 이미지는 상태를 가지지 않고 변하지도 않습니다. 또한 이미지는 다른 이미지를 기반으로 만들어질 수 있습니다. 아래와 같이 애플리케이션을 실행하는 데 필요한 우분투 리눅스 이미지와 우분투에서 돌아갈 아파치웹서버 이미지 그리고 개발한 애플리케이션 까지 종합적으로해서 이미지의 레이어를 쌓아 하나의 이미지로 만듭니다.

    도커 컨테이너

    도커 컨테이너는 앞에서 설명한 도커 이미지의 런타임 인스턴스 입니다. 실행 시 메모리에서 상태가 있는 이미지, 즉 런타임 인스턴스가 됩니다. 따라서 도커 임지와 컨테이너의 관계를 더 쉽게 이해하기 위해서는 운영체제에서 배웠던 프로그램과 프로세스의 차이로 이해하시면 됩니다. 도커 컨테이너의 다음과 같은 특징이 있습니다. 먼저 Flexible합니다. 아무리 복잡한 애플리케이션, 예를 들어 아주 복잡한 의존성과 라이브러리, 플러그인들을 포함하여 컨테이너화(containerization) 시킬 수 있습니다. 또한 Lightwieght합니다. 즉 컨테이너는 호스트의 커널을 공유, 활용하기 때문에 별도의 가상머신을 사용하는 것보다 경량화 됩니다. Interchangeable함으로 컨테이너의 업데이트나 업그레이드를 배포하는 것이 용이합니다. Portable하므로 로컬에서 빌드하여 클라우드에 배포할 수 있고 로컬이든 클라우드든 어디든지 실행할 수 있습니다. Scalable해서 컨테이너 복제판을 여러군데에서 늘리거나 줄이면서 자동으로 배포할 수 있습니다. 마지막으로 Stackable하므로 서비스들을 수직으로 쌓아 올릴 수 있습니다.

    도커 아키텍처

    도커 아키텍처는 그림과 같이 클라이언트, 도커 호스트 그리고 레지스트리로 구성됩니다. 클라이언트에선 사용자나 애플리케이션으로 부터 명령어를 받고 도커 호스트에 보냅니다. 이를 처리한 결과를 클라이언트에서 다시 보여줄 수 있습니다. 도커 호스트는 도커 서버로서 필요한 이미지를 빌드, 다운로드하고 이들 이미지로 컨테이너를 실행하고 관리합니다. 이때 도커 호스트에 저장된 이미지가 없다면 도커 레지스트리 라는 곳에서 빌드된 이미지를 pull합니다. 이때 레지스트리는 Docker Hub와 같은 도커에서 공식적으로 관리하는 이미지 저장소가 될 수 있고, private한 레지스트리를 만들 수 도 있습니다.

    Docker CLI Command(도커 명령어)

    • docker version은 도커 클라이언트와 도커 서버의 대략적인 정보를 알려줍니다.

    • docker images는 도커 서버에 저장된 이미지 목록을 볼 수 있습니다. docker image ls도 같은 기능을 수행합니다.

    • docker ps는 실행중인 컨테이너의 목록들을 볼 수 있고 docker ps -a은 실행또는 중지된 모든 컨테이너를 확인할 수 있습니다.

    • docker contain lsdocker ps와 같은 기능이고 docker container ls -adocker ps -a와 같은 기능을 수행합니다.

    • docker stop은 현재 실행중인 컨테이너를 중지합니다.

    • docker pull은 이미지를 private registry나 Docker Hub에서 다운로드합니다. 이때 이미지 이름을 찾을때는 docker search를 통해 검색하거나 Docker Hub Web에서 검색할 수 있습니다.

    • docker start는 중지된 컨테이너를 다시 실행할 수 있습니다.

    • docker run은 새로운 컨테이너를 실행하며 이때 이미지가 로컬에 없다면 pull 받아와 사용합니다. 이때 -d 옵션을 사용하면 detached mode로서 background로 실행되며 -p는 로컬호스트와 도커서버의 포트매핑옵션입니다. -i-t 옵션을 주고 /bin/bash를 명령어로 사용하면 아래와 같이 우분투 컨테이너 내부의 bash shell을 사용할 수 있습니다.

    • docker rm은 생성된 컨테이너를 삭제합니다.

    • docker rmi는 이미지를 삭제합니다. (이때 삭제하려는 이미지를 사용하는 컨테이너가 있다면 그 컨테이너부터 삭제해야 이미지가 삭제됩니다.)

    Reference