도커(Docker)

프로세스 형태로 가상머신을 재현, 가상 환경 구축의 많은 부분을 생략하여 훨씬 가볍고 간편함

CTF, 워게임에서 사용되는 이유

풀이자가 직접 가상 환경을 구축하면 출제자가 의도한 환경에서 벗어날 수 있음

특히 시스템 해킹에서는 정교한 공격을 위해 똑같은 환경에서 바이너리를 디버깅하고 exploit하는 것이 중요함

CTF - 같은 서버에서 여러 문제를 제공하면 공격 과정에서 다른 문제에 영향을 미치거나 출제자가 의도하지 않은 공격을 수행할 수도 있음 → 도커는 각각의 문제를 분리된 환경에 있는 것처럼 제공할 수 있다

  1. 컨테이너

    컨테이너를 만들고, 실행하고, 배포할 수 있는 가상화 플랫폼

    컨테이너란, 가상의 환경이 구축되어 있는 하나의 박스를 말함

    ⇒ 특정한 환경을 구성하기 위해 만들어진 가상의 공간 / 실행 중인 이미지

    도커 이미지와 사용자가 컨테이너를 시작할 때 작성하는 옵션에 의해 정의됨

    [명령어]에는 보통 /bin/sh을 전달함

    컨테이너 실행시키기 ⇒ docker run -it {이미지명orID}{:TAG} /bin/bash 많이 사용함

    docker run [옵션] {이미지명orID}{:TAG} [명령어]
    
    -p {호스트 PORT}:{컨테이너 PORT} 로 포트를 매핑, 
    컨테이너에서 listen하고 있는 PORT를 호스트의 특정 PORT로 접속할 수 있도록 함
    
    -it로 컨테이너에서 bash 쉘을 사용할 수 있음
    	-i (--interactive) 표준 입력을 활성화하여 사용자가 명령어를 입력할 수 있도록 함
    	-t (--tty) 가상 터미널을 사용할 수 있도록 함
    

    컨테이너 생성과 명령을 따로 하기

    docker create [옵션] {이미지명orID}{:TAG} [명령어]
    docker start [옵션] {컨테이너명orID}{:TAG}
    

    실행 중인 컨테이너 확인

    docker ps 실행 중인 컨테이너 목록 출력
    docker ps -a 종료된 컨테이너까지 출력
    

    컨테이너 중단하기

    docker stop [옵션] {컨테이너명orID}{:TAG} // docker start로 재시작 가능
    

    실행 중인 컨테이너에 명령어 전달하기

    docker exec [옵션] {컨테이너명orID}{:TAG} [명령어]
    

    실행 중인 컨테이너에 쉘 붙기

    docker exec -it {컨테이너명orID}{:TAG} /bin/bash
    

    컨테이너 삭제하기

    docker rm [옵션] {컨테이너명orID}{:TAG}
    
                            `↑`                               
    
  2. 도커 이미지(Docker Image) 도커 컨테이너의 전 단계로, 컨테이너를 생성하고 실행하기 위한 모든 것을 포함

    (파일, 환경 변수, 명령어, 파일 시스템 등)

    태그(Tag)를 붙여 하나의 이미지에 여러 개의 별명을 붙여준다 (주로 버전을 지정하는 데 사용)

    이미지 확인하기

    docker images
    사용 가능한 이미지 목록을 확인
    

    이미지 삭제하기

    docker rmi [옵션] {이미지명orID}{:TAG}
    

    도커 레지스트리(Docker Registry) 도커 이미지를 저장하는 저장소, 공식적으로 Docker Hub가 있음

    docker pull [옵션] {이미지명or레포/이미지명}{:TAG}
    
                            `↑`                               
    
  3. Dockerfile 이미지를 생성하기 위해 단계적으로 필요한 명령이 작성된 파일, 빌드하면 도커 이미지가 생성됨.

    docker build [옵션] {Dockerfile 경로_파일명이 아니라 디렉토리}
    -t {이미지명}{:태그} 로 도커 이미지의 이름과 태그를 지정할 수 있음. default 태그는 latest임
    -f {파일명} 으로 원하는 이름의 도커 파일을 사용할 수도 있음 (Default: Dockerfile)
    

이미지 또는 컨테이너의 자세한 정보 보기

docker inspect [옵션] {이미지명 OR 컨테이너명}{:ID}