Logo

Docker 시작하기 (개념/설치)

개발자에게 Docker란?

Docker는 쉽게 말해서 컨테이너(container)를 돌려주는 엔진(engine)이라고 생각할 수 있는데요. 2013년 출시 후 꾸준히 인기를 얻어온 Docker는 이제는 개발자들도 모르면 불편할 정도로 대중화가 되어 버린 것 같습니다. 하지만 아직도 많은 개발자들이 업무에서 Docker를 매일 사용하고 있음에도 불구하고, Docker를 시스템 또는 DevOps 엔지니어만을 위한 도구로 여기거나, Docker 직접 다루는 것을 회피하다가, 문제가 생겼을 때 스스로 해결을 하지 못해서 곤혼스러워하는 개발자들도 종종 보게 됩니다.

Docker가 대세가 되면서 최근에 대다수의 애플리케이션들은 컨테이너화(containerization)되어 개발되고 배포되고 있습니다. 개발자의 컴퓨터에는 당연히 Docker가 깔려있어야 하고, 전체 개발 프로세스가 Docker를 위에서 이뤄진다고 해도 과언이 아닐 것입니다. 따라서 개발자 입장에서도 Docker는 피하기 어려운 도구이고, 잘 다룰 줄 알면 개발 업무에 있어서 여러 가지로 편해지는 점들이 많아집니다.

Container

Docker에서 가장 중요한 개념인 컨테이너(container)는 기본적으로 호스트(host) 컴퓨터에서 돌아가고 있는 하나의 프로세스입니다. 하지만, 일반 프로세스와는 다르게 container는 host 컴퓨터와 그 위에서 돌아가는 다른 프로세스들로 부터 격리되도록 설계되어 있습니다. 흔히 container를 VM(virtual machine)과 많이 비교하는데, 자체적인 운영체제(guest OS)를 포함하고 있어서 하드웨어 리소스를 많이 잡아 먹어서 느리고 무거운 VM 대비, container는 VM처럼 격리된 환경에서도 일반 프로세스처럼 빠르고 가볍게 돌아갑니다. 이러한 container의 효율성과 보안성 때문에 Docker는 많은 사람들로부터 빠르게 사랑받을 수 있게 되었습니다.

Image

container image, 줄여서 이미지(image)는 애플리케이션 코드 뿐만 아니라 애플리케이션 실행에 필요한 최소한의 환경(언어 런타임, 라이브러리 패키지 등)을 포함하고 있는 바이너리(binary) 파일입니다. 하나의 image로 부터 동일한 container를 계속해서 만들어낼 수 있으며, 동시에 여러 개의 container를 띄울 수도 있어서 확장성(scalability)이 좋습니다. 이러한 image는 Docker Hub와 같은 네트워크 상의 Docker registry통해 손쉽게 공유할 수 있기 때문에 이식성(portability)도 매우 뛰어납니다. 즉, 어떤 컴퓨터에서든지 Docker만 깔려 있다면 이 image를 내려받아 contianer로 구동하면 동일하게 작동하는 애플리케이션을 얻을 수 있습니다.

Container vs. Image

contianer와 image를 햇갈려 하시는 부분이 많은데, 쉽게 말해 Image는 container의 스냅샷(snapshot)을 떠어놓은 것으로 생각하면 이해가 편하실 것입니다. 반대로 container는 컴퓨터에서 살아서 돌아가고 있는 image의 한 인스턴스(instance)라고 생각할 수 있습니다.

Docker Engine Components Flow

Docker Desktop 설치

컴퓨터에서 Docker container를 돌리기 위한 환경을 구축하려면 기본적으로 해당 컴퓨터에 Docker Desktop 깔려 있어야 합니다. Mac 또는 Windows 용 Docker Desktop은 Docker 사이트에서 다운로드하여 설치할 수 있습니다.

설치 후에 터미널에서 다음과 같이 docker 명령어로 Docker 클라이언트와 서버의 버전을 확인해볼 수 있습니다.

$ docker -v
Docker version 19.03.8, build afacb8b
$ docker version
Client: Docker Engine - Community
 Version:           19.03.8
 API version:       1.40
 Go version:        go1.12.17
 Git commit:        afacb8b
 Built:             Wed Mar 11 01:21:11 2020
 OS/Arch:           darwin/amd64
 Experimental:      false

Server: Docker Engine - Community
 Engine:
  Version:          19.03.8
  API version:      1.40 (minimum version 1.12)
  Go version:       go1.12.17
  Git commit:       afacb8b
  Built:            Wed Mar 11 01:29:16 2020
  OS/Arch:          linux/amd64
  Experimental:     true
 containerd:
  Version:          v1.2.13
  GitCommit:        7ad184331fa3e55e52b890ea95e65ba581ae3429
 runc:
  Version:          1.0.0-rc10
  GitCommit:        dc9208a3303feef5b3839f4323d9beb36df0a9dd
 docker-init:
  Version:          0.18.0
  GitCommit:        fec3683

hello-world 라는 컨테이너를 실행해서 Hello from Docker!가 출력되면 정상적으로 설치가 완료된 것입니다.

$ docker run hello-world
Unable to find image 'hello-world:latest' locally
latest: Pulling from library/hello-world
1b930d010525: Pull complete
Digest: sha256:f9dfddf63636d84ef479d645ab5885156ae030f611a56f3a7ac7f2fdd86d7e4e
Status: Downloaded newer image for hello-world:latest

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

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Play with Docker

본인의 컴퓨터에서 Docker를 설치하기가 부담스러운 분들에게는 Play with Docker라고 하는 Docker Playground를 추천드립니다. 이 사이트에 접속하시면 브라우저 상에서 간단하게 Docker 명령어들을 연습해볼 수 있습니다.

Play with Docker

마치면서

이상으로 Docker에 대한 기본 기념과 Docker Desktop 설치 방법에 대해서 간단히 알아보았습니다. 앞으로 개발자를 위한 Docker 사용법에 대해서 꾸준히 포스팅을 해보도록 하겠습니다.