도커 컨테이너 확인
이번 포스팅은 도커 컨테이너 확인 명령어에 대해 알아보려고 합니다. 도커 컨테이너 ip, 포트, 이름, 상태, 내부 경로, 용량, 로그, 네트워크 확인 방법에 대해 정리합니다.
1. 도커 컨테이너 확인 명령어
도커 컨테이너의 대략적인 정보를 확인하기 위해서 2가지의 명령어를 사용할 수 있습니다.
1.1. 상세 정보를 확인하는 inspect 명령어
첫 번째 명령어는 컨테이너의 상세 정보를 확인하는 inspect
명령어입니다.
다음과 같이 사용해서 하나 이상의 컨테이너 상세 정보를 JSON 형식으로 확인할 수 있습니다.
$ docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
직접 명령어를 입력해보면, 스크롤을 몇 번은 해야 할 정도로 수많은 항목들이 출력됩니다. 큰 주제들을 살펴보면 아래와 같습니다.
[
{
"id": "72256fae4d38ad302a4788771e0155b03c315a8389fe4327af3912d9e2ae0415",
"Created": "2023-05-27T01:32:38.177055001Z",
"Path": "/docker-entrypoint.sh",
"Args": [
"nginx",
"-g",
"daemon off;"
],
"State": {
"Status": "running",
"Running": true,
"Paused": false,
...
"Pid": 3403,
"ExitCode": 0,
"Error": "",
"StartedAt": "2023-05-27T01:32:38.380814543Z",
"FinishedAt": "0001-01-01T00:00:00Z" },
"Image": "sha256:c42efe0b54387756e68d167a437aef21451f63eebd9330bb555367d67128386c",
"Name": "/pedantic_cray",
"ResolvConfPath": "/var/lib/docker/containers/72256fae4d38ad302a4788771e0155b03c315a8389fe4327af3912d9e2ae0415/resolv.conf"
, "HostnamePath": "/var/lib/docker/containers/72256fae4d38ad302a4788771e0155b03c315a8389fe4327af3912d9e2ae0415/hostname",
"HostsPath": "/var/lib/docker/containers/72256fae4d38ad302a4788771e0155b03c315a8389fe4327af3912d9e2ae0415/hosts",
...
"HostConfig": {},
"GraphDriver": {},
"Mount": [],
"Config": {},
"NetworkSettings": {}
}
]
Id
, Name
항목은 컨테이너의 유니크한 ID와 이름, Path
와 Args
항목은 컨테이너 생성 시 실행하는 파일 혹은 명령어,
State
항목은 현재 컨테이너의 상태를 나타냅니다.
ResolveConfPath
, HostnamePath
, HostsPath
, HostConfig
항목은 도커 호스트 환경을 설정하는 파일 경로 혹은 설정 항묵을 포함하며,
Image
, NetworkSettings
, GraphDriver
항목은 컨테이너의 이미지, 네트워크, 저장소 환경을 보여줍니다.
도커 inspect
명령어는 컨테이너와 관련한 모든 내용을 보여주려고 구현되었기 때문에, 특정한 정보만 보고자 할 때마다 사용하기엔 정보량이 과한 감이 있습니다.
이 때문에, --format
옵션을 제공하는데, 이 옵션을 추가하면 Go 언어의 text/template
패키지를사용해서 원하는 정보만 출력할 수 있습니다.
1.2. --format 옵션에 Go 템플릿 사용하기
도커는 동시성 제어에 탁월한 Go 언어로 작성되어 있기 때문에, Go 문법을 차용한 부분을 엿볼 수 있습니다.
inspect
명령어의 --format
옵션도 Go 문법을 차용한 부분 중 하나입니다.
아래는 간단한 Go의 text/template
예제입니다만, 이해하려 하지 않고 눈으로만 확인하면 됩니다.
눈여겨 볼 부분은 t, _ = t.Parse("Name: { {.Name} }, Age: { {.Age} }\n")
라인인데요.
Go 템플릿은 Person
구조체의 각 프로퍼티를 중괄호 2개와 마침표 하나로 가져오는 것을 확인할 수 있습다.
package main
import (
"os"
"text/template"
)
type Person struct {
Name string
Age int
}
func main() {
t := template.New("person template")
t, _ = t.Parse("Name: { {.Name} }, Age: { {.Age} }\n")
p := Person{Name: "Alice", Age: 30}
t.Execute(os.Stdout, p)
}
도커도 같은 문법을 사용합니다. 출력되는 JSON 파일을 하나의 거대한 구조체로, 각 필드를 이 구조체의 프로퍼티로 생각하고 템플릿을 설정하면 됩니다.
예를 들어, 컨테이너의 Status
항목을 출력해보겠습니다. Status
항목은 최상위 State
필드 내에 위치합니다.
따라서 아래와 같이 입력할 수 있습니다.
$ docker container inspect --format='{ {.State.Status} }' CONTAINER
명령어를 실행하면, 다음의 결과를 출력합니다.
$ docker container inspect --format='{ {.State.Status} }' 7225
running
이처럼 Go 템플릿 문법을 활용해서 자유롭게 출력값을 지정할 수 있습니다.
이렇게 출력되는 값들을 커스터마이징하기 위해서는 도커 공식 문서의 Format command and log output 페이지 (opens in a new tab)를 참고하세요. 직관적으로 설명되어 있어서, 바로 이해할 수 있을 거라 생각합니다.
1.3. 실시간 정보를 확인하는 stats 명령어
stats
명령어는 실시간으로 실행중인 모든 컨테어너의 CPU, 메모리 사용량과 프로세스 수, 네트워크나 블록 인터페이스를 통한 누적 입출력량 등을 출력합니다.
다음 명령어를 입력해서 사용하며,
$ docker container stats [OPTIONS] [CONTAINER...]
다음과 같이, 실시간 정보를 출력하는 별도의 화면으로 넘어가게 됩니다.
CONTAINER ID NAME CPU % ...
72256fae4d38 pedantic_cray 0.00% ...
만약, 실시간으로 갱신되는 정보가 아닌 현재 정보만 출력하고자 할 때는 --no-stream
옵션을 추가합니다.
이러면 정보 출력 후 다시 프롬프트가 돌아오는 것을 확인할 수 있습니다.
지금부터는, 이렇게 2가지 명령어를 기반으로 특정 정보를 출력하는 방법을 차례차례 알아보겠습니다.
2. 이름, 상태 확인
컨테이너의 이름과 상태는 ls
명령어, inspect
명령어로 출력할 수 있습니다.
전자의 방법은 상대적인 시간을, 후자의 방법은 절대적인 시간을 함께 표현하므로, 필요에 따라 선택해 사용할 수 있습니다.
2.1. 상대적인 시간을 출력하는 ls
컨테이너의 이름, 상태 확인 방법은 다양하게 접근할 수 있습니다.
우선, 컨테이너 실행 , 컨테이너 중지/종료 포스트 에서 이미 봤던 docker container ls (--all)
명령어입니다.
아래와 같이, 간단한 컨테이너 이름과 상태 목록 조회가 가능합니다. STATUS
항목과 NAMES
항목을 확인하면 됩니다.
$ docker container ls
CONTAINER ID ... STATUS NAMES
72256fae4d38 ... Up 5 hours pedantic_cray
ls
명령어에도 섹션 1.2에서 알아본 --format
옵션을 적용할 수 있습니다.
아래는 컨테이너 이름과 상태만 목록으로 출력하는 명령어입니다.
$ docker container ls --format='table { {.Names} }\t{ {.Status} }'
NAMES STATUS
pedantic_cray Up 6 hours
table
과 \t
키워드는 테이블처럼 출력하는 명령어입니다. 섹션 1.2 를 참고하세요.
2.2. 절대적인 시간을 출력하는 inspect
1ls1 명령어가 위와 같이 상대적인 시간을 출력한다면, inspect
명령어를 사용하면 하나의 컨테이너의 상태, 이름, 생성 시간, 시작 시간 등을 정확하게 출력할 수 있습니다.
$ docker container inspect --format ' 컨테이너 이름: { {println .Name} } 상태: { {println .State.Status} } 생성 시간: { {println .Created} } 시작 시간: { {println .State.StartedAt} }' 7225
컨테이너 이름: /pedantic_cray
상태: running
생성 시간: 2023-05-27T01:32:38.177055001Z
시작 시간: 2023-05-27T01:32:38.380814543Z
println
키워드는 현재 항목 뒤에 줄바꿈을 추가합니다.
3. ip, 포트 확인
3.1. 컨테이너 IP 확인
컨테이너 ip 확인은 inspect
명령어를 활용합니다.
$ docker container inspect --format='{ {range $network, $config := .NetworkSettings.Networks} }[{ {$network} }]: { {println $config.IPAddress} }{ {end} }' 7225
[bridge]: 172.17.0.2
range
키워드와 { {end} }
키워드는 Go template 의 반복문 역할을 합니다.
도커 컨테이너는 연결된 네트워크에 따라 여러 개의 IP 주소를 갖기 때문에 모두 출력하기 위해 range
키워드를 사용합니다.
기본 IP는 주로 bridge
라는 이름의 네트워크 내 IPAddress
항목을 확인하면 됩니다.
3.2. 컨테이너 포트 확인
컨테이너 포트 확인 명령어가 제공되기 때문에, 다음과 같이 간편하게 확인할 수 있습니다.
$ docker container port 7225
80/tcp -> 0.0.0.0:8000
섹션 3.1에서처럼 inspect
명령어와 Go 템플릿으로도 똑같은 출력 결과를 만들 수 있습니다.
시간이 남을 때 도전해보시기 바랍니다.
4. 컨테이너 내부 경로 확인
컨테이너 내부 경로 확인 방법은 컨테이너 외부에서 확인하는 방법, 내부에서 확인하는 방법, 이렇게 2가지가 있습니다.
4.1. 컨테이너 외부에서 내부 경로 확인
docker container exec
명령어는 컨테이너 외부에서 해당 컨테이너 쉘에 원하는 명령어를 실행할 수 있는 방법을 제공합니다.
예를 들어, 다음 명령어는 현재 컨테이너의 작업 디렉토리 경로를 출력합니다.
$ docker container exec 7225 pwd
/
원하는 파일 및 디렉토리를 살펴볼 수도 있습니다.
$ docker container exec -u root 7225 ls /usr/share/nginx/html
50x.html
index.html
-u root
옵션을 추가하면 해당 명령어를 root
권한으로 실행합니다.
4.2. 컨테이너 내부에서 내부 경로 확인
컨테이너 내부에 접근해 내부 경로를 확인하려고 한다면, -it
옵션을 추가해 컨테이너 쉘을 실행합니다.
$ docker container exec -it 7225 /bin/sh
# pwd
/
# ls /usr/share/nginx/html
50x.html index.html
# exit
위 예제의 마지막 프롬프트처럼, 쉘을 빠져나오고 싶다면 exit
을 입력해주세요.
5. 용량 확인
로컬 환경에 존재하는 모든 컨테이너 용량의 총합을 확인하는 명령어는 다음과 같습니다.
$ docker system df
TYPE TOTAL ACTIVE SIZE RECLAIMABLE
Images 2 2 181.8MB 0B (0%)
Containers 3 1 3.281kB 2.186kB (66%)
Local Volumes 0 0 0B 0B
Build Cache 0 0 0B 0B
현재 도커 환경의 모든 이미지, 컨테이너, 볼륨, 캐시가 차지하고 있는 용량을 출력하며, RECLAIMABLE
항목은 사용중이 아닌 각 개체의 용량을 의미합니다.
6. 로그 확인
컨테이너의 로그 확인 명령어는 다음과 같습니다. 만약, 실시간으로 출력되는 로그를 확인하고자 한다면 -f (--follow)
옵션을 사용합니다.
오래된 컨테이너의 최근 로그 및 출만 출력하는 방법은 -n (--tail)
옵션과 함께 숫자를 입력하면 됩니다.
또한, --since
옵션은 지난 50s
(초), 30m
(분), 5h
(시간) 동안의 로그만 출력하는 유용한 옵션입니다.
$ docker container logs --since 10h --tail 5 --follow 7225
2023/05/27 01:32:38 [notice] 1#1: start worker processes
2023/05/27 01:32:38 [notice] 1#1: start worker process 29
2023/05/27 01:32:38 [notice] 1#1: start worker process 30
2023/05/27 01:32:38 [notice] 1#1: start worker process 31
2023/05/27 01:32:38 [notice] 1#1: start worker process 32
7. 네트워크 확인
컨테이너 네트워크 확인 과정은 다음과 같습니다. 우선, 컨테이너에 연결된 네트워크 목록을 확인한 후, 해당 네트워크에 대한 상세 정보를 확인합니다.
컨테이너에 연결된 네트워크 목록을 확인하는 명령어입니다.
$ docker container inspect --format='{ {range $network, $config := .NetworkSettings.Networks} }{ {println $network} }{ {end} }' 7225
bridge
db-net
이 명령어는 위와 같이, 네트워크 이름 목록을 출력합니다. 이제 네트워크 이름으로 상세 정보를 확인해봅니다.
$ docker network inspect db-net
[
{
"Name": "db-net",
"Id": "74b2026af3ee7d328aab14d33894d1c9fc31cd21176051c7c90cab1440342ae7",
...
네트워크 정보에 대한 더 자세한 설명은 이후 도커 네트워크 포스트에서 다뤄보겠습니다.
8. 마치며
이번 포스팅은 도커 컨테이너 확인 명령어에 대해 알아보았습니다. 도커 컨테이너 ip, 포트, 이름, 상태, 내부 경로, 용량, 로그, 네트워크 확인 방법이 필요할 때, 오늘 정리한 내용들이 도움이 되길 바랍니다.