“`html
Docker 입문: 컨테이너 기술의 기초부터 활용까지
서론: 왜 Docker를 배워야 할까요?
여러분, 안녕하세요! IT 분야에서 일하다 보면 “Docker”라는 단어를 정말 많이 듣게 되는데요. 도커는 컨테이너 기술의 대표 주자로서, 현대적인 소프트웨어 개발과 배포에 있어서 빼놓을 수 없는 핵심 기술로 자리 잡았습니다. 왜 이렇게 중요할까요? 도커는 애플리케이션을 격리된 환경, 즉 컨테이너 안에서 실행함으로써 개발, 테스트, 배포 과정을 훨씬 효율적으로 만들어주기 때문입니다.
예전에는 개발 환경과 운영 환경이 달라서 “내 컴퓨터에서는 잘 돌아갔는데…”라는 웃지 못할 상황이 자주 발생했습니다. 하지만 도커를 사용하면 이런 문제를 근본적으로 해결할 수 있습니다. 모든 의존성을 컨테이너 안에 패키징하여 어떤 환경에서도 동일하게 작동하도록 보장해줍니다. 제 경험상, 도커를 도입한 후 프로젝트 배포 시간이 눈에 띄게 줄었고, 팀원 간의 협업 효율성도 크게 향상되었습니다.
이 글에서는 도커의 기본적인 개념부터 시작해서, 실제 활용 사례까지 차근차근 알아볼 예정입니다. 프로그래밍 경험이 많지 않더라도 걱정 마세요! 초보자도 쉽게 이해할 수 있도록 친절하게 설명해 드리겠습니다. 도커의 세계로 함께 떠나볼까요?
본론 1: Docker란 무엇인가? 컨테이너 기술의 핵심
컨테이너 vs. 가상 머신: 차이점 이해하기
도커를 이해하기 전에 컨테이너와 가상 머신(VM)의 차이점을 알아야 합니다. 가상 머신은 하이퍼바이저를 사용하여 하드웨어 리소스를 가상화하고, 각 VM은 독립적인 운영체제를 가지고 있습니다. 반면, 컨테이너는 운영체제 커널을 공유하며, 애플리케이션과 필요한 라이브러리, 설정 파일만 포함합니다.
쉽게 말해서, 가상 머신은 집 한 채를 통째로 빌려서 사용하는 것과 같고, 컨테이너는 아파트의 한 호를 빌려서 사용하는 것과 같습니다. 컨테이너는 가상 머신보다 훨씬 가볍고 빠르며, 리소스 효율성도 높습니다. 실제로 사용해보니, 가상 머신을 여러 개 띄우는 것보다 컨테이너를 여러 개 띄우는 것이 훨씬 효율적이었습니다.
Docker 아키텍처: 이미지, 컨테이너, 레지스트리
도커는 크게 세 가지 요소로 구성됩니다. 이미지는 컨테이너를 만들기 위한 템플릿과 같습니다. 애플리케이션, 라이브러리, 설정 파일 등을 포함하고 있습니다. 컨테이너는 이미지를 기반으로 실행되는 격리된 환경입니다. 이미지를 실행하면 컨테이너가 생성됩니다. 레지스트리는 이미지를 저장하고 공유하는 저장소입니다. Docker Hub가 대표적인 공개 레지스트리입니다.
도커 이미지는 마치 설계도와 같습니다. 이 설계도를 바탕으로 실제로 건물을 짓는 것이 컨테이너이고, 설계도를 보관하는 곳이 레지스트리라고 생각하면 이해하기 쉽습니다. Docker Hub에는 수많은 공식 이미지가 존재하며, 필요에 따라 직접 이미지를 만들 수도 있습니다.
본론 2: Docker 설치 및 기본 명령어
Docker Desktop 설치: 환경 구축의 첫걸음
도커를 사용하기 위해서는 먼저 Docker Desktop을 설치해야 합니다. Docker Desktop은 Windows, macOS, Linux 등 다양한 운영체제를 지원하며, 도커 엔진, 도커 CLI, Docker Compose 등 필요한 모든 도구를 포함하고 있습니다. Docker 공식 웹사이트에서 운영체제에 맞는 버전을 다운로드하여 설치하면 됩니다.
설치가 완료되면 터미널 또는 명령 프롬프트에서 `docker –version` 명령어를 실행하여 도커가 정상적으로 설치되었는지 확인할 수 있습니다. 제대로 설치되었다면 도커 버전 정보가 출력될 것입니다.
Docker 기본 명령어: 이미지 관리, 컨테이너 실행
도커를 사용하기 위한 기본적인 명령어 몇 가지를 살펴보겠습니다.
- `docker pull <이미지 이름>`: 레지스트리에서 이미지를 다운로드합니다.
- `docker images`: 로컬에 저장된 이미지 목록을 보여줍니다.
- `docker run <이미지 이름>`: 이미지를 기반으로 컨테이너를 실행합니다.
- `docker ps`: 실행 중인 컨테이너 목록을 보여줍니다.
- `docker stop <컨테이너 ID>`: 실행 중인 컨테이너를 중지합니다.
- `docker rm <컨테이너 ID>`: 컨테이너를 삭제합니다.
예를 들어, `docker pull ubuntu` 명령어를 실행하면 Docker Hub에서 Ubuntu 이미지를 다운로드할 수 있습니다. 그리고 `docker run -it ubuntu bash` 명령어를 실행하면 Ubuntu 컨테이너를 실행하고, 컨테이너 내부의 bash 셸에 접속할 수 있습니다. `-it` 옵션은 interactive 모드를 활성화하고, 터미널을 컨테이너에 연결해줍니다.
본론 3: Dockerfile 작성 및 이미지 빌드
Dockerfile이란 무엇인가? 이미지 생성을 위한 레시피
Dockerfile은 도커 이미지를 만들기 위한 설정 파일입니다. 이 파일에는 베이스 이미지, 필요한 라이브러리, 설정 파일, 실행 명령어 등 이미지를 구성하는 모든 정보가 담겨 있습니다. Dockerfile을 사용하면 이미지를 재현 가능하고 일관성 있게 만들 수 있습니다.
Dockerfile은 마치 요리 레시피와 같습니다. 레시피에 따라 재료를 준비하고, 조리 과정을 거쳐서 맛있는 음식을 만드는 것처럼, Dockerfile에 따라 베이스 이미지를 선택하고, 필요한 설정을 추가하고, 애플리케이션을 설치하여 도커 이미지를 만들 수 있습니다.
Dockerfile 작성 예시: Python 애플리케이션 이미지 만들기
간단한 Python 애플리케이션을 위한 Dockerfile 예시를 보여드리겠습니다.
“`dockerfile
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install –no-cache-dir -r requirements.txt
COPY . .
CMD [“python”, “app.py”]
“`
이 Dockerfile은 다음과 같은 작업을 수행합니다.
- `FROM python:3.9-slim-buster`: Python 3.9 기반 이미지를 베이스 이미지로 사용합니다.
- `WORKDIR /app`: 컨테이너 내부의 작업 디렉토리를 /app으로 설정합니다.
- `COPY requirements.txt .`: requirements.txt 파일을 컨테이너의 /app 디렉토리로 복사합니다.
- `RUN pip install –no-cache-dir -r requirements.txt`: requirements.txt 파일에 정의된 Python 패키지를 설치합니다.
- `COPY . .`: 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사합니다.
- `CMD [“python”, “app.py”]`: 컨테이너가 시작될 때 app.py 파일을 실행합니다.
이미지 빌드: Dockerfile을 이미지로 변환하기
Dockerfile을 작성한 후에는 `docker build` 명령어를 사용하여 이미지를 빌드해야 합니다.
“`bash
docker build -t my-python-app .
“`
`-t` 옵션은 이미지에 태그(이름)을 지정하는 데 사용됩니다. 위 명령어는 현재 디렉토리에 있는 Dockerfile을 사용하여 “my-python-app”이라는 이름의 이미지를 빌드합니다. 빌드 과정이 완료되면 `docker images` 명령어를 사용하여 이미지가 정상적으로 생성되었는지 확인할 수 있습니다.
본론 4: Docker Compose를 활용한 다중 컨테이너 관리
Docker Compose란 무엇인가? 복잡한 애플리케이션 배포를 쉽게
Docker Compose는 여러 개의 컨테이너로 구성된 애플리케이션을 정의하고 실행하는 데 사용되는 도구입니다. 예를 들어, 웹 애플리케이션, 데이터베이스, 캐시 서버 등을 개별 컨테이너로 구성하고, 이들을 하나의 그룹으로 관리할 수 있습니다. Docker Compose를 사용하면 복잡한 애플리케이션 배포를 훨씬 간편하게 할 수 있습니다.
개인적으로는 Docker Compose를 사용하기 전에는 여러 개의 컨테이너를 일일이 실행하고 관리하는 것이 번거로웠습니다. 하지만 Docker Compose를 사용한 후에는 YAML 파일 하나로 모든 컨테이너를 정의하고, 간단한 명령어로 애플리케이션을 실행할 수 있게 되었습니다.
docker-compose.yml 작성 예시: 웹 애플리케이션, 데이터베이스
Docker Compose 설정 파일인 `docker-compose.yml` 예시를 보여드리겠습니다.
“`yaml
version: “3.9”
services:
web:
image: nginx:latest
ports:
– “80:80”
volumes:
– ./html:/usr/share/nginx/html
depends_on:
– db
db:
image: mysql:8.0
environment:
MYSQL_ROOT_PASSWORD: password
ports:
– “3306:3306”
“`
이 `docker-compose.yml` 파일은 다음과 같은 서비스를 정의합니다.
- web: Nginx 웹 서버를 실행하는 컨테이너입니다. 호스트의 80번 포트를 컨테이너의 80번 포트에 연결하고, 호스트의 `./html` 디렉토리를 컨테이너의 `/usr/share/nginx/html` 디렉토리에 마운트합니다. 또한, `db` 서비스에 의존성을 설정하여 `db` 서비스가 먼저 실행되도록 합니다.
- db: MySQL 8.0 데이터베이스를 실행하는 컨테이너입니다. MySQL 루트 비밀번호를 설정하고, 호스트의 3306번 포트를 컨테이너의 3306번 포트에 연결합니다.
애플리케이션 실행: docker-compose up
`docker-compose.yml` 파일을 작성한 후에는 `docker-compose up` 명령어를 사용하여 애플리케이션을 실행할 수 있습니다.
“`bash
docker-compose up -d
“`
`-d` 옵션은 detached 모드로 실행하여 컨테이너를 백그라운드에서 실행합니다. 위 명령어를 실행하면 `docker-compose.yml` 파일에 정의된 모든 서비스를 순서대로 실행합니다. 모든 컨테이너가 정상적으로 실행되면 웹 브라우저에서 `http://localhost`에 접속하여 웹 애플리케이션을 확인할 수 있습니다.
결론: Docker, 이제 여러분의 개발 도구 상자에 추가하세요!
지금까지 도커의 기본적인 개념부터 시작해서, 설치, 기본 명령어, Dockerfile 작성, Docker Compose 활용까지 살펴보았습니다. 처음에는 복잡하게 느껴질 수도 있지만, 꾸준히 연습하고 활용하다 보면 도커의 강력함을 직접 체감할 수 있을 것입니다.
도커는 현대적인 소프트웨어 개발과 배포에 있어서 필수적인 기술입니다. 도커를 사용하면 개발 환경과 운영 환경의 차이를 줄이고, 애플리케이션 배포를 자동화하고, 리소스 효율성을 높일 수 있습니다. 이제 여러분도 도커를 활용하여 개발 생산성을 향상시키고, 더욱 안정적인 애플리케이션을 배포해보세요!
다음 단계로는 도커 네트워크, 도커 볼륨, 도커 스웜 등 더 고급 기술을 학습해 보세요. 또한, 도커를 CI/CD 파이프라인에 통합하여 애플리케이션 개발 워크플로우를 자동화하는 것도 좋은 방법입니다. 끊임없이 배우고 적용하면서 도커 전문가로 성장하시기를 응원합니다!
“`