본 포스팅은 https://docker-curriculum.com 의 글을 정리한 내용입니다.
위키피디아에선 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는 높은 오버헤드를 갖고 있지 않으므로 기본 시스템과 리소스를 효율적으로 사용할 수 있습니다.
VM은 서버의 Host OS로 구동되는 가상 하드웨어에서 실행되는 게스트 운영체제 내에서 애플리케이션을 실행합니다.
VM은 애플리케이션에 대한 전체 프로세스 격리를 제공하는 데 탁월합니다. 호스트 운영체제의 문제가 게스트 운영체제에서 실행되는 소프트웨어에 영향을 줄 수 있는 방법은 거의 없으며 그 반대의 경우도 마찬가지입니다. 그러나 이러한 격리에는 막대한 비용이 듭니다. 게스트 OS가 사요할 하드웨어를 가상화하는 데 드는 계산 오버헤드는 상당합니다.
Container는 다른 접근 방식을 취합니다. 호스트 운영체제의 저수준 메커니즘을 활용하여 Container는 극히 일부의 컴퓨팅 성능으로 가상 머신의 대부분을 격리합니다.
컨테이너는 애플리케이션이 실제로 실행되는 환경에서 추상화될 수 있는 논리적 패키징 메커니즘을 제공합니다. 이러한 분리를 통해 대상 환경이 private data center, public cloud 또는 개발자의 개인 노트북인지 여부에 관계없이 컨테이너 기반 애플리케이션을 쉽고 일관되게 배포할 수 있습니다. 이를 통해 개발자는 나머지 애플리케이션과 격리되고 어디에서나 실행할 수 있는 예측 가능한 환경을 만들 수 있습니다.
운영 관점에서 이식성 외에도 컨테이너는 리소스에 대한 보다 세분화된 제어를 제공하여 인프라의 효율성을 향상시켜 컴퓨팅 리소스의 활용도를 높일 수 있습니다.
이러한 이점으로 인해 컨테이너와 Docker가 널리 사용되게 되었습니다. Google, Facebook, Netflix 및 Salesforce와 같은 회사는 컨테이너를 활용하여 대규모 엔지니어링 팀의 생산성을 높이고 컴퓨팅 리소스 활용도를 개선합니다. 실제로 Google은 전체 데이터 센터의 필요성을 제거한 컨테이너를 인정했습니다.
컴퓨터에서 모든 도구 설정을 가져오는 것은 어려운 작업일 수 있지만 고맙게도 Docker가 안정되면서 좋아하는 OS에서 Docker를 시작하고 실행하는 것이 매우 쉬워졌습니다.
몇 가지 릴리즈 전까지 OSX 및 Windows에서 Docker를 실행하는 것은 상당히 번거로운 작업이었습니다. 그러나 최근에 Docker는 이러한 OS에서 사용자의 온보딩 경험을 개선하는 데 상당한 투자를 했으며, 따라서 현재 Docker를 실행하는 것은 식은 죽 먹기(cakewalk)입니다. Docker 시작 안내서에는 Mac, Linux및 Windows에서 Docker를 설정하는 자세한 지침이 있습니다.
Docker 설치가 완료되면 다음을 실행하여 Docker 설치를 테스트합니다.
$ docker run hello-world
Hello from Docker.
This massage shows that your installation appears to be working correctly.
...
이 섹션에서는 시스템에서 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 생태계에서 자주 사용되는 몇 가지 용어를 명확히 하겠습니다.
docker pull
명령어를 사용했습니다.docker ps
명령을 사용하여 볼 수 있습니다.출처