
우리가 개발하고 배포하며 항상 Docker에대해 듣거나 사용하곤 한다.
과연 Docker가 무엇이길래 많은 개발자들이 사용하는지 또 무슨 장점이 있는지 이번 글을 정리하며 알아보고자 합니다.
일단 시작에 앞서 Docker의 정의는 무엇일까요?
Docker는 가상화 기술을 사용하여 리눅스의 응용 프로그램들을 컨테이너로 묶어 각종 환경에서 동일한 환경으로 실행할 수 있게 해주는 플랫폼입니다.
일단 도커가 무엇인지 아예 모르는 상태로 해당 글을 읽는다면 저 단어로는 도커를 절대 이해할 수 없을 것입니다. 😅
우리는 개발을 할 각각 다른 환경의 로컬 컴퓨터에서 개발을 진행하고 배포를 합니다. 하지만 로컬 환경과 서버 환경 간의 작은 차이 때문에 발생할 수 있는데, 예를 들어 다른 운영체제 버전, 라이브러리 버전, 설정 등이 서로 다를 수 있습니다. 이런 "작은 차이"로 인해 배포에 문제가 일어나는 경우는 종종 발생합니다.
Docker는 개발 환경과 배포 환경을 동일하게 유지하여, "작은 차이로 발생한 문제"를 방지합니다. 개발 환경에서 테스트한 애플리케이션은 동일한 Docker 이미지를 사용하여 배포 환경에서 실행할 수 있습니다.
컨테이너는 마치 각자의 작은 세계에서 동작하는 애플리케이션을 격리하는 공간 말합니다.
예를 들어 각자 다른 환경에서 애플리케이션 개발하고 실행한다고 가정하겠습니다.
OS를 가상화하는 가상머신의 경우 각 컴퓨터에 운영체제(OS)를 설치하고, 그 위에 애플리케이션을 실행할 수 있습니다. 각 컴퓨터는 독립적으로 운영되며, 서로 다른 운영체제나 환경을 가질 수 있습니다.
컨테이너는 이 상황에서 어떻게 동작할까요? 컨테이너는 마치 애플리케이션이 독립된 "박스" 안에서 실행되는 것과 같습니다. 이 박스 안에는 애플리케이션에 필요한 모든 것(코드, 라이브러리, 설정 등)이 들어있습니다.
상상해봅시다. 우리 가족들이 각자 다른 도시에서 살고 있습니다. 각각의 도시는 다른 환경(운영체제)을 가지고 있습니다. 이제 각 가족을 컨테이너로 비유해봅시다.
가족 1 (Windows 컨테이너): 윈도우 컨테이너 안에서는 윈도우 도시에서 살고 있는 가족이 함께 애플리케이션을 실행합니다.
가족 2 (Linux 컨테이너): 리눅스 컨테이너 안에서는 리눅스 도시에서 살고 있는 가족이 애플리케이션을 실행합니다.
가족 3 (Mac 컨테이너): 맥 컨테이너 안에서는 맥 도시에서 살고 있는 가족이 애플리케이션을 실행합니다.
각 컨테이너(가족)는 독립적으로 실행되기 때문에 서로의 영향을 받지 않습니다. 윈도우 가족은 윈도우 컨테이너 안에서만, 리눅스 가족은 리눅스 컨테이너 안에서만 서로의 애플리케이션을 실행할 수 있습니다.
이런 식으로 컨테이너를 사용하면, 각자의 작은 "집" 안에서 필요한 것들을 가지고, 어디서든 동일한 애플리케이션을 실행할 수 있습니다. 컨테이너는 이처럼 유연하고 일관된 실행 환경을 제공하여, 애플리케이션을 더 효율적으로 관리하고 배포할 수 있게 해줍니다.
기존의 가상화 방식은 주로 OS를 가상화하는 VM을 사용했습니다.
하지만 VM은 강력한 환경 격리를 제공하지만, 무겁고 느린 성능, 총괄적인 운영체제의 부담 등의 단점이 존재했고 여러 VM을 운영하면 리소스 사용량이 증가하여 비효율적이었습니다. 때문에 Docker는 이러한 VM의 한계를 극복하기 위해 경량 가상화를 도입했습니다.

이미지는 컨테이너를 생성하는 템플릿으로, 마치 애플리케이션을 실행하기 위한 설계 도면과 같다고 생각할 수 있습니다.
가상머신의 경우, 동일한 애플리케이션을 여러 대의 컴퓨터에 설치하려면 해당 애플리케이션과 그에 필요한 모든 것을 각각의 컴퓨터에 설치해야 합니다. 이는 매우 번거롭고 시간이 많이 소요되는 일입니다.
이미지는 이런 문제를 해결하기 위한 방법 중 하나입니다. 이미지는 마치 애플리케이션과 그 실행에 필요한 모든 파일, 설정 등을 미리 포장해둔 "포장지"라고 생각할 수 있습니다. 이 "포장지"를 사용하면 어디서든 동일한 애플리케이션을 실행할 수 있습니다.
상상해봅시다. 동일한 도서 상자에는 동일한 종류의 책들이 들어있습니다. 이 도서 상자는 마치 이미지와 같습니다.
도서 상자 이미지 만들기: 여러 권의 책을 동일한 상자에 담아두고, 이 상자를 이미지로 만듭니다.
이미지를 여러 컴퓨터에 배포: 이제 이 도서 상자 이미지를 여러 대의 컴퓨터에 배포합니다. 각 컴퓨터에는 해당 이미지가 설치되어 있으므로 동일한 종류의 책들을 가진 도서 상자를 어디서든 사용할 수 있습니다.
애플리케이션 실행: 각 컴퓨터에서는 이 도서 상자 이미지를 기반으로 필요한 도서(애플리케이션)를 꺼내어 사용할 수 있습니다.
이미지를 사용하면 동일한 애플리케이션을 여러 컴퓨터에 빠르게 배포하고, 실행할 수 있습니다. 이미지는 애플리케이션을 포장하고, 필요한 환경과 설정 등을 미리 정의해둔 것으로, 어디서든 일관된 방식으로 애플리케이션을 실행할 수 있게 도와줍니다.
때문에 새로운 서버가 추가되면 미리 만들어 놓은 이미지를 다운받고 컨테이너를 생성만 하면 된다는 장점이 있습니다.
Docker는 이미지를 기반으로 컨테이너를 생성하고 실행합니다. 이미지는 Dockerfile에 정의된 설정을 기반으로 빌드되며, 여러 이미지는 Docker Hub와 같은 레지스트리에 저장되어 공유될 수 있습니다.
# 베이스 이미지 선택
FROM ubuntu:latest
# 작업 디렉토리 설정
WORKDIR /app
# 필요한 파일 복사
COPY . .
# 의존성 설치
RUN apt-get update && apt-get install -y python3
# 애플리케이션 실행 명령어
CMD ["python3", "app.py"]
# Docker 이미지 빌드
docker build -t my-ubuntu-app .
# Docker 컨테이너 실행
docker run my-ubuntu-app
이렇게 하면 Docker는 작성한 Dockerfile을 기반으로 이미지를 생성하고, 해당 이미지를 실행하여 컨테이너를 생성합니다.