호스트 네트워크 설정과 함께 Docker Compose 사용 방법

DockerBeginner
지금 연습하기

소개

이 튜토리얼은 LabEx 클라우드 VM 에서 호스트 네트워크 구성을 사용하여 Docker Compose 를 사용하는 방법을 안내합니다. Docker Compose 는 웹 서버와 같은 애플리케이션을 실행하는 가볍고 격리된 환경인 여러 컨테이너를 관리하는 데 도움이 되는 도구입니다. 일반적으로 Docker 는 컨테이너의 네트워크를 호스트 머신 (작업 중인 VM) 에서 격리하지만, 호스트 네트워크 옵션을 사용하면 컨테이너가 호스트의 네트워크를 직접 공유할 수 있습니다. 이는 애플리케이션이 추가 설정 없이 호스트의 포트에 직접 액세스하는 등 호스트에서 직접 실행되는 것처럼 작동해야 할 때 유용합니다. 마지막으로, Docker Compose 를 설정하고, 호스트 네트워킹을 사용하여 간단한 웹 서비스를 생성, 배포 및 테스트합니다. Docker 는 LabEx 환경에 사전 설치되어 있지만, Docker Compose 도 준비되었는지 확인합니다.

이 Lab 은 학습을 위해 인터넷 연결이 필요하므로 Pro 사용자만 VM 을 시작할 수 있습니다. 계정을 Pro 로 업그레이드하세요.

Docker Compose 설정

구성에 들어가기 전에, LabEx 클라우드 VM 에서 Docker Compose 를 사용할 수 있는지 확인해 보겠습니다. Docker 는 사전 설치되어 있지만, 다중 컨테이너 설정을 관리하기 위한 별도의 도구인 Docker Compose 는 설치되어 있지 않을 수 있습니다. 터미널을 사용하여 빠르게 설치하겠습니다.

LabEx VM 에서 터미널을 엽니다. 프롬프트는 /home/labex/project를 표시해야 합니다. 이것이 기본 작업 디렉토리입니다. 다음 명령을 하나씩 실행합니다.

sudo curl -L "https://github.com/docker/compose/releases/download/v2.20.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

docker-compose-install

다음은 각 명령의 역할입니다.

  • curl: 공식 GitHub 릴리스에서 Docker Compose 바이너리를 다운로드합니다. URL 은 $(uname -s)-$(uname -m)을 사용하여 VM 의 시스템 (예: Linux-x86_64) 과 일치시킵니다. 버전 2.20.2 는 안정적이며 광범위하게 호환됩니다.
  • -o /usr/local/bin/docker-compose: 실행 가능한 도구의 표준 위치인 /usr/local/bin에 저장합니다. sudo는 쓰기 권한을 보장합니다.
  • chmod +x: 파일을 실행 가능하게 만들어 명령으로 실행할 수 있도록 합니다. 다시, sudo는 필요한 권한을 부여합니다.

작동했는지 확인하려면 다음을 실행합니다.

docker-compose --version

Docker Compose version v2.20.2와 같은 출력을 볼 수 있습니다. "command not found"가 표시되면 명령을 주의 깊게 다시 실행하십시오. 오타 또는 인터넷 문제를 확인하십시오 (VM 은 다운로드를 위해 웹 액세스가 필요합니다). 이 단계는 다음 단계에서 docker-compose를 사용할 준비가 되었는지 확인합니다.

호스트 네트워크를 사용하여 Docker Compose 파일 생성

이제 Docker Compose 가 준비되었으므로, 호스트 네트워킹을 사용하여 웹 서비스를 실행하기 위한 청사진인 docker-compose.yml 파일을 생성해 보겠습니다. 간단하고 초보자 친화적인 터미널 텍스트 편집기인 nano 를 사용합니다.

파일을 생성하고 편집하려면 다음 단계를 따르세요.

  1. 터미널에서 프로젝트 디렉토리에 있는지 확인합니다.

    cd /home/labex/project
    
  2. nano 로 파일을 생성하고 엽니다.

    nano docker-compose.yml
    
  3. 다음 내용을 nano 에 입력하거나 붙여넣습니다.

version: "3"
services:
  web:
    image: nginx:latest
    network_mode: host

각 부분의 의미는 다음과 같습니다.

  • version: "3": Docker Compose 파일 형식을 설정합니다. 버전 3 은 템플릿을 선택하는 것과 같이 일반적인 표준입니다.
  • services: 프로젝트의 작업자와 같이 실행할 컨테이너 (또는 "서비스") 를 나열합니다.
  • web: 서비스의 이름을 지정합니다. 무엇이든 상관없지만 "web"은 웹 서버에 적합합니다.
  • image: nginx:latest: 소프트웨어를 지정합니다. 인기 있는 웹 서버인 Nginx 를 사용하며, latest는 Docker Hub(컨테이너 이미지 라이브러리) 에서 최신 버전을 가져옵니다.
  • network_mode: host: 핵심 설정입니다. 일반적으로 Docker 는 컨테이너에 자체 개인 네트워크를 제공하여 호스트로부터 격리합니다. host 모드를 사용하면 컨테이너가 VM 의 네트워크를 직접 사용할 수 있으므로 Nginx 는 추가 단계 없이 호스트의 포트 (예: 80) 에 액세스할 수 있습니다.
  1. nano 에서 파일을 저장하려면:
    • Ctrl + X를 눌러 종료합니다.
    • Y를 눌러 변경 사항 저장을 확인합니다.
    • Enter를 눌러 파일 이름을 확인합니다.

이제 파일이 /home/labex/project에 저장되었으며 다음 단계를 진행할 준비가 되었습니다.

Docker Compose 애플리케이션 배포

docker-compose.yml 파일이 설정되었으므로, Nginx 컨테이너를 배포하여 Docker 에 청사진을 기반으로 시작하도록 지시해 보겠습니다. 이를 위해 터미널로 전환합니다.

/home/labex/project의 터미널에서 다음을 실행합니다.

docker-compose up -d

각 부분의 의미는 다음과 같습니다.

  • docker-compose: docker-compose.yml을 읽고 서비스를 관리하는 도구입니다.
  • up: 파일에 정의된 web 서비스 (Nginx) 를 시작합니다.
  • -d: 백그라운드 ("detached" 모드) 에서 실행하므로 터미널이 자유롭게 유지됩니다.

Docker Compose 는 VM 에 이미 없는 경우 Docker Hub 에서 nginx:latest 이미지를 다운로드한 다음 (다운로드 메시지가 표시될 수 있음) 컨테이너를 시작합니다. 다음 명령으로 실행 중인지 확인합니다.

docker ps

이 명령은 활성 컨테이너를 나열합니다. "IMAGE" 아래에서 nginx:latest를, "STATUS" 아래에서 "Up"(예: "Up 5 seconds") 을 찾습니다. network_mode: host는 호스트의 포트를 직접 사용하므로 포트 매핑 (예: 0.0.0.0:80->80/tcp) 은 표시되지 않습니다. 아무것도 표시되지 않으면 /home/labex/project에 있는지 확인하고 (pwd로 확인) docker-compose up -d를 다시 실행합니다.

호스트 네트워크에서 Nginx 서비스 테스트

컨테이너가 호스트 네트워킹으로 실행 중이므로, Nginx 가 호스트의 포트 80(표준 웹 포트) 에서 웹 페이지를 제공하는지 테스트해 보겠습니다.

/home/labex/project의 터미널에서 다음을 실행합니다.

curl localhost:80

무슨 일이 일어나는지:

  • curl: 터미널 기반 브라우저처럼 웹 주소에서 데이터를 가져옵니다.
  • localhost:80: 포트 80 에서 VM 자체 (localhost) 에 연결합니다. network_mode: host를 사용하면 컨테이너의 Nginx 가 호스트의 네트워크를 사용하므로 해당 포트 80 은 호스트의 포트 80 입니다.

<!DOCTYPE html>로 시작하는 HTML 을 볼 수 있어야 합니다. 이는 Nginx 의 기본 환영 페이지입니다. 일반적으로 Docker 는 컨테이너 네트워크를 격리하므로 포트 매핑 (예: 호스트 포트 80 을 컨테이너 포트 80 에 매핑) 이 필요합니다. 호스트 모드는 이를 건너뛰어 Nginx 가 VM 의 포트 80 에 직접 바인딩되도록 합니다.

"connection refused"가 표시되면 3 단계를 확인합니다. docker ps를 실행하여 컨테이너가 "Up" 상태인지 확인합니다. 필요한 경우 docker-compose up -d로 다시 시작하거나 sudo service docker status로 Docker 를 확인합니다. 여기서는 브라우저가 없으므로 curl이 테스트 도구입니다.

로그 탐색 및 정리

컨테이너 내부에서 무슨 일이 일어나고 있는지 확인하기 위해 컨테이너의 로그를 확인해 보겠습니다. 이는 주요 문제 해결 기술이며, 컨테이너를 제거하여 정리합니다.

로그 확인

다음 명령을 실행합니다.

docker-compose logs web
  • docker-compose logs: 서비스의 출력을 표시합니다.
  • web: docker-compose.yml에서 web 서비스를 대상으로 합니다.

"nginx starting" 또는 "listening on 0.0.0.0:80"과 같은 줄을 찾습니다. curl을 사용한 경우 "GET /"이 기록될 수 있습니다. 오류 (예: "port 80 failed") 도 여기에 표시됩니다. Nginx 가 중지된 경우 유용합니다.

정리

다음 명령을 실행합니다.

docker-compose down
  • docker-compose down: 컨테이너를 중지하고 제거하여 포트 80 을 해제하고 정리합니다.

다음 명령으로 확인합니다.

docker ps

nginx 줄이 없으면 제거된 것입니다. 남아 있는 경우 docker-compose down을 다시 실행합니다. docker-compose.yml은 유지되므로 나중에 docker-compose up -d로 다시 시작할 수 있습니다. 이는 설정, 배포, 테스트 및 제거의 라이프사이클을 마무리합니다.

문제 해결 및 모범 사례

다음은 문제 발생 시 대처 방법과 Docker Compose 를 현명하게 사용하는 방법입니다.

문제 해결 팁

  • 컨테이너가 시작되지 않음: docker ps가 비어 있으면 "port in use"와 같은 오류가 있는지 docker-compose logs web을 확인합니다. sudo lsof -i :80sudo kill <PID>로 포트 80 을 해제한 다음 docker-compose up -d를 실행합니다.
  • curl 응답 없음: 컨테이너가 실행 중인지 (docker ps) 및 Docker 가 실행 중인지 (sudo service docker status) 확인합니다. docker-compose up -d 또는 sudo service docker restart로 다시 시작합니다.
  • 파일 문제: docker-compose up이 파일을 찾을 수 없으면 /home/labex/project에 있는지 (pwd) 및 docker-compose.yml이 존재하는지 (ls) 확인합니다.

모범 사례

  • 호스트 네트워킹 제한: 간단하지만 격리를 건너뛰므로 다른 서비스가 실행될 경우 보안 위험이 있습니다. 필요하지 않은 한, 프로덕션 환경이 아닌 랩 환경에서 사용합니다.
  • 포트 사전 확인: sudo netstat -tuln | grep :80으로 테스트합니다. 먼저 포트 80 을 비웁니다.
  • 파일 보관: 재사용을 위해 docker-compose.yml/home/labex/project에 저장합니다.
  • 로그 감시: 문제를 조기에 발견하기 위해 정기적으로 로그를 확인합니다.

이러한 습관은 Docker 작업을 안정적으로 만들고 핵심 기술을 가르쳐줍니다.

요약

Docker Compose 를 설치하고, 호스트 네트워킹을 사용하여 docker-compose.yml 파일을 생성하고, Nginx 컨테이너를 배포하고, 테스트하고, 로그를 확인하고, 정리했습니다. 호스트 네트워킹을 사용하면 컨테이너가 Docker 의 격리를 건너뛰고 호스트의 네트워크를 직접 사용할 수 있습니다. 이는 강력한 기술입니다. 이러한 단계는 Docker Compose 앱을 관리하고 문제 해결을 위한 기반을 구축하여 더 큰 프로젝트를 위한 준비를 돕습니다.