“`html
Docker 입문: 개발 환경을 컨테이너로 구축하는 방법
서론: Docker, 왜 알아야 할까요?
최근 몇 년간 Docker는 소프트웨어 개발 방식에 혁명을 가져왔습니다. 예전에는 개발 환경을 설정하는 데 많은 시간과 노력이 필요했지만, Docker를 사용하면 몇 분 만에 일관되고 격리된 환경을 구축할 수 있습니다. 팀원 간의 환경 차이로 인해 발생하는 “내 컴퓨터에서는 잘 되는데…”라는 악몽에서 벗어날 수 있게 해주는 것이죠. 뿐만 아니라, 클라우드 환경에 배포할 때도 Docker 컨테이너를 사용하면 훨씬 더 쉽고 안정적으로 배포할 수 있습니다. 이러한 이유로, 개발자라면 Docker를 알아두는 것이 필수적이라고 할 수 있습니다.
이 글에서는 Docker의 기본적인 개념부터 시작하여 실제로 Docker를 사용하여 개발 환경을 구축하는 방법까지 단계별로 안내해 드리겠습니다. 초보자도 쉽게 따라할 수 있도록 최대한 친절하고 자세하게 설명할 예정입니다.
Docker란 무엇일까요?
컨테이너란 무엇일까요?
Docker를 이해하려면 먼저 컨테이너의 개념을 알아야 합니다. 컨테이너는 애플리케이션과 그 애플리케이션이 실행되는 데 필요한 모든 것 (코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정 등)을 포함하는 패키지입니다. 마치 짐을 싸서 여행을 떠나는 것과 같습니다. 필요한 모든 것을 하나의 상자에 담아 어디든 가져갈 수 있는 것처럼요.
컨테이너는 운영체제 수준에서 가상화되기 때문에 VM(Virtual Machine)보다 훨씬 가볍고 빠릅니다. VM은 전체 운영체제를 가상화하는 반면, 컨테이너는 호스트 운영체제의 커널을 공유하기 때문입니다. 그래서 컨테이너는 더 적은 리소스를 사용하고, 더 빠르게 시작하고 중지할 수 있습니다.
Docker의 핵심 개념
Docker는 컨테이너를 만들고 관리하기 위한 플랫폼입니다. Docker의 핵심 개념은 다음과 같습니다.
- Docker Image: 컨테이너를 만들기 위한 템플릿입니다. 애플리케이션과 그 애플리케이션이 실행되는 데 필요한 모든 것을 정의합니다. 이미지는 읽기 전용이며, 변경할 수 없습니다.
- Docker Container: Docker 이미지의 실행 가능한 인스턴스입니다. 이미지를 기반으로 만들어지며, 애플리케이션이 실제로 실행되는 환경입니다. 컨테이너는 독립적으로 실행되며, 다른 컨테이너에 영향을 미치지 않습니다.
- Docker Hub: Docker 이미지를 저장하고 공유하기 위한 클라우드 기반 레지스트리입니다. 다양한 오픈 소스 이미지를 사용할 수 있으며, 자신만의 이미지를 업로드하고 공유할 수도 있습니다.
Docker 설치 및 기본 명령어
Docker 설치하기
Docker는 Windows, macOS, Linux 등 다양한 운영체제에서 사용할 수 있습니다. Docker 공식 웹사이트 (https://www.docker.com/)에서 운영체제에 맞는 Docker Desktop을 다운로드하여 설치할 수 있습니다. 설치 과정은 간단하며, 웹사이트의 안내를 따라 진행하면 됩니다.
Docker 기본 명령어 익히기
Docker를 사용하려면 몇 가지 기본적인 명령어를 알아야 합니다. 다음은 가장 많이 사용되는 Docker 명령어입니다.
- `docker pull [이미지 이름]`: Docker Hub에서 이미지를 다운로드합니다. 예를 들어, `docker pull ubuntu`는 Ubuntu 이미지를 다운로드합니다.
- `docker run [이미지 이름]`: 이미지를 기반으로 컨테이너를 실행합니다. 예를 들어, `docker run -it ubuntu bash`는 Ubuntu 컨테이너를 실행하고 bash 쉘에 접속합니다. `-it` 옵션은 interactive terminal을 활성화하여 컨테이너와 상호 작용할 수 있게 해줍니다.
- `docker ps`: 실행 중인 컨테이너 목록을 보여줍니다.
- `docker ps -a`: 모든 컨테이너 목록 (실행 중인 컨테이너와 중지된 컨테이너 모두)을 보여줍니다.
- `docker stop [컨테이너 ID]`: 컨테이너를 중지합니다. 컨테이너 ID는 `docker ps` 명령어를 사용하여 확인할 수 있습니다.
- `docker rm [컨테이너 ID]`: 컨테이너를 삭제합니다.
- `docker images`: 로컬에 저장된 이미지 목록을 보여줍니다.
이 명령어들을 익히면 Docker를 사용하여 컨테이너를 실행하고 관리하는 데 필요한 기본적인 작업을 수행할 수 있습니다. 제 경험상, 처음에는 낯설 수 있지만, 꾸준히 사용하다 보면 익숙해질 것입니다.
Docker를 이용한 개발 환경 구축 예시: Python
Dockerfile 작성하기
이제 실제로 Docker를 사용하여 Python 개발 환경을 구축해 보겠습니다. 먼저, Dockerfile을 작성해야 합니다. Dockerfile은 Docker 이미지를 만들기 위한 명령어들을 담고 있는 텍스트 파일입니다. 다음은 간단한 Python Dockerfile 예시입니다.
FROM python:3.9-slim-buster
WORKDIR /app
COPY requirements.txt .
RUN pip install -r requirements.txt
COPY . .
CMD ["python", "app.py"]
각 라인의 의미는 다음과 같습니다.
- `FROM python:3.9-slim-buster`: Python 3.9 이미지를 기반으로 이미지를 만듭니다. `slim-buster`는 이미지 크기를 줄이기 위해 최소한의 패키지만 포함된 버전입니다.
- `WORKDIR /app`: 컨테이너 내부에서 작업 디렉토리를 `/app`으로 설정합니다.
- `COPY requirements.txt .`: 로컬의 `requirements.txt` 파일을 컨테이너의 `/app` 디렉토리로 복사합니다. `requirements.txt` 파일은 Python 프로젝트에 필요한 패키지 목록을 담고 있습니다.
- `RUN pip install -r requirements.txt`: `requirements.txt` 파일에 정의된 패키지들을 설치합니다.
- `COPY . .`: 로컬의 모든 파일을 컨테이너의 `/app` 디렉토리로 복사합니다.
- `CMD [“python”, “app.py”]`: 컨테이너가 시작될 때 `app.py` 파일을 실행합니다.
Docker 이미지 빌드 및 컨테이너 실행
Dockerfile을 작성한 후에는 다음 명령어를 사용하여 Docker 이미지를 빌드할 수 있습니다.
docker build -t my-python-app .
`-t` 옵션은 이미지에 태그를 지정하는 데 사용됩니다. 이 예에서는 `my-python-app`이라는 태그를 지정했습니다. `.`은 현재 디렉토리에 있는 Dockerfile을 사용하겠다는 의미입니다.
이미지가 성공적으로 빌드되면 다음 명령어를 사용하여 컨테이너를 실행할 수 있습니다.
docker run -it my-python-app
이 명령어를 실행하면 Docker 컨테이너가 시작되고, `app.py` 파일이 실행됩니다. 개인적으로는, Docker를 사용하여 개발 환경을 구축하면 여러 프로젝트를 동시에 진행할 때 환경 충돌 없이 작업할 수 있어서 매우 편리했습니다.
Docker Compose 활용: 복잡한 환경 관리
Docker Compose란 무엇일까요?
Docker Compose는 여러 개의 컨테이너를 정의하고 관리하기 위한 도구입니다. 예를 들어, 웹 애플리케이션은 웹 서버, 데이터베이스, 캐시 서버 등 여러 개의 컨테이너로 구성될 수 있습니다. Docker Compose를 사용하면 이러한 컨테이너들을 하나의 파일에 정의하고, 한 번의 명령어로 모든 컨테이너를 시작하고 중지할 수 있습니다.
docker-compose.yml 파일 작성 예시
다음은 Docker Compose 파일을 작성하는 예시입니다. 다음은 웹 애플리케이션, 데이터베이스, 캐시 서버를 포함하는 간단한 `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
volumes:
- db_data:/var/lib/mysql
volumes:
db_data:
각 서비스에 대한 설명은 다음과 같습니다.
- `web`: Nginx 웹 서버를 실행하는 컨테이너입니다. 80번 포트를 호스트의 80번 포트로 매핑하고, 로컬의 `html` 디렉토리를 컨테이너의 `/usr/share/nginx/html` 디렉토리로 마운트합니다. `depends_on` 옵션은 `db` 서비스가 먼저 시작되도록 지정합니다.
- `db`: MySQL 데이터베이스를 실행하는 컨테이너입니다. 환경 변수를 설정하여 MySQL 루트 비밀번호를 설정하고, `db_data` 볼륨을 사용하여 데이터베이스 데이터를 저장합니다.
Docker Compose 명령어 사용하기
`docker-compose.yml` 파일을 작성한 후에는 다음 명령어를 사용하여 모든 컨테이너를 시작할 수 있습니다.
docker-compose up -d
`-d` 옵션은 컨테이너를 detached 모드로 실행하여 백그라운드에서 실행되도록 합니다.
컨테이너를 중지하려면 다음 명령어를 사용합니다.
docker-compose down
Docker Compose를 사용하면 복잡한 환경을 쉽게 관리할 수 있습니다. 실제로 사용해보니, 여러 컨테이너 간의 의존성을 관리하고, 전체 애플리케이션 스택을 쉽게 배포할 수 있어서 개발 생산성이 크게 향상되었습니다.
결론: Docker를 통해 더욱 효율적인 개발자가 되세요
이 글에서는 Docker의 기본적인 개념부터 시작하여 실제로 Docker를 사용하여 개발 환경을 구축하는 방법까지 알아보았습니다. Docker는 처음에는 어렵게 느껴질 수 있지만, 꾸준히 사용하다 보면 개발 생산성을 크게 향상시킬 수 있는 강력한 도구입니다. Docker를 통해 “내 컴퓨터에서는 잘 되는데…”라는 문제를 해결하고, 일관되고 안정적인 개발 환경을 구축하여 더욱 효율적인 개발자가 되세요.
다음 단계로는 Dockerfile을 직접 작성해보고, Docker Compose를 사용하여 복잡한 애플리케이션 환경을 구축해 보는 것을 추천합니다. 또한, Docker Hub에서 다양한 이미지를 탐색하고, 자신만의 이미지를 만들어 공유해 보는 것도 좋은 경험이 될 것입니다.
“`