Docker Introduction

윤석주·2022년 11월 3일
0

docker

목록 보기
1/10

본 포스팅은 https://docker-curriculum.com 의 글을 정리한 내용입니다.

INTRODUCTION

What is Docker?

위키피디아에선 Docker를 다음과 같이 정의합니다.

an open-source project that automates the deployment of software applications inside containers by providing an additional layer of abstraction and automation of OS-level virtualization on Linux.

간단히 말하면 Docker는 개발자, 시스템 관리자 등이 샌드박스(container라고 함)에 애플리케이션을 쉽게 배포하여 호스트 운영 체제(Linux 등)에서 실행할 수 있도록 하는 도구입니다. 도커의 가장 큰 장점은 사용자로 하여금 어플리케이션, 그리고 관련된 의존성을 모두 묶어 소프트웨어 개발을 위한 표준화 된 단위로 패키징 할 수 있다는 것입니다. Virtual Machines와 다르게, container는 높은 오버헤드를 갖고 있지 않으므로 기본 시스템과 리소스를 효율적으로 사용할 수 있습니다.

What is container?

VM은 서버의 Host OS로 구동되는 가상 하드웨어에서 실행되는 게스트 운영체제 내에서 애플리케이션을 실행합니다.

VM은 애플리케이션에 대한 전체 프로세스 격리를 제공하는 데 탁월합니다. 호스트 운영체제의 문제가 게스트 운영체제에서 실행되는 소프트웨어에 영향을 줄 수 있는 방법은 거의 없으며 그 반대의 경우도 마찬가지입니다. 그러나 이러한 격리에는 막대한 비용이 듭니다. 게스트 OS가 사요할 하드웨어를 가상화하는 데 드는 계산 오버헤드는 상당합니다.

Container는 다른 접근 방식을 취합니다. 호스트 운영체제의 저수준 메커니즘을 활용하여 Container는 극히 일부의 컴퓨팅 성능으로 가상 머신의 대부분을 격리합니다.

Why use container?

컨테이너는 애플리케이션이 실제로 실행되는 환경에서 추상화될 수 있는 논리적 패키징 메커니즘을 제공합니다. 이러한 분리를 통해 대상 환경이 private data center, public cloud 또는 개발자의 개인 노트북인지 여부에 관계없이 컨테이너 기반 애플리케이션을 쉽고 일관되게 배포할 수 있습니다. 이를 통해 개발자는 나머지 애플리케이션과 격리되고 어디에서나 실행할 수 있는 예측 가능한 환경을 만들 수 있습니다.

운영 관점에서 이식성 외에도 컨테이너는 리소스에 대한 보다 세분화된 제어를 제공하여 인프라의 효율성을 향상시켜 컴퓨팅 리소스의 활용도를 높일 수 있습니다.

이러한 이점으로 인해 컨테이너와 Docker가 널리 사용되게 되었습니다. Google, Facebook, Netflix 및 Salesforce와 같은 회사는 컨테이너를 활용하여 대규모 엔지니어링 팀의 생산성을 높이고 컴퓨팅 리소스 활용도를 개선합니다. 실제로 Google은 전체 데이터 센터의 필요성을 제거한 컨테이너를 인정했습니다.

시작하기

컴퓨터 설정

컴퓨터에서 모든 도구 설정을 가져오는 것은 어려운 작업일 수 있지만 고맙게도 Docker가 안정되면서 좋아하는 OS에서 Docker를 시작하고 실행하는 것이 매우 쉬워졌습니다.

몇 가지 릴리즈 전까지 OSX 및 Windows에서 Docker를 실행하는 것은 상당히 번거로운 작업이었습니다. 그러나 최근에 Docker는 이러한 OS에서 사용자의 온보딩 경험을 개선하는 데 상당한 투자를 했으며, 따라서 현재 Docker를 실행하는 것은 식은 죽 먹기(cakewalk)입니다. Docker 시작 안내서에는 Mac, LinuxWindows에서 Docker를 설정하는 자세한 지침이 있습니다.

Docker 설치가 완료되면 다음을 실행하여 Docker 설치를 테스트합니다.

$ docker run hello-world

Hello from Docker.
This massage shows that your installation appears to be working correctly.
...

Hello World

비지박스로 놀기

이 섹션에서는 시스템에서 Busybox docker run 컨테이너를 실행하고 명령을 확인해보겠습니다.

터미널에서 다음 명령어를 실행합니다.

$ docker pull busybox

이 명령은 Docker 레지스트리 pull에서 busybox 이미지를 가져와 시스템에 저장합니다. 명령을 사용하여 시스템의 모든 이미지 목록을 볼 수 있습니다. docker images

$ docker images
REPOSITORY              TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
busybox                 latest              c51f86c28340        4 weeks ago         1.109 MB

도커 실행

이제 이 이미지를 기반으로 Docker 컨테이너를 실행해 보겠습니다. 이를 위해 docker run 명령을 사용합니다.

$ docker run busybox
$

아무일도 일어나지 않은 것 같지만 많은 일들이 일어났습니다. run을 호출하면 Docker 클라이언트가 이미지(이 경우에는 busybox)를 찾고 컨테이너를 로드한 다음 해당 컨테이너에서 명령을 실행합니다. 실행할 때 docker run busybox 명령을 제공하지 않았으므로 컨테이너가 부팅되고 빈 명령을 실행한 다음 종료됩니다. 다음을 실행해봅시다

$ docker run busybox echo "hello from busybox"
hello from busybox

Docker 클라이언트는 busybox 컨테이너에서 echo 명령을 충실히 실행한 다음 종료했습니다. 눈치채셨다면 이 모든 일이 꽤 빨리 일어났습니다. 가상 머신을 부팅하고 명령을 실행한 다음 종료한다고 상상해 보십시오. 컨테이너가 매우 빠르다는 것을 알 수 있습니다. 자, 이제 docker ps 명령을 볼 시간입니다. 이 docker ps 명령은 현재 실행중인 모든 컨테이너를 보여줍니다.

$ docker ps
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS  

실행중인 컨테이너가 없으므로 빈 줄이 표시됩니다. docker ps -a를 실행해보겠습니다.

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
305297d7a235        busybox             "uptime"            11 minutes ago      Exited (0) 11 minutes ago                       distracted_goldstine
ff0a5c3750b9        busybox             "sh"                12 minutes ago      Exited (0) 12 minutes ago                       elated_ramanujan
14e5bd11d164        hello-world         "/hello"            2 minutes ago       Exited (0)

우리가 실행한 모든 컨테이너의 목록입니다. STATUS 열에 이러한 컨테이너가 몇 분 전 종료되었음을 표시합니다.

컨테이너에서 하나 이상의 명령을 실행하는 방법도 알아보겠습니다.

$ docker run -it busybox sh
/ # ls
bin   dev   etc   home  proc  root  sys   tmp   usr   var
/ # uptime
 05:45:21 up  5:58,  0 users,  load average: 0.00, 0.01, 0.04

run플래그와 함께 -it 명령을 실행하면 컨테이너의 대화형 tty에 연결됩니다. 이제 컨테이너에서 원하는 만큼 명령을 실행할 수 있습니다.

이것으로 여러분이 가장 자주 사용하게 될 강력한 docker run 명령에 대한 둘러보기를 마치겠습니다. 자세히 알아보려면 docker run --help 명령을 이용하여 모든 플래그 목록을 확인하세요.

계속 진행하기 전에 컨테이너 삭제에 대해 빠르게 이야기해 보겠습니다. docker ps -a를 실행하여 종료한 후에도 컨테이너의 나머지 부부을 볼 수 있음을 위에서 살펴봤습니다. docker run을 여러 번 실행하고 컨테이너를 방치하면 디스크 공간을 차지하게 됩니다. 따라서 컨테이너를 사용한 다음에는 컨테이너를 정리하는 것이 좋습니다. 그렇게 하려면 docker rm 명령을 실행하면 됩니다. 위에서 컨테이너 ID를 복사하여 명령과 함께 붙여넣으면 됩니다.

$ docker rm 305297d7a235 ff0a5c3750b9
305297d7a235
ff0a5c3750b9

한 번에 삭제할 컨테이너가 많은 경우 ID를 복사하여 붙여넣는 것이 지루할 수 있습니다. 이 경우 아래 명령어를 이용해 간단히 실행할 수 있습니다.

$ docker rm $(docker ps -a -q -f status=exited)

위 명령은 상태가 exited인 모든 컨테이너를 삭제합니다. -q플래그는 숫자 ID만 반환하고 -f는 제공된 조건에 따라 출력을 필터링합니다. 마지막으로 유용한 것은 컨테이너가 종료되면 컨테이너를 자동으로 삭제하는 docker run에 전달할 수 있는 --rm 플래그입니다. 일회성 도커 실행의 경우 --rm플래그는 매우 유용합니다.

이후 버전의 Docker에서는 docker container prune명령을 사용하여 동일한 효과를 얻을 수 있습니다.

$ docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Deleted Containers:
4a7f7eebae0f63178aff7eb0aa39f0627a203ab2df258c1a00b456cf20063
f98f9c2aa1eaf727e4ec9c0283bcaa4762fbdba7f26191f26c97f64090360

Total reclaimed space: 212 B

마지막으로 docker rmi를 실행하여 더이상 필요하지 않은 이미지를 삭제할 수도 있습니다.

용어

Docker 생태계에서 자주 사용되는 몇 가지 용어를 명확히 하겠습니다.

  • 이미지 - 컨테이너의 기초를 형성하는 애플리케이션의 청사진. 위의 데모에서는 busybox 이미지를 다운로드하는 docker pull 명령어를 사용했습니다.
  • 컨테이너 - Docker 이미지에서 생성되고 실제 애플리케이션을 실행합니다. 다운로드한 busybox 이미지를 사용하여 컨테이너를 생성합니다. 실행중인 컨테이너 목록은 docker ps 명령을 사용하여 볼 수 있습니다.
  • Docker Daemon - Docker 컨테이너 빌드, 실행 및 배포를 관리하는 호스트에서 실행되는 백그라운드 서비스입니다. 데몬은 클라이언트가 통신하는 운영체제에서 실행되는 프로세스입니다.
  • Docker 클라이언트 - 사용자가 데몬과 상호작용 할 수 있도록 하는 명령줄 도구입니다. 보다 일반적으로 사용자에게 GUI를 제공하는 Kitematic과 같은 다른 형태의 클라이언트도 있을 수 있습니다.
  • Docker Hub - Docker 이미지의 레지스트리 입니다. 레지스트리를 사용 가능한 모든 Docker 이미지의 디렉토리로 생각할 수 있습니다. 필요한 경우 자체 Docker 레지스트리를 호스팅하고 이미지를 가져오는데 사용할 수 있습니다.

출처

profile
웹 개발을 공부하고 있는 윤석주입니다.

0개의 댓글