들어가기 전에, 기본 개념 알아두기! 이미지와 컨테이너, 도커 허브란?

도커에서 Nginx 웹 서버를 실행해야 한다고 가정해보자.
도커에서는 Nginx를 실행할 때, 이미지와 컨테이너라는 것이 필요하다.
그러기 위해서는 우선 이미지와 컨테이너의 각각의 역할을 이해하는 것이 중요하다.

이미지란? (Image)

도커에서 Nginx를 실행하기 위한 위한 기본 설정, 라이브러리, 종속성 등을 포함하는 정적 템플릿을 의미한다.
이미지 자체는 불변하며, 단지 실행 가능한 환경을 제공하기 위한 청사진일 뿐이다.

Nginx 이미지의 경우는 이미 설정된 상태로 제공되며,
이 이미지를 기반으로 컨테이너를 생성하면 웹 서버의 역할을 수행할 수 있게 된다.
Docker Hub에는 공식 Nginx 이미지가 제공 되어 있기 때문에 쉽게 다운로드하고 사용할 수 있다.

도커 허브란? (Docker Hub)

도커 허브는 클라우드 기반 서비스로,
도커 이미지의 중앙 저장소이자 가장 널리 사용되는 컨테이너 이미지 레지스트리이다.

도커 이미지의 저장, 관리, 공유를 위한 플랫폼을 제공하며, 공개 또는 비공개 이미지 저장소를 지원한다.
사용자는 도커 허브에 도커 이미지를 저장하고, 필요할 때 이를 가져와(Docker Pull) 컨테이너를 생성할 수 있다.

✨ 도커 이미지 받는 곳

도커 허브의 주소는 https://hub.docker.com/ 이다.
해당 웹 사이트에서 이미지를 검색해 볼 수 있다.

컨테이너란? (Container)

컨테이너는 이미지를 복사하여 독립적으로 실행되는 가상 환경을 제공한다.
이미지를 기반으로 한 하나의 인스턴스로 이해하면 된다.
즉, 컨테이너는 이미지에서 파생되어 실제로 이미지를 실행하는 역할을 한다.

컨테이너는 외부에서 접근할 수 있도록 컨테이너 내부 포트와 호스트의 포트를 매핑해 주어야 하는데,
예를 들어, 호스트의 8080 포트를 컨테이너 내부의 80포트로 매핑을 하게 되면 localhost:8080 을 통해 컨테이너로 접근할 수 있게 된다.

작동 과정 간단 요약

작동 과정은 웹 서버(Nginx)로 예를 들어 간략히 설명해보겠다.

  1. 이미지 다운로드 : Nginx 이미지를 도커 허브에서 로컬 시스템으로 다운로드 받는다.
  2. 컨테이너 생성 및 실행 : Nginx 이미지를 기반으로 컨테이너를 생성하고 실행한다.
  3. 컨테이너에서 Nginx 서버 실행 : 컨테이너 내부에서 Nginx가 실행되고, 웹 서버로서의 역할을 수행한다.
  4. 포트 매핑을 통한 클라이언트 요청 처리 : 호스트의 특정 포트와 컨테이너의 Nginx 서버의 포트를 매핑하여 외부 요청을 처리하고 응답한다.

초보자를 위한 필수 도커 명령어

자, 그럼 이제 컨테이너를 활용하기 위한 필수 도커 명령어들을 알아보자.

이미지 관련 명령어

이미지 찾기

docker search [이미지명]
ShellScript

도커 허브에서 원하는 이미지를 검색한다.
예를 들어, docker search mysql 은 mysql 이미지를 검색한다.

이미지 찾기 명령어를 사용한 예시 이미지

이미지 다운로드하기

docker pull [이미지명]:[태그명]
ShellScript

도커 허브에서 이미지를 다운로드 한다.
태그명을 입력할 경우, 특정 버전의 이미지를 받을 수 있다.
태그명을 생략할 경우, 가장 최신 버전(latest)의 이미지를 다운로드 받는다.

이미지를 다운로드 명령어를 이용하여 이미지를 다운로드 받는 예시 이미지

다운로드된 이미지 목록 확인하기

docker image ls
ShellScript

다운로드된 이미지의 목록을 확인한다.
이 명령어를 통해 내가 다운로드한 이미지들을 확인해볼 수 있다.

이미지 리스트 확인 명령어를 통해 이미지의 목록을 확인한 예시 이미지

이미지 삭제하기

docker image rm [이미지ID] 혹은 [이미지명]
ShellScript

다운로드한 이미지를 삭제한다.
이미지 목록 확인 명령어인 docker image ls 를 통해 확인된 이미지ID 를 입력해도 되고,
혹은 리파지토리 이름인 이미지명 을 입력해도 된다.
이미지ID는 전부 기재하지 않아도 된다.

이미지의 목록을 확인하여 이미지 삭제 명령어를 통해 이미지ID에 해당하는 이미지를 삭제하는 예시 이미지
✅ 만약 이미지의 삭제가 불가능할 경우에는?

만약 이미지가 사용중이기 때문에 삭제가 불가능한 경우가 있다.
이럴 때에는 -f 명령어를 이용하여 해당 이미지를 강제로 삭제할 수 있다.
docker image rm -f [이미지ID] 또는 [이미지명]

컨테이너 관리 관련 명령어

컨테이너 생성하기

docker create --name [컨테이너명] [이미지명]:[태그명]
ShellScript

입력한 컨테이너명과 이미지를 기반으로 컨테이너를 생성한다.
컨테이너의 이름을 생략할 경우, 컨테이너는 이미지의 이름으로 컨테이너가 생성된다.
이 명령어는 컨테이너를 생성하지만 이미지를 실행하지는 않는다.

컨테이너 생성 명령어를 통해 nginx 이미지를 nginx-container라는 이름을 가진 컨테이너로 생성한 예시 이미지

컨테이너 실행하기

docker start [컨테이너명] 또는 [컨테이너ID]
ShellScript

생성된 컨테이너를 실행한다.
생성할 때 지정한 컨테이너명을 입력할 수도 있고,
컨테이너ID를 통해 컨테이너를 실행할 수도 있다.
컨테이너ID는 컨테이너의 목록을 확인하는 docker ps 명령어를 통해 확인 가능하며 ID를 전부 기재하지 않아도 된다.

컨테이너 확인하기

docker ps
ShellScript
  • docker ps : 실행 중인 컨테이너 목록을 보여준다.
  • docker ps -a : 모든 컨테이너 목록(실행 중인 컨테이너 포함)을 보여준다.
모든 컨테이너를 확인하는 예시 이미지

docker ps 명령어를 실행하면 일반적으로 다음과 같은 정보를 포함하는 표 형식으로 결과가 표시된다.

  • CONTAINER ID: 컨테이너의 고유 ID
  • IMAGE: 컨테이너에서 실행 중인 이미지 이름
  • COMMAND: 컨테이너에서 실행 중인 명령어
  • CREATED: 컨테이너가 생성된 시간
  • STATUS: 컨테이너의 현재 상태 (예: created, running, exited 등)
  • PORTS: 호스트와 컨테이너 간의 포트 매핑 정보
  • NAMES: 컨테이너의 이름
✅ 추가 옵션 알아두기
  • -a 또는 --all : 모든 컨테이너(실행 중인 컨테이너와 종료된 컨테이너 모두)를 표시한다.
    • 예시) docker ps -a
  • -q 또는 --quiet : 컨테이너 ID만 출력한다. 스크립트에서 사용하기 유용하다.
    • 예시) docker ps -q
  • --filter : 특정 조건에 따라 결과를 필터링 할 수 있다.
    • 예시) docker ps --filter "status=exited"

컨테이너 시작하기

docker start [컨테이너명] 또는 [컨테이너ID]
ShellScript

컨테이너를 시작한다.

컨테이너를 시작하는 명령어를 입력하여 컨테이너 상태의 전후를 비교한 예시 이미지

컨테이너 재시작하기

docker restart [컨테이너명] 또는 [컨테이너ID]
ShellScript

컨테이너를 재시작한다.

실행중인 컨테이너 중단하기

docker stop [컨테이너명] 또는 [컨테이너ID]
ShellScript

컨테이너를 정지한다.

컨테이너를 정지하는 명령어를 입력하여 컨테이너 상태의 전후를 비교한 예시 이미지

컨테이너 강제 중단하기

docker kill [컨테이너명] 또는 [컨테이너ID]
ShellScript

컨테이너를 강제 종료한다.

컨테이너 삭제하기

docker rm [컨테이너명] 또는 [컨테이너ID]
ShellScript

컨테이너를 삭제한다.

컨테이너 실행 관련 명령어

컨테이너 생성과 실행 한꺼번에 하기

docker run --name [컨테이너명] [이미지명]:[태그명]
ShellScript

create 명령어와 start 명령어가 합쳐진 명령어이다.
이 명령어는 컨테이너를 생성하고 실행해주는 것을 한꺼번에 해준다.
만약 이미지가 존재하지 않을 경우에는 docker pull 명령어의 기능까지 포함된다.

run 명령어를 사용하여 도커 컨테이너를 생성과 실행을 하는 예시 이미지

컨테이너 포트 매핑하기

docker run -p [호스트포트]:[컨테이너포트] [이미지명]:[태그명]
ShellScript

-p는 컨테이너 내부의 포트에 접근하기 위한 포트 매핑 명령어이다.
nginx의 컨테이너 포트가 80(기본 포트)일 경우, 호스트 포트와 매핑하여 컨테이너로 접근할 수 있다.
예를 들어, 호스트 포트 8888에 접근할 경우,
nginx 컨테이너 포트에 접근하려면 docker run -p 8888:3306 nginx 을 입력하면 된다.

✅ 컨테이너 실행 추가 옵션 알아두기
  • -it : 컨테이너에 인터랙티브 터미널을 연결한다.
  • -d : 백그라운드에서 컨테이너를 실행한다. 해당 명령어가 생략될 경우, 컨테이너는 포그라운드에서 컨테이너를 실행한다.
  • -p [호스트포트]:[컨테이너포트] : 호스트포트를 컨테이너포트로 매핑한다.
    • 예시) docker run -p 5000:80
      > nginx는 5000포트를 사용해 컨테이너에 접근하며 nginx 컨테이너가 내부적으로 사용하는 기본 포트인 80(컨테이너포트)로 연결된다.
      > 즉, 5000포트를 사용해( localhost:5000 ) nginx 컨테이너에 접근할 수 있다.
  • --name : 컨테이너에 이름을 지정한다.
    • 예시) docker run -it -d --name my_ubuntu ubuntu:latest
      > my_ubuntu라는 이름으로 Ubuntu 최신 버전 컨테이너를 실행한다.
❓ 도커 실행, 포그라운드(Foreground)와 백그라운드(Background)의 차이는?

포그라운드 실행 (Foreground Mode)
컨테이너가 실행되면서, 해당 컨테이너의 로그나 출력을 터미널에 실시간으로 표시하고, 그동안 터미널을 점유한다.
즉, 컨테이너가 실행되는 동안 사용자는 해당 터미널에서 다른 작업을 할 수 없으며, 명령어 입력이 불가능하다.
포그라운드 실행은 주로 디버깅이나 실시간 로그 확인이 필요한 경우에 유용하다.
애플리케이션의 동작을 확인하고, 컨테이너가 종료되면 바로 터미널에서 결과를 확인할 수 있다.

백그라운드 실행 (Detached Mode)
컨테이너가 백그라운드에서 실행되며, 터미널을 점유하지 않고 사용자에게 즉시 반환된다.
즉, 컨테이너는 백그라운드에서 계속 실행되면서, 사용자는 해당 터미널에서 다른 명령어를 입력하고 작업을 계속할 수 있다.
백그라운드 실행은 주로 서버지속적으로 실행되어야 하는 서비스를 운영할 때 사용된다.
예를 들어, 웹 서버, 데이터베이스 서버 등 항상 실행되어야 하는 애플리케이션을 배포할 때 백그라운드 모드를 사용한다.

두 실행 모드의 차이점 요약

특징포그라운드 실행 (Foreground Mode)백그라운드 실행 (Detached Mode)
터미널 사용터미널을 점유하고, 실시간 로그와 출력이 터미널에 표시됨터미널을 점유하지 않고 즉시 반환됨
실시간 상호작용컨테이너 내부에서 직접 상호작용 가능 ( -it 옵션)상호작용 불가, 필요시 docker exec 로 접속 가능
로그 확인실시간으로 로그를 터미널에서 볼 수 있음 docker logs <container> 명령어로 확인해야 함
실행 중지 Ctrl + C 로 중지 가능 docker stop <container> 명령어 필요
사용 상황디버깅, 로그 확인, 상호작용이 필요한 경우서버, 지속적인 서비스 배포에 적합
-it 명령어, 인터랙티브 터미널이란? (Interactive Terminal)

사용자가 터미널을 통해 명령어를 직접 입력하고, 실시간으로 응답을 받을 수 있는 환경이다.
도커에서는 컨테이너 내부에 접속해 그 안에서 실행되는 애플리케이션이나 프로세스와
상호작용할 수 있도록 인터랙티브 모드로 컨테이너를 실행할 수 있다.

도커에서의 인터랙티브 터미널의 역할은 실행 중인 컨테이너 내부에 직접 접속해 명령어를 입력하고 그 결과를 실시간으로 확인할 수 있으며,
-it 명령어를 사용하여 컨테이너 내부에서 명령을 입력할 수 있는 환경(인터랙티브 셸)을 활성화해준다.
사용자는 이 명령어를 이용하여 바로 컨테이너 안으로 들어가 셸 환경에서 명령어를 입력할 수 있게 된다.

간단 예시, 새 컨테이너를 인터랙티브 모드로 실행
> docker run -it nginx
> nginx 이미지를 기반으로 컨테이너를 실행하고 사용자는 바로 컨테이너 안으로 들어가 bashsh 와 같은 셸이 자동으로 실행된다.

간단 예시, 이미 실행 중인 컨테이너에 접속
> docker exec -t [컨테이너명] bash
> 이미 실행 중인 컨테이너에 명령어를 실행할 수 있도록 하며, 인터랙티브 터미널을 이용해 컨테이너 안에서 bash 셸을 실행하여 상호작용 할 수 있다.

실행 중인 컨테이너에 접속하기

docker exec -it [컨테이너명] 또는 [컨테이너ID] bash
ShellScript

실행 중인 도커 컨테이너에 접속하여 상호작용 할 수 있는 셸을 실행한다.
이 명령어는 이미 실행 중인 컨테이너에만 사용할 수 있다.
만약 컨테이너가 중지된 상태라면 docker exec 명령어로 접속할 수 없다.

bash 는 컨테이너 내부에서 실행할 명령어로, 셸(Shell)을 실행하는 명령어이다.
이를 통해 컨테이너 안에서 터미널을 사용할 수 있게 해준다.

접속한 컨테이너에서 나가려면(셸 종료), exit 명령어를 입력하여 컨테이너 밖으로 나올 수 있다.

✅ 인터랙티브 터미널 활용 방법
  1. 컨테이너 생성 및 접속 (bash 셸 실행): docker run -it nginx bash
    • 이 명령어는 nginx 이미지를 기반으로 컨테이너를 생성하고, 해당 컨테이너의 bash 셸로 접속하여 상호작용할 수 있는 터미널을 연다.
    • 사용자는 이제 nginx 컨테이너 내부에서 명령어를 입력하고 실행할 수 있다.
  2. 실행 중인 컨테이너에 접속: docker exec -it [컨테이너명 또는 컨테이너ID] bash
    • 이미 실행 중인 컨테이너에 접속하려면 docker exec -it 명령어를 사용한다.
    • [컨테이너명 또는 컨테이너ID] 에 컨테이너 이름이나 ID를 입력하고 bash 셸로 접속할 수 있다.

컨테이너 로그 관련

컨테이너의 로그 보기

docker logs [컨테이너명] 또는 [컨테이너ID]
ShellScript

docker logs 명령어는 도커 컨테이너의 로그 출력을 확인할 때 사용된다.
이 명령어를 통해 컨테이너가 실행되면서 출력한 표준 출력(stdout) 및 표준 에러(stderr) 로그를 확인할 수 있다.
이는 컨테이너의 상태나 오류를 분석하는 데 유용하다.

도커 컨테이너의 로그를 확인하는 예시 이미지
✅ 컨테이너 로그 확인 명령어의 주요 옵션 알아두기
  1. 실시간 로그 확인하기 ( -f )
    • 로그가 실시간으로 출력되도록 팔로우(follow)하는 옵션이다.
      > 예시) docker logs -f [컨테이너명] 또는 [컨테이너ID]
  2. 로그 라인 제한하기 ( --tail )
    • 최근 로그만 확인하고 싶을 때 사용한다.
    • 마지막 N개의 줄만 출력한다.
      > 예시) docker logs --tail [보여질 줄 숫자] [컨테이너명] 또는 [컨테이너ID]
      > 예시2) MyContainer의 마지막 5줄 로그 확인하기 ➡️ docker logs --tail 50 MyContainer
  3. 시간 범위별 로그 확인하기 ( --since 또는 --until )
    • 특정 시간 이후 또는 이전의 로그만 확인하고 싶을 때 사용한다.
    • > 예시) docker logs --since "2024-10-07T00:00:00" --until "2024-10-07T12:00:00" [컨테이너명] 또는 [컨테이너ID]
    • > 예시2) MyContainer의 10월 10일 이후 로그 확인하기 ➡️ docker logs --since "2024-10-10" MyContainer

예제) 도커 컨테이너에 Nginx 웹 서버를 구축하고 웹 페이지로 접속해보기

Nginx 컨테이너 실행하기

컨테이터를 백그라운드에서 실행( -d )하며,
호스트의 8888포트를 컨테이너의 80번 포트에 연결( -p )하고.
컨테이너의 이름( --name )은 “my-nginx”로 지정해보자.

docker run -d -p 8888:80 --name my-nginx nginx
ShellScript

✅ 알아두기
run 명령어는 이미지를 다운로드하고, 컨테이너를 생성, 시작, 실행하는 과정을 모두 포함한다.

웹 페이지에 접속하기 (nginx 컨테이너에 접근하기)

웹 브라우저 주소창에 지정한 호스트의 포트를 입력( localhost:8888 )해보자.
Nginx 웹 서버의 기본 페이지가 나타난다면, 도커 컨테이너의 nginx 웹 서버 구축이 완료된 것이다.

nginx 컨테이너를 이용해 매핑된 포트를 이용하여 웹 서버에 접속한 예시 이미지

Similar Posts

댓글 남기기