“`html
Docker 입문: 컨테이너 기술의 기초부터 활용까지
서론: 왜 Docker를 배워야 할까요?
현대 소프트웨어 개발에서 Docker는 빼놓을 수 없는 핵심 기술이 되었습니다. Docker는 컨테이너 기반의 가상화 플랫폼으로, 애플리케이션과 그 의존성을 격리된 환경에서 실행할 수 있도록 도와줍니다. 개발 환경, 테스트 환경, 운영 환경을 일관되게 유지할 수 있게 해 주어 “내 컴퓨터에서는 잘 되는데…” 라는 악몽에서 벗어날 수 있게 해줍니다. 또한, 배포 속도를 향상시키고, 자원 활용률을 극대화하며, 애플리케이션의 확장성과 이식성을 높여줍니다. 개인적으로 Docker를 처음 접했을 때 복잡하게 느껴졌지만, 사용하면 사용할수록 개발 생산성을 크게 향상시켜주는 마법 같은 도구라는 것을 깨달았습니다. 이 글에서는 Docker의 기본적인 개념부터 실제 사용 예시까지 초보자도 쉽게 이해할 수 있도록 자세하게 설명해 드리겠습니다.
본론 1: Docker란 무엇인가? 컨테이너 기술의 이해
Docker의 핵심 개념: 이미지와 컨테이너
Docker의 가장 중요한 두 가지 개념은 이미지(Image)와 컨테이너(Container)입니다. 이미지는 애플리케이션 실행에 필요한 모든 것 (코드, 런타임, 시스템 도구, 라이브러리, 설정)을 포함하는 읽기 전용 템플릿입니다. 컨테이너는 이미지의 실행 가능한 인스턴스이며, 이미지로부터 생성됩니다. 마치 클래스와 객체의 관계와 유사하다고 생각하면 이해하기 쉬울 겁니다. 하나의 이미지에서 여러 개의 컨테이너를 생성하여 동시에 실행할 수 있습니다.
컨테이너 기술의 장점
컨테이너 기술은 기존의 가상 머신(Virtual Machine, VM)에 비해 훨씬 가볍고 빠릅니다. VM은 전체 운영체제를 가상화하는 반면, 컨테이너는 호스트 운영체제의 커널을 공유하므로 자원 소비가 적고 부팅 속도가 빠릅니다. 따라서, 컨테이너는 더 많은 애플리케이션을 동일한 하드웨어에서 실행할 수 있게 해줍니다. 제 경험상, VM을 사용할 때보다 Docker 컨테이너를 사용할 때 시스템 자원 활용도가 훨씬 높아졌습니다.
Docker Hub: 이미지 저장소
Docker Hub는 Docker 이미지를 공유하고 관리할 수 있는 클라우드 기반의 레지스트리 서비스입니다. 다양한 오픈소스 이미지를 다운로드하여 사용할 수 있으며, 자신만의 이미지를 만들어 업로드할 수도 있습니다. Docker Hub를 이용하면 필요한 이미지를 쉽게 찾고 공유할 수 있어 개발 효율성을 높일 수 있습니다. 개인적으로는 Docker Hub를 통해 다양한 데이터베이스 이미지 (MySQL, PostgreSQL 등)를 편리하게 사용하고 있습니다.
본론 2: Docker 설치 및 기본 명령어
Docker 설치 방법 (Windows, macOS, Linux)
Docker는 Windows, macOS, Linux 등 다양한 운영체제에서 사용할 수 있습니다. 각 운영체제에 맞는 Docker Desktop을 설치하면 Docker 엔진, Docker CLI, Docker Compose 등을 함께 사용할 수 있습니다. Docker Desktop은 Docker Hub 계정과 연동하여 이미지를 다운로드하고 업로드하는 기능을 제공합니다. 설치 방법은 Docker 공식 웹사이트에 자세히 설명되어 있으며, 운영체제에 맞는 설치 가이드를 따라하면 됩니다.
필수 Docker 명령어
Docker를 사용하기 위해 알아야 할 기본적인 명령어는 다음과 같습니다.
docker pull <이미지 이름>
: Docker Hub에서 이미지를 다운로드합니다.docker run <이미지 이름>
: 이미지를 기반으로 컨테이너를 생성하고 실행합니다.docker ps
: 실행 중인 컨테이너 목록을 보여줍니다.docker stop <컨테이너 ID>
: 컨테이너를 중지합니다.docker rm <컨테이너 ID>
: 컨테이너를 삭제합니다.docker images
: 로컬에 저장된 이미지 목록을 보여줍니다.docker rmi <이미지 ID>
: 이미지를 삭제합니다.
이 명령어들을 숙지하면 Docker를 사용하는 데 필요한 기본적인 작업을 수행할 수 있습니다. 실제로 사용해보니, 명령어들을 자주 사용하면서 자연스럽게 익숙해지게 되었습니다.
Docker 컨테이너 포트 포워딩
컨테이너 내부에서 실행되는 애플리케이션에 접근하기 위해서는 호스트 머신과 컨테이너 간의 포트 포워딩이 필요합니다. docker run
명령어에 -p
옵션을 사용하여 포트 포워딩을 설정할 수 있습니다. 예를 들어, docker run -p 8080:80 nginx
는 호스트 머신의 8080 포트를 컨테이너 내부의 80 포트에 연결합니다. 이렇게 설정하면 웹 브라우저에서 localhost:8080
으로 접속하여 컨테이너 내부의 웹 서버에 접근할 수 있습니다.
본론 3: Dockerfile 작성 및 이미지 빌드
Dockerfile이란 무엇인가?
Dockerfile은 Docker 이미지를 만들기 위한 명령어들을 담고 있는 텍스트 파일입니다. Dockerfile을 사용하면 애플리케이션 실행에 필요한 모든 단계를 정의하고 자동화할 수 있습니다. Dockerfile은 이미지 생성 과정을 문서화하고 재현 가능하게 만들어줍니다.
Dockerfile 작성 방법
Dockerfile은 다음과 같은 형식으로 작성됩니다.
FROM ubuntu:latest
RUN apt-get update && apt-get install -y nginx
COPY ./index.html /var/www/html/
EXPOSE 80
CMD ["nginx", "-g", "daemon off;"]
위 예제는 Ubuntu 최신 이미지를 기반으로 Nginx 웹 서버를 설치하고, index.html
파일을 복사하여 Nginx를 실행하는 Dockerfile입니다. 각 명령어의 의미는 다음과 같습니다.
FROM
: 베이스 이미지를 지정합니다.RUN
: 이미지를 빌드하는 동안 명령어를 실행합니다.COPY
: 파일을 이미지에 복사합니다.EXPOSE
: 컨테이너가 노출할 포트를 지정합니다.CMD
: 컨테이너가 시작될 때 실행할 명령어를 지정합니다.
Docker 이미지 빌드
Dockerfile을 작성한 후에는 docker build
명령어를 사용하여 이미지를 빌드할 수 있습니다. docker build -t <이미지 이름> .
명령어를 실행하면 현재 디렉터리의 Dockerfile을 사용하여 이미지를 빌드합니다. -t
옵션은 이미지에 태그 (이름)를 지정하는 데 사용됩니다.
본론 4: Docker Compose를 활용한 다중 컨테이너 관리
Docker Compose란 무엇인가?
Docker Compose는 여러 개의 Docker 컨테이너를 하나의 애플리케이션으로 정의하고 관리하기 위한 도구입니다. 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
위 예제에서는 web
서비스와 db
서비스를 정의했습니다. web
서비스는 Nginx 이미지를 사용하고, db
서비스는 MySQL 이미지를 사용합니다. depends_on
옵션을 사용하여 web
서비스가 db
서비스에 의존한다는 것을 명시했습니다.
Docker Compose 명령어
Docker Compose를 사용하기 위한 기본적인 명령어는 다음과 같습니다.
docker-compose up
:docker-compose.yml
파일에 정의된 모든 서비스를 시작합니다.docker-compose down
: 모든 서비스를 중지하고 삭제합니다.docker-compose ps
: 실행 중인 서비스 목록을 보여줍니다.docker-compose logs <서비스 이름>
: 특정 서비스의 로그를 보여줍니다.
결론: Docker, 개발 생산성을 높이는 강력한 도구
Docker는 현대 소프트웨어 개발에 필수적인 기술이 되었습니다. 컨테이너 기술을 통해 애플리케이션의 이식성, 확장성, 자원 활용률을 높일 수 있으며, 개발 환경을 일관되게 유지할 수 있습니다. 이 글에서는 Docker의 기본적인 개념, 설치 방법, 명령어, Dockerfile 작성, Docker Compose 활용법 등을 다루었습니다. Docker는 처음에는 어렵게 느껴질 수 있지만, 꾸준히 사용하다 보면 개발 생산성을 크게 향상시킬 수 있는 강력한 도구입니다. 다음 단계로는 Docker를 활용하여 실제 애플리케이션을 개발하고 배포하는 연습을 해보는 것을 추천합니다. 클라우드 환경 (AWS, Azure, GCP)에서 Docker를 사용하는 방법도 학습하면 더욱 폭넓게 활용할 수 있을 것입니다.
“`