“`html
처음 배우는 Docker: 개발 환경 구축부터 배포까지 완벽 가이드
개발자라면 누구나 개발 환경 설정의 어려움을 한 번쯤은 겪어봤을 겁니다. 운영체제, 라이브러리 버전, 의존성 문제 등 다양한 요소들이 복잡하게 얽혀 있어 예상치 못한 오류가 발생하기도 하죠. 이러한 문제를 해결하고 개발 효율성을 극대화할 수 있는 강력한 도구가 바로 Docker입니다. 이 글에서는 Docker의 기본 개념부터 활용 방법까지 초보자도 쉽게 이해할 수 있도록 자세히 설명하겠습니다. 제 경험상, Docker는 개발 생산성을 획기적으로 향상시켜주는 마법 같은 도구입니다.
Docker란 무엇일까요?
Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정 등)을 담고 있는 격리된 공간입니다. 이러한 컨테이너를 사용하면 개발, 테스트, 배포 환경에 상관없이 일관된 방식으로 애플리케이션을 실행할 수 있습니다.
컨테이너와 가상 머신의 차이점
Docker 컨테이너는 가상 머신(VM)과 유사하지만, 작동 방식에 큰 차이가 있습니다. VM은 운영체제 전체를 가상화하는 반면, 컨테이너는 운영체제의 커널을 공유합니다. 따라서 컨테이너는 VM보다 훨씬 가볍고 빠르며, 시스템 자원을 효율적으로 사용할 수 있습니다. 실제로 사용해보니, Docker 컨테이너는 VM보다 훨씬 빠르게 실행되고 리소스 사용량도 적어서 개발 환경 구축 시간을 단축하는 데 큰 도움이 되었습니다.
Docker의 장점
Docker를 사용하면 다음과 같은 장점을 얻을 수 있습니다.
- 환경 일관성: 개발, 테스트, 배포 환경에서 동일한 환경을 유지하여 예상치 못한 오류를 줄일 수 있습니다.
- 빠른 배포: 컨테이너 이미지를 사용하여 애플리케이션을 빠르게 배포할 수 있습니다.
- 자원 효율성: VM보다 가볍고 리소스 사용량이 적어 효율적인 시스템 운영이 가능합니다.
- 확장성: 컨테이너를 쉽게 복제하고 확장하여 애플리케이션의 확장성을 높일 수 있습니다.
- 이식성: 다양한 플랫폼(Linux, Windows, macOS 등)에서 실행 가능합니다.
Docker 설치 및 기본 명령어
이제 Docker를 설치하고 기본적인 명령어를 사용해 보겠습니다. Docker는 공식 웹사이트에서 운영체제에 맞는 설치 파일을 다운로드하여 설치할 수 있습니다.
Docker 설치
Docker Desktop은 Windows와 macOS에서 Docker를 쉽게 사용할 수 있도록 GUI 환경을 제공합니다. Linux에서는 패키지 관리자를 통해 Docker Engine을 설치할 수 있습니다. Docker 공식 문서에 자세한 설치 방법이 안내되어 있으니 참고하시기 바랍니다.
기본 명령어
Docker 설치가 완료되면 터미널(또는 명령 프롬프트)에서 다음과 같은 기본 명령어를 사용할 수 있습니다.
docker run [이미지 이름]
: 컨테이너 실행docker ps
: 실행 중인 컨테이너 목록 확인docker stop [컨테이너 ID]
: 컨테이너 중지docker images
: 로컬에 저장된 이미지 목록 확인docker pull [이미지 이름]
: Docker Hub에서 이미지 다운로드docker build [Dockerfile 경로]
: Dockerfile을 사용하여 이미지 빌드
예를 들어, 다음 명령어를 실행하면 Docker Hub에서 Ubuntu 이미지를 다운로드하여 컨테이너를 실행할 수 있습니다.
docker run -it ubuntu bash
이 명령어는 Ubuntu 컨테이너를 interactive 모드로 실행하고 bash 쉘을 실행합니다. 컨테이너 안에서 다양한 명령어를 실행하여 Ubuntu 환경을 사용할 수 있습니다.
Dockerfile 작성 및 이미지 빌드
Dockerfile은 Docker 이미지를 만들기 위한 설정 파일입니다. Dockerfile에 애플리케이션 실행에 필요한 모든 명령어와 설정을 정의하여 이미지 빌드를 자동화할 수 있습니다.
Dockerfile 작성 방법
Dockerfile은 다음과 같은 형식을 따릅니다.
FROM [베이스 이미지]
MAINTAINER [작성자]
RUN [명령어]
COPY [로컬 파일] [컨테이너 경로]
WORKDIR [작업 디렉토리]
EXPOSE [포트]
CMD [실행 명령어]
각 명령어는 다음과 같은 의미를 갖습니다.
FROM
: 베이스 이미지 지정MAINTAINER
: 이미지 작성자 정보RUN
: 컨테이너 안에서 실행할 명령어COPY
: 로컬 파일을 컨테이너로 복사WORKDIR
: 작업 디렉토리 설정EXPOSE
: 컨테이너에서 사용할 포트 지정CMD
: 컨테이너 실행 시 실행할 명령어
다음은 간단한 Python 애플리케이션을 위한 Dockerfile 예시입니다.
FROM python:3.9
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
EXPOSE 8000
CMD ["python", "app.py"]
이 Dockerfile은 Python 3.9 이미지를 베이스 이미지로 사용하고, 현재 디렉토리의 모든 파일을 컨테이너의 /app 디렉토리로 복사합니다. 그리고 requirements.txt 파일에 정의된 패키지를 설치하고, 8000번 포트를 열고, app.py 파일을 실행합니다.
이미지 빌드
Dockerfile을 작성한 후에는 다음 명령어를 사용하여 이미지를 빌드할 수 있습니다.
docker build -t [이미지 이름] .
-t
옵션은 이미지에 이름을 지정하는 데 사용됩니다. .
은 Dockerfile이 있는 현재 디렉토리를 나타냅니다. 이미지 빌드가 완료되면 docker images
명령어를 사용하여 빌드된 이미지를 확인할 수 있습니다.
Docker Compose를 사용한 다중 컨테이너 환경 구축
Docker Compose는 여러 개의 컨테이너로 구성된 애플리케이션을 정의하고 관리하기 위한 도구입니다. Docker Compose를 사용하면 복잡한 애플리케이션을 쉽게 구축하고 실행할 수 있습니다.
docker-compose.yml 파일 작성
Docker Compose는 docker-compose.yml
파일을 사용하여 애플리케이션의 컨테이너 구성을 정의합니다. docker-compose.yml
파일은 YAML 형식으로 작성되며, 각 컨테이너의 이미지, 포트, 볼륨, 환경 변수 등을 설정할 수 있습니다.
다음은 간단한 웹 애플리케이션과 데이터베이스를 위한 docker-compose.yml
파일 예시입니다.
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
파일은 nginx 웹 서버와 MySQL 데이터베이스 컨테이너를 정의합니다. web
서비스는 nginx 이미지를 사용하고, 80번 포트를 호스트의 80번 포트에 매핑합니다. db
서비스는 MySQL 8.0 이미지를 사용하고, root 비밀번호를 설정합니다.
애플리케이션 실행
docker-compose.yml
파일을 작성한 후에는 다음 명령어를 사용하여 애플리케이션을 실행할 수 있습니다.
docker-compose up -d
-d
옵션은 detached 모드로 컨테이너를 실행하는 데 사용됩니다. 이 명령어를 실행하면 Docker Compose는 docker-compose.yml
파일에 정의된 모든 컨테이너를 빌드하고 실행합니다. 컨테이너가 실행되면 웹 브라우저에서 http://localhost
에 접속하여 웹 애플리케이션을 확인할 수 있습니다.
결론 및 다음 단계
이 글에서는 Docker의 기본 개념부터 설치, 사용법, Dockerfile 작성, Docker Compose 활용까지 Docker의 핵심 내용을 다루었습니다. Docker는 개발 생산성을 향상시키고 애플리케이션 배포를 간소화하는 강력한 도구입니다. 오늘 배운 내용을 바탕으로 Docker를 활용하여 개발 환경을 구축하고 애플리케이션을 배포해 보시기 바랍니다.
다음 단계로는 다음과 같은 내용을 학습해 보세요.
- Docker Hub를 이용한 이미지 공유
- Docker 네트워크
- Docker 볼륨
- CI/CD 파이프라인에 Docker 통합
Docker는 꾸준히 발전하고 있는 기술이므로 지속적인 학습과 경험을 통해 Docker 전문가로 성장하시길 바랍니다. 개인적으로는 Docker를 처음 접했을 때 어려움을 느꼈지만, 꾸준히 사용하다 보니 이제는 없어서는 안 될 필수 도구가 되었습니다. 여러분도 Docker를 통해 개발의 즐거움을 느껴보세요!
“`