Docker 주요 명령어의 실무적 사용법과 활용법

Docker 주요 명령어의 실무적 사용법과 활용법

Docker 주요 명령어의 실무적 사용법과 활용법

이 글은 Docker를 실무에서 활용할 때 자주 쓰이는 필수 명령어와 그 활용법을 상세히 정리한 가이드입니다. 이미지 관리부터 컨테이너 운영, 데이터 관리, 네트워크 설정, Docker Compose를 통한 다중 컨테이너 관리까지 실무에서 겪게 되는 다양한 상황과 사례를 중심으로 구성하였습니다. Docker의 효율적이고 안정적인 운영을 위한 실무 가이드로 활용하시기 바랍니다.


1. 이미지(Image) 관리 명령어의 실무적 활용법

docker pull : 이미지 가져오기 및 버전 관리 전략

실무 환경에서는 Docker 이미지를 Docker Hub 또는 프라이빗 레지스트리에서 가져오는 경우가 빈번합니다. 이때, 최신 버전(latest) 이미지를 무작정 가져오는 것은 서비스의 안정성을 해칠 수 있기 때문에 명확한 태그와 버전을 관리하는 것이 중요합니다. 이미지의 버전을 명시하여 관리하면, 예기치 않은 장애 상황에서도 신속한 복구가 가능합니다.

아래는 특정 버전의 Docker 이미지를 가져오는 명령어의 예시입니다.

docker pull nginx:1.23.4

프라이빗 레지스트리에서 이미지를 가져오는 경우는 아래와 같이 주소를 명시합니다.

docker pull registry.example.com/myapp/backend:2.5.1

docker images : 이미지 확인 및 관리 요령

Docker 이미지가 점차 많아지다 보면 어떤 이미지가 현재 존재하는지, 불필요한 이미지가 쌓여 있는지 주기적으로 확인할 필요가 있습니다. 이때 사용하는 명령어가 바로 docker images입니다. 실무에서는 자주 사용하지 않는 이미지나, 용량이 큰 이미지를 확인하여 서버의 용량을 효율적으로 관리하는 것이 중요합니다.

기본적인 이미지 확인 명령어는 아래와 같습니다.

docker images

좀 더 상세한 정보를 확인하려면 옵션을 추가하여 아래와 같이 사용합니다.

docker images --digests --no-trunc

docker build : Dockerfile 기반 이미지 생성 및 효율적인 빌드 방법

Docker를 활용할 때 가장 중요한 부분 중 하나는 바로 Dockerfile을 활용한 이미지 빌드입니다. 실무에서는 다양한 환경(dev, staging, prod 등)에 맞는 Dockerfile을 따로 관리하거나, 빌드시 인자를 사용하여 유연하게 환경을 구성하는 것이 일반적입니다.

기본적인 Dockerfile 빌드 명령어의 예시는 다음과 같습니다.

docker build -t myapp:1.0.0 .

특정 Dockerfile의 이름을 명시하거나 빌드 인자(--build-arg)를 이용해 환경 변수를 주입하여 빌드할 수도 있습니다.

docker build -f Dockerfile.prod --build-arg ENV=prod -t myapp:1.0.0-prod .

docker tag : 이미지 버전 관리 및 태깅 전략

Docker 이미지를 효과적으로 관리하기 위해서는 태그 전략이 필수적입니다. 일반적으로 실무에서는 latest 태그뿐만 아니라, 명확한 버전을 태그하여 관리합니다. 다음은 Docker 이미지 태그를 지정하는 명령어 예시입니다.

docker tag myapp:latest myapp:2.3.0

프라이빗 레지스트리로 이미지를 배포할 때도 아래와 같이 태그를 명시하여 관리할 수 있습니다.

docker tag myapp:2.3.0 registry.example.com/myapp/backend:2.3.0

docker push : Docker Hub 및 사설 레지스트리에 이미지 배포하기

Docker 이미지를 빌드하고 태깅했다면, 이를 외부 레지스트리로 배포해야 합니다. 대표적인 레지스트리는 Docker Hub이며, 기업 내부에서는 보안상의 이유로 프라이빗 레지스트리를 많이 사용합니다.

아래는 Docker 이미지를 프라이빗 레지스트리에 업로드하는 예시입니다.

docker push registry.example.com/myapp/backend:2.3.0

docker rmi : 불필요한 이미지 정리 및 공간 관리법

실무 환경에서는 시간이 지날수록 불필요한 이미지가 쌓여서 서버 용량을 과도하게 차지하는 경우가 많습니다. 정기적으로 불필요한 이미지를 정리하여 시스템의 공간을 관리해야 합니다.

이미지를 삭제하는 명령어는 다음과 같습니다.

docker rmi myapp:old-version

사용하지 않는 모든 이미지를 한 번에 삭제하려면 다음과 같은 명령어를 활용할 수도 있습니다. (실행 전 반드시 삭제될 이미지를 확인하세요!)

docker image prune -a


2. 컨테이너(Container) 운영 및 관리 명령어의 실무적 활용법

docker run : 컨테이너 생성 및 실행 시 자주 사용하는 옵션과 활용 예시

docker run 명령어는 Docker 이미지에서 컨테이너를 생성하고 실행하는 가장 기본적이면서도 중요한 명령어입니다. 실무 환경에서는 다양한 옵션을 활용해 컨테이너를 유연하게 실행하는 경우가 많습니다. 대표적인 옵션과 실무 예시는 아래와 같습니다.

  • -d (Detached mode): 백그라운드 실행
  • -p (Port): 포트 바인딩
  • --name: 컨테이너 이름 지정
  • -e (Environment): 환경 변수 설정

예시 명령어는 아래와 같습니다.

docker run -d -p 8080:80 --name webserver nginx:latest

환경 변수를 적용한 실행 예시는 다음과 같습니다.

docker run -d -p 3306:3306 --name mysql -e MYSQL_ROOT_PASSWORD=my-secret-pw mysql:8.0

docker ps : 컨테이너 상태 점검과 실무적 관리 방법

실행 중인 Docker 컨테이너의 상태를 점검하는 명령어는 docker ps이며, 모든 컨테이너(중지된 포함)를 확인하려면 docker ps -a 옵션을 사용합니다. 이는 운영 중인 서비스의 상태 확인 및 장애 대응 시 자주 사용됩니다.

docker ps -a

docker exec : 컨테이너 내부 접속 및 문제 해결 사례

docker exec 명령어를 사용하면 컨테이너 내부로 직접 접속하여 디버깅이나 설정 확인 등 다양한 작업을 수행할 수 있습니다. 실무 환경에서는 문제가 발생했을 때 컨테이너 내부를 빠르게 점검하는 용도로 많이 활용됩니다.

예시는 다음과 같습니다.

docker exec -it webserver /bin/bash

docker stop 및 docker restart : 서비스 유지보수 및 장애 대응 방법

Docker 컨테이너를 운영하면서 컨테이너 중지(docker stop)와 재시작(docker restart)을 자주 사용합니다. 이 명령어는 서비스 배포, 업데이트, 유지보수 등 운영 환경에서 필수적으로 사용됩니다.

docker stop webserver
docker restart webserver

docker rm : 컨테이너 삭제 및 효율적 관리 방법

불필요한 컨테이너를 주기적으로 정리하는 것도 중요합니다. 컨테이너를 삭제하려면 먼저 중지한 후(docker stop), 삭제(docker rm)를 진행합니다. 다음과 같이 사용합니다.

docker rm webserver

사용하지 않는 모든 컨테이너를 한번에 삭제하려면 다음과 같이 사용합니다. (중요 데이터가 없는지 반드시 확인 후 사용하세요.)

docker container prune

docker logs : 컨테이너 로그 확인 및 실시간 모니터링 방법

컨테이너 운영 중 로그를 확인하여 장애 발생 원인을 진단하거나 실시간 모니터링을 할 수 있습니다. 실무에서는 docker logs 명령어를 활용하여 빠르게 로그를 확인합니다.

docker logs webserver

실시간 로그 모니터링을 할 때는 다음과 같이 -f 옵션을 추가합니다.

docker logs -f webserver


3. 데이터 관리(Volumes, Bind Mounts)의 실무적 활용법

Docker Volume의 개념과 사용법 (docker volume create)

Docker 컨테이너에서 생성된 데이터는 컨테이너 삭제 시 함께 삭제됩니다. 이를 방지하기 위해 Docker Volume을 사용해 데이터를 영구적으로 저장합니다. 실무에서는 데이터베이스, 로그 파일, 사용자 업로드 파일 등 중요한 데이터를 관리할 때 주로 사용됩니다.

Docker Volume 생성 예시는 다음과 같습니다.

docker volume create my_data_volume

생성된 Volume을 컨테이너와 연결하는 방법입니다.

docker run -d --name mydb -v my_data_volume:/var/lib/mysql mysql:8.0

Bind Mount 방식으로 호스트와 컨테이너 데이터 공유하기

Bind Mount는 호스트 시스템의 특정 디렉터리를 컨테이너와 직접 공유하는 방식입니다. 실무에서는 코드 변경 사항을 실시간 반영하거나, 설정 파일을 손쉽게 변경할 때 자주 사용됩니다.

다음은 Bind Mount를 사용하는 명령어 예시입니다.

docker run -d --name myweb -p 8080:80 -v /home/user/myweb:/usr/share/nginx/html nginx:latest

볼륨 데이터 백업 및 복구 실무 사례

실무 환경에서는 데이터 유실을 방지하기 위해 볼륨 데이터를 정기적으로 백업합니다. 백업과 복구는 주로 컨테이너를 통해 압축 파일 형태로 관리합니다. 다음은 볼륨 백업 방법의 예시입니다.

[백업 예시]

docker run --rm -v my_data_volume:/data -v $(pwd):/backup ubuntu tar czf /backup/my_backup.tar.gz /data

[복구 예시]

docker run --rm -v my_data_volume:/data -v $(pwd):/backup ubuntu tar xzf /backup/my_backup.tar.gz -C /


4. 네트워크(Network) 관리 명령어의 실무적 활용법

Docker 네트워크 기본 개념과 네트워크 유형 이해

Docker는 컨테이너 간 통신을 관리하기 위해 별도의 네트워크를 제공합니다. 기본적으로 bridge, host, none 유형을 지원하며, 별도의 사용자 정의 네트워크를 생성하여 컨테이너 간 안전한 통신 환경을 구성하는 것이 일반적입니다.

  • bridge: 가장 많이 사용하는 기본 네트워크 모드로, 컨테이너 간 격리된 통신을 지원합니다.
  • host: 호스트의 네트워크를 직접 사용하는 방식으로 성능이 중요한 환경에서 주로 사용됩니다.
  • none: 모든 네트워크 연결을 비활성화하는 방식입니다.

사용자 정의 네트워크 생성 및 활용 (docker network create)

실무 환경에서는 서비스별 또는 환경별로 사용자 정의 네트워크를 생성해 컨테이너 간의 보안과 통신을 관리합니다. 다음은 사용자 정의 네트워크 생성 명령어의 예시입니다.

docker network create my_network

생성된 네트워크를 이용하여 컨테이너를 실행할 때는 다음과 같이 실행합니다.

docker run -d --name webserver --network my_network nginx:latest

컨테이너 간 네트워크 연결 및 통신 예시 (docker network connect)

기존에 생성된 컨테이너를 다른 네트워크와 연결하거나, 네트워크에서 분리하는 작업은 자주 발생합니다. 이를 위해 docker network connectdocker network disconnect 명령어를 활용합니다.

[네트워크에 컨테이너 연결]

docker network connect my_network webserver

[네트워크에서 컨테이너 분리]

docker network disconnect my_network webserver

실무에서 자주 사용되는 Docker 네트워크 관리 팁

실무에서는 서비스 간 통신 문제를 신속하게 해결하기 위해 Docker 네트워크의 정보를 조회하거나 네트워크 상태를 점검하는 경우가 많습니다. 대표적인 네트워크 상태 조회 명령어는 아래와 같습니다.

[네트워크 목록 확인]

docker network ls

[네트워크 상세 정보 조회]

docker network inspect my_network


5. Docker Compose를 이용한 다중 컨테이너 관리의 실무적 활용법

docker-compose.yml 작성 팁 및 실무 예시

Docker Compose는 여러 컨테이너를 동시에 관리하고 배포할 수 있는 도구로, 실무에서는 마이크로서비스 환경 구축이나 개발 환경 구성 시 필수적으로 활용됩니다. Compose 파일(docker-compose.yml)을 잘 작성하면 컨테이너 간 의존성 및 환경 설정을 쉽게 관리할 수 있습니다.

다음은 실무에서 자주 사용하는 Compose 파일 예시입니다.

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: examplepassword
    volumes:
      - db_data:/var/lib/mysql
volumes:
  db_data:

docker-compose up, docker-compose down의 실무적 사용법

Docker Compose를 이용해 다중 컨테이너 환경을 간편하게 실행하거나 중지할 수 있습니다. 서비스의 시작, 중지 및 재배포 시 자주 사용하는 명령어는 다음과 같습니다.

[컨테이너 환경을 백그라운드로 실행]

docker-compose up -d

[모든 컨테이너 중지 및 제거]

docker-compose down

docker-compose logs, docker-compose restart 활용 전략

컨테이너의 상태나 문제를 진단할 때 Docker Compose의 로그 확인과 재시작 기능을 자주 활용합니다. 특히 여러 컨테이너의 로그를 동시에 확인할 때 유용합니다.

[모든 컨테이너 로그 조회]

docker-compose logs -f

[특정 서비스만 로그 조회]

docker-compose logs -f web

[서비스 재시작]

docker-compose restart web

환경별 Compose 설정 관리 방법

실무에서는 개발 환경과 프로덕션 환경을 구분하여 서로 다른 Compose 파일을 사용하는 경우가 많습니다. 공통된 기본 파일과 환경에 따른 확장 파일을 함께 사용하면 유지보수성이 높아집니다.

예시는 다음과 같습니다.

[기본 Compose 파일에 프로덕션 설정 파일 추가]

docker-compose -f docker-compose.yml -f docker-compose.prod.yml up -d


6. 실무에서 자주 발생하는 문제 해결 및 Docker 관리 팁

Docker 시스템 자원 관리 (CPU, 메모리 제한 및 모니터링)

Docker는 컨테이너의 CPU와 메모리 사용량을 제한하여 시스템의 안정성을 높이고 자원을 효율적으로 관리할 수 있습니다. 실무에서는 무분별한 자원 사용으로 서비스 장애가 발생하지 않도록 다음과 같은 옵션을 자주 사용합니다.

[CPU 제한 예시 (최대 1개의 CPU 사용)]

docker run -d --name limited_cpu --cpus="1.0" nginx:latest

[메모리 제한 예시 (최대 512MB 사용)]

docker run -d --name limited_memory -m 512m nginx:latest

자원 사용 현황을 확인하는 데 자주 쓰이는 명령어는 다음과 같습니다.

docker stats

자주 발생하는 Docker 문제와 빠른 해결법

Docker 운영 중 자주 발생하는 문제의 예시와 해결법을 소개합니다.

  • 포트 충돌 오류: 컨테이너 실행 시 포트가 이미 사용 중일 때 발생합니다. 포트를 변경하거나 기존 포트를 사용 중인 컨테이너를 중지하여 해결합니다.
  • 디스크 용량 부족: 정기적으로 불필요한 이미지와 컨테이너를 삭제하여 디스크 공간을 확보합니다. (docker system prune)
  • 컨테이너 네트워크 문제: 네트워크 상태를 조회하여 컨테이너 간 연결 상태를 확인하고, 필요시 컨테이너를 다시 네트워크에 연결합니다.

[불필요한 리소스 일괄 정리]

docker system prune -a

Docker 환경 최적화 팁 (이미지 레이어 관리)

Docker 이미지를 생성할 때 이미지 크기와 효율성을 고려하여 Dockerfile을 작성하면 빠르고 최적화된 환경 구성이 가능합니다. 이미지 레이어 수를 줄이고 불필요한 파일을 정리하면 이미지 크기가 줄어 배포와 로딩이 빨라집니다.

Dockerfile 최적화 팁은 다음과 같습니다.

  • 비슷한 명령어는 한 줄로 묶어 레이어 수를 줄입니다.
  • 불필요한 캐시와 임시 파일을 즉시 삭제합니다.
  • 멀티 스테이지 빌드를 활용하여 빌드 중 생성된 불필요한 파일을 배포 이미지에서 제외합니다.

[멀티 스테이지 빌드 예시]

FROM node:18 AS build
WORKDIR /app
COPY . .
RUN npm install && npm run build

FROM nginx:latest
COPY --from=build /app/dist /usr/share/nginx/html
EXPOSE 80

Comments