Docker 기본
Docker는 언제 사용되는가?
- 환경 격리가 필요한 상황: 같은 서버 내에서 여러 애플리케이션의 환경을 분리해야 할 때
- 리소스 효율성: 서버 내의 격리된 환경에서 실행하여 낭비되는 리소스를 최소화
- 개발 환경 통일: 개발, 테스트, 운영 환경을 동일하게 구성할 때
- 마이크로서비스 아키텍처: 각 서비스를 독립적으로 배포하고 관리할 때
Docker 장점
- 가벼움: Guest OS 없이 동작하여 VM보다 빠르고 효율적
- 빠른 환경 구성:
docker-compose up
을 통해 빠른 개발환경 세팅 가능 - 환경 독립성: 로컬환경과 무관하게 다양한 버전으로 테스트 가능
- 이식성: 어떤 환경에서든 동일하게 실행
- 버전 관리: 이미지 태그를 통한 버전 관리
기본 명령어 구조
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
주의사항
- 컨테이너는 일회용: 수정보다는 삭제 후 재생성하는 것이 Docker의 철학
- 데이터 보존: 중요한 데이터는 반드시 Volume이나 Bind Mount 사용
- 포트 충돌: 같은 포트를 여러 컨테이너가 사용하지 않도록 주의
- 리소스 관리: 사용하지 않는 컨테이너와 이미지는 정기적으로 정리