Docker는 도대체 무엇일까?
Docker가 뭐야?
Docker는 애플리케이션(Flask, MongoDB, Redis, Mysql, postgresql, django 등등) 을 명령어 하나로 신속하게 구축하고 배포할 수 있는 플랫폼입니다. 도커 로고에 보면, 도커 머리 위에 수 많은 컨테이너가 보이나요?
이 컨테이너가 도커의 핵심 개념입니다.
현실 세계에서 컨테이너는 배에 실는 수송용 박스인데 박스로 구분되어 있어서 고객의 상품을 그룹지어 쉽게 관리하고, 다른 컨테이너 선으로 쉽게 옮길 수 있죠.
서버에서 이야기 하는 컨테이너도 비슷합니다. 다양한 프로그램, 설정들을 하나의 컨테이너에 담아두고 언제든 손쉽게 다른 컴퓨터(혹은 서버)으로 옮겨 탈 수 있습니다. 이렇게 됨으로써 내가 찜해둔 애플리케이션들이 설치된 컴퓨터(혹은 서버)를 손쉽고 빠르게 만들 수 있습니다.
Docker 왜 써야 할까?
어플리케이션 설치가 번거로워요
서버에 프로그램을 설치할 때면 많은 명령어를 일일이 쳐야 합니다. 예를 들어, 리눅스에서 MongoDB
를 설치하면 아래의 절차를 거치게 됩니다.
wget -qO - https://www.mongodb.org/static/pgp/server-4.2.asc | sudo apt-key add -
echo "deb [ arch=amd64,arm64 ] https://repo.mongodb.org/apt/ubuntu bionic/mongodb-org/4.2 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.2.list
sudo apt-get update
sudo apt-get install -y mongodb-org
그런데 이 작업을 만약 10개의 서버에 해야 한다면? 100개??는…. 생각만 해도 끔찍합니다. Docker는 이렇게 매번 실행하는 명렁어들을 Docker 명령어 파일에 한 번에 관리하여 설치 할 때 번거로움을 확 줄일 수 있습니다.
작년에 설치한 서버의 설정이 기억이 안나요. (Snowflake Servers 문제)
A 회사는 작년까지만 해도 하나의 서버에서 관리를 하다가 올해 갑자기 트래픽이 늘어서 새로 서버를 하나 추가했습니다. flask
를 pip install flask
를 통해서 설치했는데, 1번 서버에서는 잘 작동하는데 1년 전에 설치했던 리눅스 라이브러리 버전 문제로 2번 서버에서는 작동을 안합니다. 문제를 찾는데도 한 참이 걸렸고, 불필요한 시간을 너무 많이 소요 했습니다. 그런데 Docker
는 매번 새로운 환경에서 정해진 버전으로 애플리케이션을 설치하기 때문에 문제가 생기지 않습니다.
Docker에서 많이 쓰는 용어들!
내가 설치할 프로그램 설치 파일 (Image)
컨테이너를 실행하기 위해 필요한 파일과 설정들을 포함하고 있는 파일입니다. 윈도우나 맥으로 치면, 하나의 설치 파일이라고 보면 편합니다. 단, 좀 더 디테일한 설정들을 모두 포함할 수 있는 설치 파일입니다. (설치 경로, 계정 생성 등등 다양한 것들을 미리 정해 놓을 수 있습니다)
다른 사람들이 만들어 놓은 이미지 공유 저장소 (Docker Hub)
Docker Image 계의 깃허브입니다. 각 오픈소스 개발자들이 올려 놓은 offical image 뿐만 아니라, 전세계 개발자들이 각자의 Docker 설정들을 올려 놓고, 공유하여 사용하는 곳입니다.
설치 할 때 사용할 나의 설정도 같이 저장하기 (dockerfile)
공식 이미지 뿐만 아니라 추가적으로 라이브러리가 설치가 필요하거나 변경이 필요할 때 사용합니다. 즉, 서버 구성을 문서화 한 파일이라고 보면 됩니다.
FROM python:3
ENV PYTHONUNBUFFERED 0
RUN apt-get update && apt-get -y install libpq-dev
RUN pip install flask
Docker 여러 개를 하나로 묶어서 편하게 사용하기 (Docker Compose)
예를 들어, flask
를 중심으로 Docker
로 서비스를 구성한다고 생각해보겠습니다.
그러면 백엔드 서버 Flask
, 데이터 베이스를 관리하는 MongoDB
. 이렇게 2개의 Docker
를 따로 따로 실행해주어야 하고, 서로 간의 설정을 맞추고, 연결도 해주어야 합니다.
이러한 불편함 때문에 여러 Docker
이미지 여러 개를 한 번에 실행할 수 있는 Docker Compose
가 나왔습니다. Docker compose
에 대해서는 간략하게만 알아보고 넘어가도록 하겠습니다.
여러 컨테이너를 연결하는 compose.yml
파일
# compose.yml
version: "3"
services:
db:
image: mongo
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
compose.yml
에서의 services
- 도커 컴포즈를 구성하는 여러 컨테이너들의 설정 정보를 기록하는 명령어입니다.
compose.yml
에서의 db
- mongo DB official image를 활용하여 DB를 구성하였습니다.
compose.yml
에서의 web
- build 명령어를 통해서 현재 위치의 미리 작성된
dockerfile
을 실행 - ports 명령어를 통해 외부로 port를 노출
depend_on
명령어를 통해 db와 연결
이처럼 Docker Compose
는 여러 개의 Docker
들을 쉽게 실행하고, 서로 간의 연결 코드 한 줄로 쉽게 해 줄 수 있습니다.
Wrap Up
이상으로 Docker
에 대한 간략한 개념들만 쉬운 언어로 알아 보았습니다. Docker
는 압도적인 사용 경험으로 인해 이제 웹 개발에서 없어서는 안될 존재가 되어 버렸습니다. 그러니 개념 뿐만 아니라, 실제로 한 번씩 서비스에 적용해 보시는 것을 추천드립니다.
좀 더 직접 Docker를 실습해 보고 싶다면 이 글(링크)을 강력하게 추천드립니다.