G: 안녕하세요! 현대 개발 환경에서 빼놓을 수 없는 필수 도구, 바로 도커(Docker)와 도커 컴포즈(Docker Compose)입니다. 개발자라면 한 번쯤은 “내 컴퓨터에서는 잘 되는데, 왜 다른 사람 컴퓨터에서는 안 되지?” 하는 경험을 해보셨을 텐데요. 이런 환경 의존성 문제를 깔끔하게 해결해주는 마법 같은 솔루션이 바로 도커입니다. 🪄
이번 글에서는 우분투(Ubuntu) 운영체제에 도커와 도커 컴포즈를 가장 최신이면서도 효율적인 방법으로 한 번에 설치하고, 간단한 예시를 통해 실제로 어떻게 활용하는지까지 자세히 알아보겠습니다. 개발 환경 구축에 어려움을 겪으셨던 분들이나, 이제 막 도커의 세계에 입문하려는 분들께 이 글이 훌륭한 가이드가 되기를 바랍니다! 📖✨
💡 왜 Docker와 Docker Compose를 사용해야 할까요?
본격적인 설치에 앞서, 왜 이 두 도구가 개발자에게 그토록 중요한지 간략하게 짚고 넘어가겠습니다.
1. 도커(Docker): 컨테이너 기술의 핵심 📦
도커는 애플리케이션과 그에 필요한 모든 종속성(라이브러리, 설정 파일 등)을 컨테이너라는 독립적인 실행 단위로 패키징하고 실행할 수 있게 해줍니다.
- 환경 일관성: “내 컴퓨터에서는 되는데…” 문제를 해결합니다. 어떤 환경에서든 동일하게 작동하는 컨테이너를 만들 수 있습니다. 개발, 테스트, 배포 환경이 모두 동일해지죠! 🤝
- 격리성: 컨테이너는 호스트 시스템이나 다른 컨테이너에 영향을 주지 않으면서 독립적으로 실행됩니다. 여러 프로젝트를 동시에 진행해도 서로 충돌할 일이 없습니다. 🛡️
- 경량성 & 효율성: 가상 머신(VM)보다 훨씬 가볍고 빠르게 작동합니다. 호스트 OS의 커널을 공유하기 때문이죠. 🏃♂️
2. 도커 컴포즈(Docker Compose): 다중 컨테이너 오케스트레이션 🎶
도커 컴포즈는 여러 개의 도커 컨테이너를 함께 정의하고 실행할 수 있게 해주는 도구입니다. 복잡한 애플리케이션(예: 웹 서버 + 데이터베이스 + 캐시 서버)을 단일 명령어로 손쉽게 관리할 수 있습니다.
- 간편한 정의:
docker-compose.yml
이라는 YAML 파일 하나로 여러 서비스(컨테이너)의 연결, 볼륨, 네트워크 등을 한눈에 정의할 수 있습니다. 📝 - 쉬운 관리:
docker compose up
명령 한 번으로 정의된 모든 서비스를 동시에 시작하고,docker compose down
으로 한 번에 중지 및 제거할 수 있습니다. 마치 오케스트라 지휘자처럼요! 🎼 - 재현성: 팀원들과 같은
docker-compose.yml
파일을 공유함으로써, 모든 개발자가 동일한 개발 환경을 손쉽게 구축할 수 있습니다. 🧑💻👩💻
결론적으로, 도커와 도커 컴포즈는 개발 환경을 표준화하고, 배포 프로세스를 간소화하며, 팀 협업 효율을 극대화하는 데 필수적인 ‘파워 커플’입니다! 💪
🛠️ 우분투에 도커 설치하기 (공식 권장 방법)
이제 우분투에 도커를 설치해 보겠습니다. 도커 공식 문서에서 권장하는 스크립트 방식을 사용하면 가장 쉽고 빠르게 최신 버전을 설치할 수 있습니다.
1. 시스템 업데이트 및 필수 패키지 설치
가장 먼저 우분투 시스템을 최신 상태로 업데이트하고, 도커 설치에 필요한 기본 패키지들을 설치해 줍니다.
sudo apt update # 패키지 목록 업데이트
sudo apt upgrade -y # 설치된 패키지 업그레이드
sudo apt install -y ca-certificates curl gnupg lsb-release # 필수 패키지 설치
👉 ca-certificates
: SSL/TLS 인증서를 확인하는 데 사용됩니다.
👉 curl
: 웹에서 파일을 다운로드하는 데 사용됩니다.
👉 gnupg
: GPG 키를 관리하는 데 사용됩니다.
👉 lsb-release
: LSB(Linux Standard Base) 정보를 제공합니다.
2. 도커 공식 GPG 키 추가
도커 패키지의 신뢰성을 확인하기 위해 공식 GPG 키를 추가합니다.
sudo mkdir -p /etc/apt/keyrings # 키링 디렉토리가 없으면 생성
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
👉 이 명령어는 도커의 GPG 공개 키를 다운로드하여 /etc/apt/keyrings/docker.gpg
파일로 저장합니다. 🔑
3. 도커 APT 저장소 추가
APT(Advanced Package Tool)가 도커 패키지를 찾을 수 있도록 도커의 공식 저장소를 sources.list
에 추가합니다.
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.gpg] https://download.docker.com/linux/ubuntu \
$(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
👉 이 복잡해 보이는 명령어는 현재 우분투 아키텍처와 버전에 맞는 도커 저장소 정보를 /etc/apt/sources.list.d/docker.list
파일에 추가하는 역할을 합니다. 📄
4. 도커 엔진 설치
저장소를 추가했으니, 다시 한번 패키지 목록을 업데이트하고 도커 엔진을 설치합니다.
sudo apt update # 새로 추가된 저장소의 패키지 목록 업데이트
sudo apt install -y docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
👉 docker-ce
: 도커 커뮤니티 에디션(Docker Community Edition) 엔진입니다.
👉 docker-ce-cli
: 도커 명령줄 인터페이스(CLI)입니다.
👉 containerd.io
: 컨테이너 런타임입니다.
👉 docker-buildx-plugin
: BuildKit 기능을 제공하여 빌드 속도 및 기능 향상에 도움을 줍니다.
👉 docker-compose-plugin
: 이것이 바로 도커 컴포즈 V2 플러그인입니다! 별도로 설치할 필요 없이 함께 설치됩니다. 🎉
5. 설치 확인
도커가 제대로 설치되었는지 확인해 봅시다.
sudo systemctl status docker
👉 Active: active (running)
이라고 나오면 성공입니다. ✅
다음으로, 테스트용 hello-world
이미지를 실행하여 도커가 정상적으로 작동하는지 확인합니다.
sudo docker run hello-world
👉 “Hello from Docker!” 메시지가 출력되면 성공입니다. 👋
6. sudo 없이 Docker 사용하기 (권장!)
기본적으로 도커 명령어는 sudo
권한으로 실행해야 합니다. 하지만 매번 sudo
를 입력하는 것은 번거롭고 실수할 위험도 있습니다. 현재 사용자 계정을 docker
그룹에 추가하면 sudo
없이 도커 명령어를 사용할 수 있습니다.
sudo usermod -aG docker $USER
👉 $USER
는 현재 로그인한 사용자 이름을 나타냅니다. 🧑💻
이 명령어를 실행한 후에는 새로운 터미널을 열거나 로그아웃 후 다시 로그인해야 변경 사항이 적용됩니다! 🔄
새 터미널에서 sudo
없이 다시 hello-world
를 실행해 보세요.
docker run hello-world
👉 이제 sudo
없이도 잘 작동하죠? 아주 좋습니다! 👍
🛠️ 우분투에 도커 컴포즈 설치 확인 (V2)
앞서 도커 엔진을 설치할 때 docker-compose-plugin
도 함께 설치했습니다. 이는 도커 컴포즈 V2 버전으로, 기존의 docker-compose
명령어 대신 docker compose
(하이픈 없이!) 명령어를 사용합니다.
별도의 설치 과정이 필요 없으므로, 제대로 설치되었는지 확인만 하면 됩니다.
docker compose version
👉 Docker Compose version v2.x.x
와 같은 형태로 버전 정보가 출력되면 성공입니다. 🎉
잠깐! 도커 컴포즈 V1 (레거시)과의 차이점
- V1:
docker-compose --version
으로 확인하며,docker-compose up
과 같이 하이픈을 사용했습니다. - V2:
docker compose version
으로 확인하며,docker compose up
과 같이 하이픈 없이 사용합니다. V2는 도커 CLI에 통합된 플러그인 형태입니다.
현재는 특별한 이유가 없다면 V2 사용을 강력히 권장합니다. 대부분의 최신 공식 문서 및 튜토리얼은 V2 기준으로 작성되어 있습니다.
🚀 Docker와 Docker Compose 활용 예시
이제 도커와 도커 컴포즈가 제대로 설치되었으니, 실제로 어떻게 사용하는지 간단한 예시를 통해 알아보겠습니다.
1. 도커 단독 사용 예시: Nginx 웹 서버 실행 🌐
간단한 웹 서버인 Nginx를 도커 컨테이너로 띄워봅시다.
-
Nginx 이미지 다운로드 및 실행:
docker run -d -p 80:80 --name my-nginx nginx
-d
: 컨테이너를 백그라운드(detached mode)로 실행합니다.-p 80:80
: 호스트의 80번 포트를 컨테이너의 80번 포트에 연결합니다. (외부에서localhost:80
으로 접근 가능)--name my-nginx
: 컨테이너 이름을my-nginx
로 지정합니다. (나중에 관리하기 편하게)nginx
: 실행할 도커 이미지 이름입니다. (만약 로컬에 없으면 자동으로 다운로드합니다)
-
컨테이너 확인:
docker ps
👉
my-nginx
컨테이너가Up
상태로 잘 실행되고 있는지 확인합니다. -
웹 브라우저로 접속: 이제 웹 브라우저를 열고
http://localhost
또는http://127.0.0.1
로 접속해 보세요. “Welcome to nginx!” 페이지가 보인다면 성공입니다! 🥳 -
컨테이너 중지 및 삭제:
docker stop my-nginx # 컨테이너 중지 docker rm my-nginx # 컨테이너 삭제
👉
docker ps -a
로 확인하면 중지된 컨테이너가 사라진 것을 볼 수 있습니다.
2. 도커 컴포즈 사용 예시: 워드프레스(WordPress) + MySQL 실행 📝
복잡한 서비스인 워드프레스(PHP 기반 웹 애플리케이션)와 MySQL(데이터베이스)을 도커 컴포즈를 사용하여 한 번에 띄워보겠습니다.
-
프로젝트 디렉토리 생성:
mkdir ~/my-wordpress-app cd ~/my-wordpress-app
-
docker-compose.yml
파일 생성:my-wordpress-app
디렉토리 안에docker-compose.yml
파일을 만들고 아래 내용을 복사하여 붙여넣습니다.version: '3.8' # Docker Compose 파일 형식 버전 services: wordpress: image: wordpress:latest # 워드프레스 최신 이미지 사용 ports: - "80:80" # 호스트 80번 포트를 워드프레스 컨테이너 80번 포트에 연결 environment: # 워드프레스 환경 변수 설정 WORDPRESS_DB_HOST: db:3306 # 데이터베이스 호스트 (db 서비스 이름) WORDPRESS_DB_USER: wordpress # DB 사용자 이름 WORDPRESS_DB_PASSWORD: wordpress_password # DB 비밀번호 WORDPRESS_DB_NAME: wordpress # DB 이름 volumes: - ./wordpress_data:/var/www/html # 워드프레스 파일 영구 저장을 위한 볼륨 마운트 depends_on: # db 서비스가 먼저 시작되어야 함 - db networks: # custom-network 사용 (명시적으로 네트워크 정의) - custom-network db: image: mysql:5.7 # MySQL 5.7 이미지 사용 (특정 버전 명시) environment: # MySQL 환경 변수 설정 MYSQL_ROOT_PASSWORD: root_password # MySQL root 비밀번호 MYSQL_DATABASE: wordpress # 워드프레스에서 사용할 DB 이름 MYSQL_USER: wordpress # 워드프레스에서 사용할 DB 사용자 이름 MYSQL_PASSWORD: wordpress_password # 워드프레스에서 사용할 DB 비밀번호 volumes: - ./db_data:/var/lib/mysql # MySQL 데이터 영구 저장을 위한 볼륨 마운트 networks: # custom-network 사용 - custom-network volumes: # 볼륨 정의 (컨테이너가 삭제되어도 데이터는 유지) wordpress_data: db_data: networks: # 네트워크 정의 (두 서비스가 서로 통신할 수 있게 함) custom-network: driver: bridge # 기본 브리지 드라이버 사용
👉 이 파일은
wordpress
와db
라는 두 개의 서비스를 정의합니다. 이 두 서비스는custom-network
를 통해 서로 통신하며,volumes
를 통해 데이터 영속성을 확보합니다. -
서비스 실행:
docker-compose.yml
파일이 있는 디렉토리(~/my-wordpress-app
)에서 다음 명령어를 실행합니다.docker compose up -d
up
:docker-compose.yml
에 정의된 모든 서비스를 시작합니다.-d
: 백그라운드로 실행합니다.
명령어를 실행하면 워드프레스와 MySQL 이미지를 다운로드하고, 두 컨테이너를 함께 실행할 것입니다. ☕
-
컨테이너 확인:
docker ps
👉
my-wordpress-app-wordpress-1
과my-wordpress-app-db-1
두 컨테이너가Up
상태로 잘 실행되고 있는지 확인합니다. -
워드프레스 접속: 웹 브라우저를 열고
http://localhost
또는http://127.0.0.1
로 접속해 보세요. 워드프레스 설치 화면이 나타난다면 성공입니다! 🎉 지시에 따라 워드프레스 설정을 완료할 수 있습니다. -
서비스 중지 및 제거: 워드프레스 서비스를 종료하고 싶다면,
docker-compose.yml
파일이 있는 디렉토리에서 다음 명령어를 실행합니다.docker compose down
👉 이 명령어는
docker-compose.yml
에 정의된 모든 컨테이너와 네트워크를 중지하고 제거합니다. (단,volumes
에 정의된 데이터는 기본적으로 유지됩니다.)
troubleshooting & 팁 💡
설치나 사용 중 발생할 수 있는 몇 가지 일반적인 문제와 유용한 팁입니다.
-
Got permission denied while trying to connect to the Docker daemon socket
오류:- 가장 흔한 오류 중 하나입니다. 위에서 설명했듯이, 현재 사용자를
docker
그룹에 추가(sudo usermod -aG docker $USER
)하고 새 터미널을 열거나 재로그인해야 해결됩니다.
- 가장 흔한 오류 중 하나입니다. 위에서 설명했듯이, 현재 사용자를
-
docker: command not found
또는docker compose: command not found
오류:- 도커나 도커 컴포즈가 제대로 설치되지 않았거나,
$PATH
환경 변수에 도커 실행 파일 경로가 포함되어 있지 않을 수 있습니다. 설치 과정을 다시 한번 확인해 보세요. - 특히
sudo apt install docker-compose-plugin
이 누락되거나, 도커 컴포즈 V1을 사용하려는데 V2만 설치된 경우docker-compose
명령어가 없다고 나올 수 있습니다.docker compose
를 시도해 보세요.
- 도커나 도커 컴포즈가 제대로 설치되지 않았거나,
-
도커 데몬이 실행되지 않음:
- 도커 서비스가 자동으로 시작되지 않았거나 중지되었을 수 있습니다.
sudo systemctl start docker # 도커 서비스 시작 sudo systemctl enable docker # 부팅 시 자동 시작 설정 sudo systemctl status docker # 상태 확인
- 도커 서비스가 자동으로 시작되지 않았거나 중지되었을 수 있습니다.
-
오래된 도커 버전 제거 (재설치 시):
- 이전에 설치했던 도커 관련 패키지가 충돌을 일으킬 수 있습니다. 완전히 제거하려면:
sudo apt purge docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y sudo rm -rf /var/lib/docker # 도커 데이터 디렉토리 삭제 (이미지, 컨테이너 등 모두 삭제됨!) sudo rm -rf /var/lib/containerd # containerd 데이터 삭제
- 이전에 설치했던 도커 관련 패키지가 충돌을 일으킬 수 있습니다. 완전히 제거하려면:
-
디스크 공간 관리:
- 도커 이미지는 시간이 지남에 따라 많은 디스크 공간을 차지할 수 있습니다. 사용하지 않는 이미지, 컨테이너, 볼륨 등을 주기적으로 정리해주는 것이 좋습니다.
docker system prune -a # 사용하지 않는 모든 이미지, 컨테이너, 네트워크, 캐시 제거
👉 이 명령어는 강력하니, 제거될 항목을 잘 확인하고 신중하게 사용하세요.
- 도커 이미지는 시간이 지남에 따라 많은 디스크 공간을 차지할 수 있습니다. 사용하지 않는 이미지, 컨테이너, 볼륨 등을 주기적으로 정리해주는 것이 좋습니다.
맺음말 🎉
이제 여러분은 우분투에 도커와 도커 컴포즈를 성공적으로 설치하고, 기본적인 사용법까지 익히셨습니다! 컨테이너 기반 개발 환경은 현대 소프트웨어 개발의 핵심이며, 한 번 익숙해지면 이전으로는 돌아갈 수 없을 정도로 편리하고 효율적입니다.
이 가이드가 여러분의 개발 생산성을 한층 더 끌어올리는 데 도움이 되었기를 바랍니다. 앞으로 도커를 활용하여 더욱 멋진 프로젝트들을 만들어나가시길 응원합니다! 🚀 다음번에는 도커 이미지를 직접 만드는 방법이나, 도커 볼륨, 네트워크 등 더 심화된 주제로 찾아오겠습니다.
궁금한 점이나 추가하고 싶은 내용이 있다면 언제든지 댓글로 남겨주세요! 행복한 코딩 되세요! 😄💻