소개
이 튜토리얼은 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

다음은 각 명령의 역할입니다.
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 를 사용합니다.
파일을 생성하고 편집하려면 다음 단계를 따르세요.
터미널에서 프로젝트 디렉토리에 있는지 확인합니다.
cd /home/labex/projectnano 로 파일을 생성하고 엽니다.
nano docker-compose.yml다음 내용을 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) 에 액세스할 수 있습니다.
- 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 :80및sudo 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 앱을 관리하고 문제 해결을 위한 기반을 구축하여 더 큰 프로젝트를 위한 준비를 돕습니다.



