Docker 기본

Docker는 언제 사용되는가?

  1. 환경 격리가 필요한 상황: 같은 서버 내에서 여러 애플리케이션의 환경을 분리해야 할 때
  2. 리소스 효율성: 서버 내의 격리된 환경에서 실행하여 낭비되는 리소스를 최소화
  3. 개발 환경 통일: 개발, 테스트, 운영 환경을 동일하게 구성할 때
  4. 마이크로서비스 아키텍처: 각 서비스를 독립적으로 배포하고 관리할 때

Docker 장점

  1. 가벼움: Guest OS 없이 동작하여 VM보다 빠르고 효율적
  2. 빠른 환경 구성: docker-compose up을 통해 빠른 개발환경 세팅 가능
  3. 환경 독립성: 로컬환경과 무관하게 다양한 버전으로 테스트 가능
  4. 이식성: 어떤 환경에서든 동일하게 실행
  5. 버전 관리: 이미지 태그를 통한 버전 관리

기본 명령어 구조

Docker 명령어는 docker [대상] [명령어] [옵션] 형태로 구성됩니다.

주요 옵션

  • -it : Interactive + TTY (터미널 접속용, 디버깅 시 주로 사용)
  • -d : Detach 모드 (백그라운드 실행)
  • -f : Force (강제 실행)
  • -a : All (모든 항목 표시)
  • -q : Quiet (ID만 출력, 다른 명령어와 조합할 때 유용)
  • -p : Port mapping (호스트:컨테이너 포트 연결)
  • --name : 컨테이너에 이름 지정
  • --rm : 컨테이너 종료 시 자동 삭제

Container 관련 명령어

컨테이너 확인

# 실행 중인 컨테이너 확인
docker ps

# 모든 컨테이너 확인 (중지된 것 포함)
docker ps -a

# 컨테이너 ID만 출력
docker ps -q

컨테이너 실행

# 기본 실행 (run = create + start)
docker container run [옵션] 이미지명[:태그] [실행할명령어]

# 예시: CentOS 컨테이너를 백그라운드에서 실행
docker container run -dit --name myContainer centos:8 /bin/bash

# 웹서버 실행 (포트 매핑)
docker container run -d -p 8080:80 --name web01 httpd

# 일회성 실행 (종료 시 자동 삭제)
docker container run --rm -it centos:8 /bin/bash

컨테이너 제어

# 컨테이너 중지
docker container stop myContainer

# 컨테이너 강제 종료 후 삭제
docker container rm -f myContainer

# 컨테이너 재시작
docker container restart myContainer

컨테이너 접속

# 실행 중인 컨테이너에 접속
docker container attach myContainer

# 컨테이너에서 새로운 명령어 실행
docker container exec -it myContainer /bin/bash

# 컨테이너 로그 확인
docker container logs myContainer

# 실시간 로그 확인
docker container logs -f myContainer

Attach vs Detach 모드

  • Attach 모드: 사용자가 컨테이너 프로세스(PID=1)의 입출력과 연결된 상태

    docker container run -it --name ping01 centos:8 /usr/bin/ping localhost
    
  • Detach 모드: 사용자가 컨테이너 프로세스의 입출력과 분리된 상태 (백그라운드 실행)

    docker container run -dit --name ping02 centos:8 /usr/bin/ping localhost
    
  • Detach 단축키: 컨테이너 내부에서 Ctrl + P + Q

환경 설정

# 작업 디렉토리 및 환경변수 설정
docker container run -it --name koo04 \
  --workdir="/workspace" \
  --env MYNAME=koo \
  centos:8

# 환경변수 파일로 설정
docker container run -it --env-file=env.txt centos:8

# 재시작 정책 설정 (실패 시 최대 2번까지 재시작)
docker container run -d --restart=on-failure:2 --name koo06 centos:8

파일 복사

# 호스트 → 컨테이너
docker container cp ./test.txt myContainer:/root/

# 컨테이너 → 호스트
docker container cp myContainer:/root/test.txt ./

정리 작업

# 중지된 모든 컨테이너 삭제
docker container prune

# 실행 중인 모든 컨테이너 강제 삭제
docker container rm -f $(docker container ps -aq)

Image 관련 명령어

# 로컬 이미지 목록 확인
docker image ls

# 이미지 다운로드
docker image pull nginx:latest

# 이미지 삭제
docker image rm nginx:latest

# 사용하지 않는 이미지 정리
docker image prune

Volume (데이터 저장)

# Volume 생성
docker volume create myvolume

# Volume을 사용한 컨테이너 실행
docker container run --rm -it \
  --mount type=volume,source=myvolume,destination=/root \
  --name c1 centos:8

# 호스트 디렉토리 마운트
docker container run -it -v /host/path:/container/path centos:8

Docker Compose

# 서비스 실행
docker-compose up

# 백그라운드 실행
docker-compose up -d

# 서비스 중지 및 제거
docker-compose down

# 로그 확인
docker-compose logs

유용한 팁

명령어 실행 결과 확인

# 직전 명령어의 실행 결과 확인
echo $?
# 성공: 0, 실패: 1~255

자주 사용하는 조합

# 모든 컨테이너 중지
docker stop $(docker ps -q)

# 모든 이미지 삭제
docker rmi $(docker images -q)

# 시스템 전체 정리 (사용하지 않는 모든 리소스 삭제)
docker system prune -a

주의사항

  1. 컨테이너는 일회용: 수정보다는 삭제 후 재생성하는 것이 Docker의 철학
  2. 데이터 보존: 중요한 데이터는 반드시 Volume이나 Bind Mount 사용
  3. 포트 충돌: 같은 포트를 여러 컨테이너가 사용하지 않도록 주의
  4. 리소스 관리: 사용하지 않는 컨테이너와 이미지는 정기적으로 정리