Dandy Now!
  • 도커(Docker) 컨테이너 로그 확인, 컨테이너 내부 명령어 실행(logs, exec) 및 redis 컨테이너 활용 예제
    2025년 07월 09일 13시 06분 19초에 업로드 된 글입니다.
    작성자: DandyNow
    728x90
    반응형

    1. 도커(Docker) 컨테이너 로그 확인, 컨테이너 내부 명령어 실행(logs, exec)

    1-1. docker ps로 실행 중인 컨테이너 확인하기

    도커 컨테이너를 실행하고 나면, 현재 어떤 컨테이너들이 동작 중인지 확인하고 싶을 때가 있다. 이때 docker ps 명령어를 사용한다.

    PS C:\Users\dandycode> docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS          PORTS    NAMES
    7f0139d03681   nginx     "/docker-entrypoint.…"   12 seconds ago  Up 10 seconds   80/tcp   quizzical_cannon
    • CONTAINER ID: 컨테이너의 고유 식별자이다. 짧은 형태로 표시되지만, 전체 ID를 사용해도 무방하다.
    • IMAGE: 컨테이너를 생성할 때 사용한 이미지 이름이다.
    • COMMAND: 컨테이너가 시작될 때 실행되는 명령어이다.
    • CREATED: 컨테이너가 생성된 시각이다.
    • STATUS: 컨테이너의 현재 상태를 나타낸다. Up은 실행 중임을 의미한다.
    • PORTS: 컨테이너와 호스트 간의 포트 연결 정보이다. 위 예시에서는 컨테이너의 80번 포트가 호스트의 80번 포트에 연결된 것으로 보인다.
    • NAMES: 컨테이너의 이름이다. 도커가 자동으로 할당하거나 사용자가 지정할 수 있다.

    1-2. docker logs로 컨테이너 로그 확인하기

    컨테이너가 제대로 동작하는지, 또는 어떤 문제가 발생했는지 확인하기 위해 **로그(log)**를 확인하는 것은 매우 중요하다. docker logs 명령어를 통해 컨테이너의 표준 출력(stdout)과 표준 에러(stderr)를 볼 수 있다.

    PS C:\Users\dandycode> docker logs 7f
    /docker-entrypoint.sh: /docker-entrypoint.d/ is not empty, will attempt to perform configuration
    ... (중략) ...
    2025/07/09 01:44:47 [notice] 1#1: start worker process 40
    • 위 명령어는 ID가 7f로 시작하는 컨테이너의 모든 로그를 출력한다. 컨테이너 ID는 짧게 입력해도 인식이 된다.

    docker logs의 유용한 옵션들

    1) --tail 옵션으로 마지막 N줄만 보기

    • 로그의 양이 많을 때 모든 로그를 다 보는 것은 비효율적이다. --tail 옵션을 사용하면 로그의 마지막 몇 줄만 볼 수 있다.위 명령어는 7f 컨테이너의 로그 중 마지막 10줄만 출력한다.
      PS C:\Users\dandycode> docker logs --tail 10 7f
      2025/07/09 01:44:47 [notice] 1#1: start worker process 31
      ... (중략) ... 
      2025/07/09 01:44:47 [notice] 1#1: start worker process 40

    2) -f (follow) 옵션으로 실시간 로그 확인하기

    • 컨테이너가 실행되는 동안 실시간으로 로그를 추적하고 싶을 때 -f 옵션을 사용한다.이 명령어를 실행하면 컨테이너에서 새로운 로그가 발생할 때마다 터미널에 실시간으로 출력된다. Ctrl + C를 눌러 중지할 수 있다.
      PS C:\Users\dandycode> docker logs -f e5 

    3) --tail 0 -f 조합으로 새로운 로그만 실시간으로 확인하기

    • 이미 출력된 과거 로그는 보고 싶지 않고, 지금부터 발생하는 새로운 로그만 실시간으로 보고 싶다면 --tail 0 -f 옵션을 함께 사용한다.위 예시에서는 이전에 발생했던 Nginx 초기 구동 로그들은 건너뛰고, 웹 요청(GET /)에 대한 로그만 새롭게 표시되는 것을 확인할 수 있다.
      PS C:\Users\dandycode> docker logs --tail 0 -f e5 

    1-3. docker run으로 컨테이너 실행하기

    docker run 명령어는 도커 이미지를 기반으로 새로운 컨테이너를 생성하고 실행하는 역할을 한다.

    PS C:\Users\dandycode> docker run -d -p 80:80 nginx
    • -d (detached mode): 컨테이너를 백그라운드에서 실행한다. 이 옵션이 없으면 컨테이너가 실행되는 동안 터미널이 블록된다.
    • -p 80:80: 포트 포워딩을 설정한다. 호스트포트:컨테이너포트 형식으로, 호스트의 80번 포트로 들어오는 요청을 컨테이너의 80번 포트로 연결한다.
    • nginx: 실행할 도커 이미지의 이름이다. 이 명령어를 통해 Nginx 웹 서버 컨테이너를 실행한 것이다.

    컨테이너가 성공적으로 실행되면 새로운 컨테이너의 ID가 출력된다. 이후 docker ps 명령어로 실행 중인 컨테이너 목록에서 새로 생성된 cranky_hellman 컨테이너를 확인할 수 있다.

    PS C:\Users\dandycode> docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS          PORTS                     NAMES
    e5af2925a96f   nginx     "/docker-entrypoint.…"   6 seconds ago   Up 6 seconds    0.0.0.0:80->80/tcp   cranky_hellman
    7f0139d03681   nginx     "/docker-entrypoint.…"   2 minutes ago   Up 2 minutes    80/tcp                    quizzical_cannon

    1-4. docker exec로 컨테이너 내부 명령어 실행하기

    도커 컨테이너는 격리된 환경이지만, 때로는 컨테이너 내부로 접속하여 특정 명령어를 실행하거나 파일 시스템을 탐색해야 할 때가 있다. 이럴 때 docker exec 명령어를 사용한다.

    PS C:\Users\dandycode> docker exec -it e5 bash
    root@e5af2925a96f:/# ls
    bin   dev           docker-entrypoint.sh  home  lib64  mnt  proc  run   srv  tmp  var
    boot  docker-entrypoint.d   etc               lib   media  opt  root  sbin  sys  usr
    root@e5af2925a96f:/# exit
    exit

    1) -it 옵션

    • -i (interactive): 컨테이너의 표준 입력(STDIN)을 열어둔다. 이를 통해 컨테이너 내부에서 입력을 받을 수 있다.
    • -t (tty): 가상 터미널(pseudo-TTY)을 할당한다. 이를 통해 터미널 환경처럼 명령어를 입력하고 그 결과를 볼 수 있다.
      이 두 옵션을 함께 사용하면 마치 SSH로 원격 서버에 접속한 것처럼 컨테이너 내부에서 상호작용할 수 있다.

    2) e5: 명령어를 실행할 컨테이너의 ID이다.
    3) bash: 컨테이너 내부에서 실행할 셸 명령어이다. 여기서는 bash 셸을 실행하여 컨테이너의 터미널 환경에 접속한 것이다.

    ls 명령어를 통해 컨테이너 내부의 파일 목록을 확인하고, exit 명령어를 입력하여 컨테이너 셸에서 빠져나온다.


    1-5. 172.17.0.1은 어떤 IP 주소일까?

    이전 docker logs 실습에서 172.17.0.1이라는 IP 주소가 로그에 나타난 것을 볼 수 있었다. 이 IP 주소는 무엇을 의미할까?

    1) 사설 IP 주소 (Private IP Address)

    • 172.17.0.1사설 IP 주소 대역에 속하는 IP 주소이다. 사설 IP 주소는 인터넷 상에서 직접 접근할 수 없고, 특정 네트워크 내부에서만 사용된다. 이는 제한된 공인 IP 주소 자원을 효율적으로 사용하기 위해 고안된 방식이다.
    • 대표적인 사설 IP 주소 대역은 다음과 같다.
      • 10.0.0.0 ~ 10.255.255.255
      • 172.16.0.0 ~ 172.31.255.255
      • 192.168.0.0 ~ 192.168.255.255

    2) 도커(Docker) 네트워크에서의 역할

    • 도커를 설치하면 기본적으로 **docker0**이라는 이름의 가상 브리지(bridge) 네트워크 인터페이스가 생성된다. 이 docker0 브리지는 일반적으로 **172.17.0.1**이라는 IP 주소를 갖게 된다.
    • docker0 브리지는 도커 컨테이너들이 외부 네트워크와 통신할 때 사용하는 기본 게이트웨이 역할을 수행한다. 컨테이너들은 이 docker0 브리지를 통해 호스트 머신 및 인터넷과 데이터를 주고받는다.
    • 컨테이너들은 172.17.0.0/16 네트워크 대역에서 172.17.0.2부터 순차적으로 내부 IP 주소를 할당받는다. 따라서 로그에 나타난 172.17.0.1은 컨테이너가 요청을 보낸 대상, 즉 호스트의 도커 네트워크 게이트웨이임을 의미하는 것이다.

    2. Redis 컨테이너 활용 예제

    도커 컨테이너를 다루는 기본적인 명령어들을 실제 Redis 컨테이너 활용에 적용해 보자!

    2-1. docker run으로 Redis 컨테이너 실행하기

    가장 먼저 Redis 컨테이너를 실행해 보자. docker run 명령어는 도커 이미지를 기반으로 새로운 컨테이너를 생성하고 실행하는 역할을 한다.

    PS C:\Users\dandycode> docker run -d -p 6379:6379 redis
    Unable to find image 'redis:latest' locally
    latest: Pulling from library/redis
    ... (중략) ...
    Status: Downloaded newer image for redis:latest
    30f7d7115c0be0f469b12f4d12aeaa8d4f6d136012d01f212b3e576f493204ea
    • -d (detached mode): 컨테이너를 백그라운드에서 실행한다. 이 옵션이 없으면 컨테이너가 실행되는 동안 터미널이 블록된다.
    • -p 6379:6379: 포트 포워딩을 설정한다. 호스트포트:컨테이너포트 형식으로, 호스트의 6379번 포트(Redis 기본 포트)로 들어오는 요청을 컨테이너의 6379번 포트로 연결한다.
    • redis: 실행할 도커 이미지의 이름이다. 이 명령어를 통해 Redis 서버 컨테이너를 실행한 것이다.

    만약 로컬에 redis 이미지가 없다면, 위 예시처럼 자동으로 도커 허브(Docker Hub)에서 이미지를 다운로드(Pulling from library/redis)하는 과정을 거친다. 컨테이너가 성공적으로 실행되면 새로운 컨테이너의 ID가 출력된다.

    2-2. docker image ls로 이미지 목록 확인하기

    redis 이미지가 잘 다운로드되었는지, 그리고 어떤 이미지들이 로컬에 저장되어 있는지 확인하려면 docker image ls 명령어를 사용한다.

    PS C:\Users\dandycode> docker image ls
    REPOSITORY   TAG        IMAGE ID       CREATED        SIZE
    redis        latest     f2cd22713a18   2 days ago     128MB
    • REPOSITORY: 이미지의 이름이다.
    • TAG: 이미지의 버전 또는 특정 태그이다. latest는 최신 버전을 의미한다.
    • IMAGE ID: 이미지의 고유 식별자이다.
    • CREATED: 이미지가 생성된 시점이다.
    • SIZE: 이미지의 크기이다.

    2-3. docker ps로 실행 중인 컨테이너 확인하기

    Redis 컨테이너가 정상적으로 실행되고 있는지 확인하기 위해 docker ps 명령어를 다시 사용한다.

    PS C:\Users\dandycode> docker ps
    CONTAINER ID   IMAGE     COMMAND                  CREATED         STATUS          PORTS                    NAMES
    30f7d7115c0b   redis     "docker-entrypoint.s…"   49 seconds ago  Up 48 seconds   0.0.0.0:6379->6379/tcp   objective_diffie
    • 새로운 Redis 컨테이너(30f7d7115c0b)가 Up 상태로 실행 중이며, 호스트의 6379 포트와 컨테이너의 6379 포트가 연결된 것을 확인할 수 있다.

    2-4. docker logs로 Redis 컨테이너 로그 확인하기

    Redis 컨테이너가 제대로 시작되었는지, 그리고 어떤 초기 설정 로그가 있는지 확인하려면 docker logs 명령어를 사용한다.

    PS C:\Users\dandycode> docker logs 30
    Starting Redis Server
    1:C 09 Jul 2025 04:10:38.443 * oO0OoO0OoO0Oo Redis is starting oO0OoO0OoO0Oo
    1:C 09 Jul 2025 04:10:38.443 * Redis version=8.0.3, bits=64, commit=00000000, modified=1, pid=1, just started
    ... (중략) ...
    1:M 09 Jul 2025 04:10:38.448 * Server initialized
    1:M 09 Jul 2025 04:10:38.448 * Ready to accept connections tcp
    • 로그를 통해 Redis 서버가 버전 8.0.3으로 시작되었고, port=6379로 실행 중이며, 최종적으로 Ready to accept connections tcp 메시지와 함께 연결을 받을 준비가 되었음을 확인할 수 있다.

    2-5. docker exec로 컨테이너 내부에서 Redis 명령어 실행하기

    이제 실행 중인 Redis 컨테이너 내부에 접속하여 Redis 명령어를 직접 실행해 보자. docker exec 명령어를 사용하면 컨테이너 내부에서 셸 명령어(bash)를 실행할 수 있다.

    PS C:\Users\dandycode> docker exec -it 30 bash
    root@30f7d7115c0b:/data# pwd
    /data
    root@30f7d7115c0b:/data# redis-cli
    127.0.0.1:6379> set 1 dandy
    OK
    127.0.0.1:6379> get 1
    "dandy"
    127.0.0.1:6379> exit
    root@30f7d7115c0b:/data# exit
    exit

    1) docker exec -it 30 bash: ID가 30으로 시작하는 Redis 컨테이너 내부에 bash 셸로 접속한다.
    2) pwd: 컨테이너 내부의 현재 작업 디렉토리를 확인한다. 기본적으로 /data이다.
    3) redis-cli: Redis 클라이언트 도구를 실행하여 Redis 서버와 상호작용한다.
    4) set 1 dandy: Redis에 1이라는 키에 dandy라는 값을 저장한다. OK 응답은 성공을 의미한다.
    5) get 1: Redis에서 1이라는 키에 저장된 값을 조회한다. 저장했던 "dandy" 값이 반환되는 것을 확인할 수 있다.
    6) exit: redis-cli를 종료한다.
    7) exit: 컨테이너 내부 셸(bash)에서 빠져나와 호스트 터미널로 돌아온다.

    2-6. 컨테이너 및 이미지 정리하기

    실습을 마친 후에는 불필요한 컨테이너와 이미지를 정리하여 시스템 자원을 확보하는 것이 좋다.

    1) 실행 중인 컨테이너 확인: 먼저 현재 실행 중인 컨테이너가 있는지 다시 확인한다.

      PS C:\Users\dandycode> docker ps
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 
      30f7d7115c0b redis "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:6379->6379/tcp objective_diffie

    2) 컨테이너 강제 삭제: Redis 컨테이너를 강제로 삭제한다. -f 옵션은 컨테이너가 실행 중이더라도 강제로 삭제할 수 있게 한다.

      PS C:\Users\dandycode> docker rm -f 30
      30

    삭제된 컨테이너의 ID가 출력된다.

    3) 컨테이너 삭제 확인: docker psdocker ps -a 명령어로 모든 컨테이너 목록을 확인하여 삭제되었는지 최종 확인한다.

      PS C:\Users\dandycode> docker ps
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
      PS C:\Users\dandycode> docker ps -a 
      CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES

    목록에 아무것도 나오지 않는다면 모든 컨테이너가 삭제된 것이다.

    4) 이미지 목록 확인: 로컬에 다운로드된 이미지 목록을 확인한다.

      PS C:\Users\dandycode> docker image ls 
      REPOSITORY TAG IMAGE ID CREATED SIZE
      redis latest f2cd22713a18 2 days ago 128MB

    5) 이미지 삭제: 마지막으로 다운로드했던 redis 이미지를 삭제한다. 이미지 ID의 앞부분만 입력해도 된다.

      PS C:\Users\dandycode> docker image rm f2 
      Untagged: redis:latest Untagged: redis@sha256:a1e0a3b3a6cedd74d8ba44805b2497b93851a296f08a44962fedc03f1c490b47 
      ... (중략) ... 
      Deleted: sha256:442631376bf34d5c1f181ca740064cd3ca3cc371bd8636961b65e4af3668bbba

    이미지 삭제 시 관련 레이어들도 함께 삭제된다.

    6) 이미지 삭제 확인: 마지막으로 docker image ls를 통해 이미지가 제대로 삭제되었는지 확인한다.

      PS C:\Users\dandycode> docker image ls 
      REPOSITORY TAG IMAGE ID CREATED SIZE

    목록에 아무것도 나오지 않는다면 모든 이미지가 삭제된 것이다.


    728x90
    반응형
    댓글