“`html
Docker 입문: 컨테이너 기술로 개발 환경 구축하기
소프트웨어 개발에서 일관된 개발 환경을 구축하는 것은 매우 중요합니다. 개발, 테스트, 배포 환경이 다르면 예상치 못한 문제가 발생할 수 있으며, 이는 생산성을 저하시키는 주요 원인이 됩니다. 이러한 문제를 해결하기 위해 컨테이너 기술이 등장했고, 그 중심에 Docker가 있습니다. Docker는 개발 환경을 격리된 컨테이너로 패키징하여, 어디서든 동일하게 실행될 수 있도록 해줍니다. 이번 글에서는 Docker의 기본 개념부터 실제 사용 방법까지 자세히 알아보겠습니다.
Docker란 무엇인가?
Docker는 컨테이너 기반의 오픈소스 가상화 플랫폼입니다. 간단히 말해, 애플리케이션과 그 종속성을 포함하는 격리된 환경을 만들어 줍니다. 이 컨테이너는 운영체제 위에 구축되지만, 기존 가상 머신(VM)과 달리 훨씬 가볍고 빠릅니다. Docker를 사용하면 개발자는 애플리케이션이 어떤 환경에서든 동일하게 작동한다는 것을 보장할 수 있습니다. 제 경험상, Docker를 도입한 후 개발 환경 문제로 인한 시간을 훨씬 절약할 수 있었습니다.
Docker의 핵심 개념
Docker를 이해하기 위해서는 몇 가지 핵심 개념을 알아야 합니다.
- 이미지(Image): 컨테이너를 만들기 위한 읽기 전용 템플릿입니다. 애플리케이션, 라이브러리, 설정 파일 등을 포함합니다.
- 컨테이너(Container): 이미지를 기반으로 실행되는 격리된 환경입니다. 이미지는 컨테이너의 설계도와 같고, 컨테이너는 실제로 실행되는 인스턴스입니다.
- Dockerfile: 이미지를 만들기 위한 명령어들이 담긴 텍스트 파일입니다. Dockerfile을 통해 이미지를 자동으로 빌드할 수 있습니다.
- Docker Hub: Docker 이미지를 공유하고 관리할 수 있는 클라우드 기반의 레지스트리입니다.
이러한 핵심 개념을 이해하는 것이 Docker를 효과적으로 사용하기 위한 첫걸음입니다.
Docker가 왜 필요할까?
Docker는 개발, 테스트, 배포 과정을 단순화하고 자동화하는 데 큰 도움이 됩니다. 개발 환경과 운영 환경의 불일치 문제를 해결하고, 애플리케이션의 이식성을 높여줍니다. 또한, 마이크로서비스 아키텍처를 구축하고 관리하는 데 필수적인 도구입니다. 개인적으로는, Docker 덕분에 복잡한 프로젝트의 협업 효율성이 크게 향상되었습니다.
Docker 설치 및 기본 명령어
이제 Docker를 실제로 설치하고 기본적인 명령어를 사용해 보겠습니다.
Docker 설치 방법
Docker는 Windows, macOS, Linux 등 다양한 운영체제에서 설치할 수 있습니다. 각 운영체제에 맞는 설치 방법을 Docker 공식 웹사이트 (https://docs.docker.com/) 에서 확인할 수 있습니다. Windows의 경우 Docker Desktop을 설치하면 편리하게 Docker를 사용할 수 있습니다. 실제로 사용해보니, Docker Desktop은 GUI 환경을 제공하여 Docker를 처음 접하는 사용자에게 특히 유용합니다.
기본적인 Docker 명령어
Docker를 설치했다면, 터미널 또는 명령 프롬프트에서 다음과 같은 기본적인 명령어를 사용할 수 있습니다.
docker version
: Docker 버전 정보 확인docker images
: 로컬에 저장된 이미지 목록 확인docker ps
: 실행 중인 컨테이너 목록 확인docker run [이미지 이름]
: 새로운 컨테이너 실행docker stop [컨테이너 ID]
: 실행 중인 컨테이너 중지docker rm [컨테이너 ID]
: 컨테이너 삭제
이러한 명령어들을 통해 Docker 이미지를 관리하고 컨테이너를 실행, 중지, 삭제할 수 있습니다. 처음에는 명령어가 어색할 수 있지만, 꾸준히 사용하다 보면 금방 익숙해질 것입니다.
Dockerfile 작성 및 이미지 빌드
Dockerfile은 Docker 이미지를 만들기 위한 레시피와 같습니다. Dockerfile에 정의된 명령어를 순서대로 실행하여 이미지를 빌드할 수 있습니다.
Dockerfile 기본 문법
Dockerfile은 다음과 같은 기본적인 문법을 따릅니다.
FROM [이미지 이름]
: 기반 이미지 지정RUN [명령어]
: 이미지를 빌드할 때 실행할 명령어COPY [원본 경로] [대상 경로]
: 파일을 이미지에 복사WORKDIR [경로]
: 작업 디렉토리 설정EXPOSE [포트 번호]
: 컨테이너가 노출할 포트 지정CMD [명령어]
: 컨테이너가 시작될 때 실행할 명령어
이러한 명령어들을 조합하여 애플리케이션에 필요한 환경을 구축할 수 있습니다.
간단한 예제 Dockerfile
다음은 간단한 Python 애플리케이션을 위한 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은 Python 3.9 이미지를 기반으로 하고, requirements.txt
에 정의된 패키지를 설치하고, 현재 디렉토리의 모든 파일을 복사한 후 app.py
를 실행합니다.
이미지 빌드 및 실행
Dockerfile을 작성했다면, 다음과 같은 명령어를 사용하여 이미지를 빌드할 수 있습니다.
docker build -t my-python-app .
-t
옵션은 이미지에 태그(이름)을 지정하는 것이고, .
은 현재 디렉토리를 의미합니다. 이미지가 빌드되면, 다음과 같은 명령어로 컨테이너를 실행할 수 있습니다.
docker run -p 8000:8000 my-python-app
-p
옵션은 호스트의 8000번 포트를 컨테이너의 8000번 포트에 매핑하는 것입니다. 이제 웹 브라우저에서 localhost:8000
에 접속하면 애플리케이션을 확인할 수 있습니다.
Docker Compose를 이용한 다중 컨테이너 관리
Docker Compose는 여러 개의 Docker 컨테이너를 정의하고 관리하기 위한 도구입니다. Docker Compose를 사용하면 복잡한 애플리케이션을 구성하는 여러 컨테이너를 하나의 파일로 정의하고, 한 번의 명령어로 전체 애플리케이션을 실행할 수 있습니다.
Docker Compose 파일 작성
Docker Compose 설정은 docker-compose.yml
파일에 정의합니다. 다음은 간단한 웹 애플리케이션과 데이터베이스를 위한 Docker Compose 파일 예제입니다.
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
이 파일은 Nginx 웹 서버와 MySQL 데이터베이스를 정의합니다. depends_on
옵션을 사용하여 컨테이너 간의 의존성을 설정할 수 있습니다.
Docker Compose 명령어
docker-compose.yml
파일을 작성했다면, 다음과 같은 명령어를 사용하여 애플리케이션을 실행할 수 있습니다.
docker-compose up -d
up
명령어는 정의된 모든 컨테이너를 시작하고, -d
옵션은 백그라운드에서 실행하는 것을 의미합니다. 애플리케이션을 중지하려면 다음과 같은 명령어를 사용합니다.
docker-compose down
Docker Compose를 사용하면 여러 컨테이너로 구성된 복잡한 애플리케이션을 훨씬 쉽게 관리할 수 있습니다. 제 경험상, 마이크로서비스 아키텍처를 개발할 때 Docker Compose는 필수적인 도구입니다.
결론
이번 글에서는 Docker의 기본적인 개념부터 Dockerfile 작성, Docker Compose를 이용한 다중 컨테이너 관리까지 다양한 내용을 다루었습니다. Docker는 개발 환경을 표준화하고 애플리케이션의 이식성을 높이는 데 매우 유용한 도구입니다. Docker를 통해 개발 생산성을 향상시키고, 더 안정적인 애플리케이션을 배포할 수 있습니다.
다음 단계로는 Docker Hub를 이용하여 이미지를 공유하거나, CI/CD 파이프라인에 Docker를 통합하는 것을 고려해 볼 수 있습니다. Docker는 끊임없이 발전하고 있으며, 앞으로 더 많은 가능성을 제공할 것입니다. 꾸준히 학습하고 활용하여 개발 역량을 향상시키시길 바랍니다.
“`