“`html
Docker 입문: 컨테이너 기술로 개발 환경 구축하기
최근 몇 년 동안 Docker는 소프트웨어 개발 및 배포 방식을 혁신적으로 변화시켰습니다. 컨테이너 기술을 통해 개발 환경을 일관성 있게 유지하고, 애플리케이션을 어디서든 쉽게 실행할 수 있게 되었죠. 이 글에서는 Docker의 기본 개념부터 시작하여 실제 개발 환경 구축까지, 초보자도 쉽게 따라 할 수 있도록 자세히 설명합니다.
Docker란 무엇일까요?
Docker는 컨테이너 기반의 오픈소스 플랫폼입니다. 컨테이너는 애플리케이션과 그 실행에 필요한 모든 것(코드, 런타임, 시스템 도구, 시스템 라이브러리, 설정 등)을 패키징하여 격리된 환경에서 실행할 수 있도록 해줍니다. 마치 가상 머신과 비슷하지만, 훨씬 가볍고 빠르다는 장점이 있습니다.
컨테이너와 가상 머신의 차이점
가상 머신(VM)은 하이퍼바이저를 통해 운영체제 전체를 가상화하는 반면, Docker 컨테이너는 호스트 운영체제(OS)의 커널을 공유합니다. 따라서 컨테이너는 VM보다 훨씬 적은 자원을 사용하고, 실행 속도도 빠릅니다. 컨테이너는 애플리케이션 실행에 필요한 최소한의 요소만 포함하기 때문에 이미지 크기가 작고, 배포하기도 용이합니다.
Docker의 주요 장점
- 일관성 있는 개발 환경: 개발, 테스트, 배포 환경을 동일하게 유지하여 환경 문제로 인한 오류를 줄일 수 있습니다.
- 빠른 배포: 컨테이너 이미지를 통해 애플리케이션을 빠르게 배포하고 확장할 수 있습니다.
- 자원 효율성: 가상 머신보다 훨씬 적은 자원을 사용하여 서버 효율성을 높일 수 있습니다.
- 이식성: Docker 이미지는 어디서든 실행 가능하므로, 클라우드, 온프레미스 등 다양한 환경에 쉽게 배포할 수 있습니다.
Docker 설치 및 기본 명령어
이제 Docker를 실제로 설치하고 기본적인 명령어를 사용해 보겠습니다. 설치 방법은 운영체제별로 다르므로, Docker 공식 홈페이지의 설치 가이드를 참고하는 것이 가장 정확합니다.
Docker 설치 방법 (Linux 기준)
대부분의 Linux 배포판에서는 패키지 관리자를 통해 Docker를 쉽게 설치할 수 있습니다. 예를 들어, Ubuntu에서는 다음 명령어를 사용하여 Docker를 설치할 수 있습니다.
sudo apt update
sudo apt install docker.io
sudo systemctl start docker
sudo systemctl enable docker
설치가 완료되면, `docker –version` 명령어를 통해 Docker가 제대로 설치되었는지 확인할 수 있습니다.
Docker 기본 명령어
Docker를 사용하기 위한 몇 가지 기본적인 명령어를 알아두면 편리합니다.
- docker pull [이미지 이름]: Docker Hub에서 이미지를 다운로드합니다.
- docker run [이미지 이름]: 다운로드한 이미지를 사용하여 컨테이너를 실행합니다.
- docker ps: 실행 중인 컨테이너 목록을 보여줍니다.
- docker stop [컨테이너 ID]: 실행 중인 컨테이너를 중지합니다.
- docker rm [컨테이너 ID]: 중지된 컨테이너를 삭제합니다.
- docker images: 로컬에 저장된 이미지 목록을 보여줍니다.
예를 들어, Nginx 웹 서버를 Docker 컨테이너로 실행하려면 다음 명령어를 사용할 수 있습니다.
docker pull nginx
docker run -d -p 80:80 nginx
이 명령어는 Nginx 이미지를 다운로드하고, 80번 포트를 호스트의 80번 포트와 연결하여 백그라운드에서 실행합니다. 웹 브라우저에서 `http://localhost`에 접속하면 Nginx 웹 서버를 확인할 수 있습니다.
Dockerfile 작성 및 이미지 빌드
Dockerfile은 Docker 이미지를 만들기 위한 설정 파일입니다. Dockerfile에 애플리케이션 실행에 필요한 모든 설정(운영체제, 라이브러리, 환경 변수 등)을 정의할 수 있습니다. Dockerfile을 사용하면 개발 환경을 코드 형태로 관리할 수 있어, 재현성과 이식성을 높일 수 있습니다.
Dockerfile 작성 예시 (Python Flask 애플리케이션)
다음은 간단한 Python Flask 애플리케이션을 위한 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` 파일을 컨테이너 내부로 복사합니다.
- `RUN pip install –no-cache-dir -r requirements.txt`: `requirements.txt` 파일에 정의된 Python 패키지를 설치합니다.
- `COPY . .`: 현재 디렉토리의 모든 파일을 컨테이너 내부로 복사합니다.
- `CMD [“python”, “app.py”]`: 컨테이너가 시작될 때 `app.py` 파일을 실행합니다.
Docker 이미지 빌드 및 실행
Dockerfile을 작성했다면, 다음 명령어를 사용하여 Docker 이미지를 빌드할 수 있습니다.
docker build -t my-flask-app .
`-t my-flask-app` 옵션은 이미지에 `my-flask-app`이라는 이름을 붙여줍니다. `.`은 Dockerfile이 있는 현재 디렉토리를 의미합니다.
이미지가 빌드되면, 다음 명령어를 사용하여 컨테이너를 실행할 수 있습니다.
docker run -p 5000:5000 my-flask-app
이 명령어는 호스트의 5000번 포트를 컨테이너의 5000번 포트와 연결하여 컨테이너를 실행합니다. 웹 브라우저에서 `http://localhost:5000`에 접속하면 Flask 애플리케이션을 확인할 수 있습니다.
Docker Compose를 이용한 다중 컨테이너 관리
Docker Compose는 여러 개의 Docker 컨테이너를 정의하고 관리하기 위한 도구입니다. 예를 들어, 웹 애플리케이션과 데이터베이스를 함께 실행해야 하는 경우, Docker Compose를 사용하면 컨테이너 간의 의존성을 정의하고 쉽게 관리할 수 있습니다.
docker-compose.yml 파일 작성
Docker Compose 설정은 `docker-compose.yml` 파일에 정의합니다. 다음은 웹 애플리케이션과 데이터베이스를 함께 실행하는 간단한 `docker-compose.yml` 파일 예시입니다.
version: "3.9"
services:
web:
build: .
ports:
- "5000:5000"
depends_on:
- db
db:
image: postgres:13
environment:
POSTGRES_USER: myuser
POSTGRES_PASSWORD: mypassword
POSTGRES_DB: mydb
이 `docker-compose.yml` 파일은 다음과 같은 내용을 정의합니다.
- `version: “3.9”`: Docker Compose 파일의 버전을 지정합니다.
- `services`: 실행할 컨테이너들을 정의합니다.
- `web`: 웹 애플리케이션 컨테이너를 정의합니다. `build: .`은 현재 디렉토리의 Dockerfile을 사용하여 이미지를 빌드하도록 지정합니다. `ports`는 호스트와 컨테이너의 포트 연결을 정의합니다. `depends_on`은 웹 애플리케이션이 데이터베이스에 의존한다는 것을 나타냅니다.
- `db`: 데이터베이스 컨테이너를 정의합니다. `image: postgres:13`은 PostgreSQL 13 이미지를 사용하도록 지정합니다. `environment`는 데이터베이스 사용자, 비밀번호, 데이터베이스 이름을 설정합니다.
Docker Compose 실행
`docker-compose.yml` 파일이 있는 디렉토리에서 다음 명령어를 실행하여 모든 컨테이너를 시작할 수 있습니다.
docker-compose up -d
`-d` 옵션은 컨테이너를 백그라운드에서 실행하도록 지정합니다. 컨테이너가 실행되면, `docker-compose ps` 명령어를 통해 실행 상태를 확인할 수 있습니다.
실제로 사용해보니 Docker Compose는 여러 컨테이너를 사용하는 복잡한 애플리케이션을 관리하는 데 매우 유용했습니다. 특히 개발 환경에서는 각 컴포넌트를 쉽게 시작하고 중지할 수 있어 생산성을 높이는 데 도움이 되었습니다.
결론 및 다음 단계
이 글에서는 Docker의 기본 개념부터 설치, Dockerfile 작성, Docker Compose를 이용한 다중 컨테이너 관리까지, Docker 입문에 필요한 기본적인 내용을 다루었습니다. Docker는 개발 생산성을 향상시키고, 애플리케이션 배포를 간소화하는 강력한 도구입니다. 제 경험상, Docker를 잘 활용하면 개발 과정에서 발생하는 많은 문제를 해결할 수 있었습니다.
다음 단계로는 다음과 같은 주제를 학습해 보는 것을 추천합니다.
- Docker 네트워크: 컨테이너 간의 통신 방법을 이해하고 네트워크를 구성하는 방법을 학습합니다.
- Docker 볼륨: 컨테이너 내부의 데이터를 영구적으로 저장하는 방법을 학습합니다.
- Docker Hub: Docker 이미지를 공유하고 관리하는 방법을 학습합니다.
- Docker Swarm/Kubernetes: 대규모 컨테이너 오케스트레이션 도구를 학습합니다.
Docker를 꾸준히 사용하고 학습하면서, 여러분의 개발 역량을 한 단계 더 발전시키시길 바랍니다. 이 글이 Docker 입문에 도움이 되었기를 바랍니다.
“`