화. 8월 12th, 2025

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를 도커 컨테이너로 띄워봅시다.

  1. 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: 실행할 도커 이미지 이름입니다. (만약 로컬에 없으면 자동으로 다운로드합니다)
  2. 컨테이너 확인:

    docker ps

    👉 my-nginx 컨테이너가 Up 상태로 잘 실행되고 있는지 확인합니다.

  3. 웹 브라우저로 접속: 이제 웹 브라우저를 열고 http://localhost 또는 http://127.0.0.1로 접속해 보세요. “Welcome to nginx!” 페이지가 보인다면 성공입니다! 🥳

  4. 컨테이너 중지 및 삭제:

    docker stop my-nginx   # 컨테이너 중지
    docker rm my-nginx     # 컨테이너 삭제

    👉 docker ps -a로 확인하면 중지된 컨테이너가 사라진 것을 볼 수 있습니다.

2. 도커 컴포즈 사용 예시: 워드프레스(WordPress) + MySQL 실행 📝

복잡한 서비스인 워드프레스(PHP 기반 웹 애플리케이션)와 MySQL(데이터베이스)을 도커 컴포즈를 사용하여 한 번에 띄워보겠습니다.

  1. 프로젝트 디렉토리 생성:

    mkdir ~/my-wordpress-app
    cd ~/my-wordpress-app
  2. 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 # 기본 브리지 드라이버 사용

    👉 이 파일은 wordpressdb라는 두 개의 서비스를 정의합니다. 이 두 서비스는 custom-network를 통해 서로 통신하며, volumes를 통해 데이터 영속성을 확보합니다.

  3. 서비스 실행: docker-compose.yml 파일이 있는 디렉토리(~/my-wordpress-app)에서 다음 명령어를 실행합니다.

    docker compose up -d
    • up: docker-compose.yml에 정의된 모든 서비스를 시작합니다.
    • -d: 백그라운드로 실행합니다.

    명령어를 실행하면 워드프레스와 MySQL 이미지를 다운로드하고, 두 컨테이너를 함께 실행할 것입니다. ☕

  4. 컨테이너 확인:

    docker ps

    👉 my-wordpress-app-wordpress-1my-wordpress-app-db-1 두 컨테이너가 Up 상태로 잘 실행되고 있는지 확인합니다.

  5. 워드프레스 접속: 웹 브라우저를 열고 http://localhost 또는 http://127.0.0.1로 접속해 보세요. 워드프레스 설치 화면이 나타난다면 성공입니다! 🎉 지시에 따라 워드프레스 설정을 완료할 수 있습니다.

  6. 서비스 중지 및 제거: 워드프레스 서비스를 종료하고 싶다면, 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 # 사용하지 않는 모든 이미지, 컨테이너, 네트워크, 캐시 제거

      👉 이 명령어는 강력하니, 제거될 항목을 잘 확인하고 신중하게 사용하세요.


맺음말 🎉

이제 여러분은 우분투에 도커와 도커 컴포즈를 성공적으로 설치하고, 기본적인 사용법까지 익히셨습니다! 컨테이너 기반 개발 환경은 현대 소프트웨어 개발의 핵심이며, 한 번 익숙해지면 이전으로는 돌아갈 수 없을 정도로 편리하고 효율적입니다.

이 가이드가 여러분의 개발 생산성을 한층 더 끌어올리는 데 도움이 되었기를 바랍니다. 앞으로 도커를 활용하여 더욱 멋진 프로젝트들을 만들어나가시길 응원합니다! 🚀 다음번에는 도커 이미지를 직접 만드는 방법이나, 도커 볼륨, 네트워크 등 더 심화된 주제로 찾아오겠습니다.

궁금한 점이나 추가하고 싶은 내용이 있다면 언제든지 댓글로 남겨주세요! 행복한 코딩 되세요! 😄💻

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다