DevOps

[Docker] 02. 도커 (Docker) 명령어 및 실습 해보기

코딩 기록하는 애기 개발자 2025. 9. 22. 10:50

목차

     

    도커 (Docker)의 실행 흐름

    • docker-cli (도커 클라이언트) : 사용자가 터미널에서 도커 명령어를 입력한다.
    • dockerd (도커 데몬) : 도커 API 요청을 처리하는 백그라운드 프로세스
    • containerd : 컨테이너 실행 및 괄니에 필요한 기능을 수행하는 오픈소스 컨테이너 런타임으로, 컨테이너의 생명주기를 모두 관리한다.
    • containerd-shim : containerd와 runc 사이에서 작동하는 중간 프로세스로, 컨테이너 실행을 조정하는 역할을 한다.
    • runc : 컨테이너 실행과 관련된 작업을 수행하는 저수준 컨테이너 런타임으로, 실제 컨테이너 실행만 담당한다.

     

     

    나는 현재 MacOS 환경에 Virtual Box를 설치했고, 그 위에서 도커를 실행한다.

    호스트 OS : macOS
    가상화 소프트웨어 : VirtualBox
    게스트 OS : Ubuntu (Linux 기반)

     

     

     

    이제 도커의 명령어에 대해서 알아보도록 하자.

    Docker 엔진 시작/종료 및 설정하는 법

    • 도커 엔진 시작하기
    sudo systemctl start docker
    • 도커 엔진 종료하기
    sudo systemctl stop docker
    • 자동 실행 설정하기
    sudo systemctl enable docker
    • 설정 상태 보기
    sudo systemctl is-enabled docker
    enabled : 부팅 시 자동 실행 설정
    disabled : 자동 실행 설정 안 됨
    static : 다른 서비스에 의해 의존적으로 실행되는 경우
    •  상태 확인하기
    sudo systemctl status docker

     

     

    도커 명령어의 기본적인 사용법

    docker [상위 커맨드(무엇을)] [하위 커맨드(어떻게)] [옵션(대상)]

     

    컨테이너 (Container) 사용 명령어

    docker container [하위 커맨드] [옵션]
    • docker container run [옵션] [이미지]: 이미지로 컨테이너 생성 및 실행
    • docker container ps : 실행중인 컨테이너 목록
    • docker container ps -a : 모든 컨테이너 목록
    • docker container stop [컨테이너] : 컨테이너 정지
    • docker container start [컨테이너] : 정지된 컨테이너 재시작 
    • docker container rm [컨테이너] : 컨테이너 삭제
    • docker container ls : 로컬에 저장된 실행중인 컨테이너 목록 (=ps의 최신 버전)
    • docker container cp [컨테이너:경로] [호스트 경로] : 컨테이너에서 파일 복사
    • docker container create [이미지] : 도커 이미지로부터 컨테이너 생성
    • docker container commit : 도커 컨테이너를 이미지로 변환
    • docker container exec -it [컨테이너명] [명령] : 실행 중인 컨테이너에 명령 실행
    • docker container attach [컨테이너명] : 실행 중인 컨테이너에 연결
    • docker container logs [컨테이너명] : 컨테이너의 로그 출력
    • docker container inspect [컨테이너명] : 컨테이너 상세 정보 출력 (JSON 형식)
    • docker container rename [컨테이너 기존 이름] [컨테이너 새 이름] : 컨테이너의 이름 변경

    이미지 (Image) 사용 명령어

    docker image [하위 커맨드] [옵션]
    • docker image ls: 로컬에 저장된 도커 이미지 목록 표시
    • docker image pull [이미지] : 레지스트리 (Docker Hub)에서 이미지 다운로드
    • docker image push [이미지] : 레지스트리 (Docker Hub)로 이미지 업로드
    • docker image build -t [이름:태그] : Dockerfile로부터 이미지 생성
    • docker image tag [이미지 ID]:[새이름:태그] : 레지스트리 (Docker Hub)에서 이미지 다운로드
    • docker image inspect [이미지] : 이미지 상세 정보 출력 (JSON 형식)
    • docker image history [이미지 ID] : 이미지가 생성된 히스토리 (레이어) 확인
    • docker image save -o [파일명.tar] [이미지] : 이미지를 tar 파일로 저장
    • docker image load -i [파일명.tar] : tar로 묶인 이미지 로드 (불러오기)
    • docker image rm [이미지]: 도커 이미지를 삭제

    볼륨 (volume) 사용 명령어

    docker volume [하위 커맨드] [옵션]
    • docker volume create: 볼륨 생성
    • docker volume inspect: 볼륨의 상세 정보 출력
    • docker volume ls: 볼륨의 목록 출력
    • docker volume prune: 현재 마운트되지 않은 볼륨 모두 삭제
    • docker volume rm: 지정한 볼륨 삭제
    도커는 컨테이너에서 작업을 진행하기 때문에 모든 데이터는 컨테이너 내부에 존재한다.
    만약 여기서 컨테이너를 삭제하게 된다면 ?

    바로 해당 컨테이너에 존재하는 데이터들까지 전부 사라지게 된다 ! 

    이때, 컨테이너는 삭제해도 데이터는 유지하고 싶을 때는 어떻게 해야할까 ?
    바로 볼륨 (volume) 을 사용하면 된다.

    볼륨 (Volume) 이란 ?
    컨테이너와 독립적으로 데이터를 저장하는 공간으로, 데이터의 지속성을 확보하기 위해 사용된다.
    이는 컨테이너 내부에서 생성된 데이터를 저장하며, DB의 데이터를 유지하고, 로그 파일을 기록하는 등 일시적인 데이터가 아닌 영구적인 데이터를 저장할 때 사용된다.

     

     

    네트워크 (Network) 사용 명령어

    docker network [하위 커맨드] [옵션]
    • docker network connect: 컨테이너를 도커 네트워크에 연결
    • docker network disconnect: 컨테이너의 도커 네트워크 연결 해제
    • docker network create: 컨테이너 네트워크를 생성
    • docker network inspect: 도커 네트워크의 상세 정보를  출력
    • docker network ls: 도커 네트워크의 목록을 출력
    • docker network prune: 현재 컨테이너가 접속하지 않은 네트워크를 모두 삭제
    • docker network rm: 지정한 네트워크를 삭제
    네트워크 (Network) 란 ?
    컨테이너끼리 서로 통신할 수 있게 연결해주는 통신망이라고 생각하면 된다. 
    각 컨테이너는 기본적으로 독립된 네트워크 공간에서 실행되므로, 다른 컨테이너와 바로 통신할 수 없다. 이때, 네트워크를 연결하면 컨테이너끼리 서로 IP 주소를 통해 통신할 수 있다.

    즉, 컨테이너끼리 메세지를 주고받게 해주는 가상의 LAN과 같다. 

     

     

    단독으로 사용하는 명령어

    • docker login: 도커 레지스트리에 로그인
    • docker logout: 도커 레지스트리에서 로그아웃
    • docker search: 도커 레지스트리를 검색
    • docker version: 도커 엔진 및 명령행 도구의 버전을 출력

     

     

    도커 명령어 옵션

    • -d : 백그라운드 실행 (detach)
      • 컨테이너 뒤에서 몰래 실행 시킨다.
      • ex) 웹서버를 켜놓고 터미널은 다른 작업을 계속 하고 싶을 때 docker run -d ngnix 입력 -> 터미널에는 보이지 않지만 컨테이너는 계속 실행중이다.
    • -p: 포트 포워딩 (publish)
      • 컨테이너 안의 포트를 내 컴퓨터 (호스트)  포트에 연결한다.
      • 해당 과정을 통해 웹 브라우저에서 접속이 가능해진다.
      • ex) docker run -d -p 8080:80 nginx -> 내 컴퓨터에서 http://localhost:8080 에 접속하면 컨테이너 안의 80번 포트에 연결된다.
    • --name: 컨테이너 이름 지정
    • -v: 볼륨 마운트
      • 컨테이너 안의 특정 폴더와 내 컴퓨터 폴더를 연결한다.
      • 컨테이너가 지워져도 데이터가 사라지지 않는다.
    • -it: 터미널 입력 연결 (인터랙티브 모드)
      • 컨테이너 내부로 직접 들어가서 명령을 실행할 수 있다.

     

    도커 이미지 실습해보기 

    1. 도커 이미지 다운로드

     

    2. 도커 이미지 목록 확인

    • REPOSITORY : 이미지 이름
    • TAG : 이미지 태그 (이미지 버전을 구분하기 위해 붙이는 이름)
      • 이미지를 다운로드 할 때 버전을 명시하지 않으면 자동으로 latest 가 붙는다.
    • IMAGE ID : 로컬에 다운로드 된 이미지의 ID
    • CREATED : 이미지가 생성된 시간
    • SIZE : 이미지 크기

     

    3. 도커 컨테이너 실행

    • docker container ls : 현재 실행중인 컨테이너를 보여주기 때문에 아무것도 보이지 않는다.
    • docker container ls -a : 현재 실행중인 컨테이너를 포함한 모든 컨테이너 목록을 보여준다.

     

    내가 든 의문 

    docker container run 은 실행해주는 명령어 아닌가 ? 

    근데 왜 docker container run 를 했을 때 뜨지 않는 것일까 ?

    그래서 찾아보았다.

     

    이는 컨테이너가 생성 후 바로 종료됐기 때문이다 !

     

    동작 방식에 대해서 알게 되면, 이해할 수 있을 것이다.

    1. docker container run A 을 하게 되면, 컨테이너 A가 생성되고 실행된다.
      • 이때, 실행할 명령어를 지정하지 않으면 ubuntu는 기본적으로 bash 라는 쉘 (터미널)을 실행하도록 되어있다.
    2. 연결되어있는 쉘 / 터미널(bash) 을 실행한다.
      • 현재 터미널을 연결하지 않았기 때문에 실행 후 바로 종료되는 것이다.
      • 터미널을 연결한다 = 컨테이너 안에서 직접 명령어를 입력할 수 있도록 하는 것

     

    해결 방법

    docker run -it ubuntu bash

     

    인터랙티브 모드로 실행한다.

    • -i 표준 입력(stdin)을 유지 ( 키보드로 입력 받기 )
    • -t 터미널 연결한다.
    • bash 실행할 명령어

     

    이렇게 하면, 컨테이너 안에서 바로 터미널을 사용할 수 있고, 종료 전까지 docker container ls 에 표시된다.

     

    해당 명령어를 실행하면 이와 같이 컨테이너 내부에 접속하면서 실행중 상태가 된다.

    이 상태로 exit 명령어를 작성하면 컨테이너가 종료되면서 컨테이너 밖으로 나가진다.

     

     

    4. 도커 컨테이너 삭제

     

     

    5. 도커 이미지 삭제

    삭제 명령어를 입력했을 때 나오는 Untagged 로그들이 궁금해서 찾아봤다.

    • Untagged ubuntu:latest 라는 태그가 제거된다. 도커 이미지는 [이름]:[태그] 로 관리되는데, 이 연결고리를 끊어내는 것이다.
    • Untagged ubuntu@sha256 이미지에 붙어있던 다이제스트(digest)가 제거된다. 이는 내용 기반의 고유값으로, 절대 바뀌지 않는 유일한 값이다. 도커 이미지가 변경되면, 값도 달라지게 된다.

     

    6. 도커 이미지 변경

     

    7. 도커 이미지를 저장, 압축 및 복구