Docker

Docker Remote API를 사용하여 원격 Docker 정보 얻어오기

Soyeon0111 2022. 3. 12. 01:02
반응형

'docker ps' 라는 Docker 명령은 Local에 존재하는 Docker System에서만 유효한 명령어이다.

 

오늘의 도전 과제

원격지의 'docker ps' 결과 얻어오기 

 

우선 docker service 를 설치하면 기본적으로 unix socket 을 통해 명령을 전달 받는 것만 허용되어 있다. 

docker ps 라는 명령을 치면 로컬의 unix socket 을 통해 docker daemon이 명령어를 실행하는 것이다.

 

우리는 다른 서버, 원격의 docker 정보를 가져와야 하므로 원격의 docker에 tcp socket 열어줘야 한다.

내가 접근하고 싶은 docker가 설치된 서버로 접속하여 아래와 같이 작업하자.

 

 

1. docker.service 파일에 Docker daemon의 host ip, port 정보 넣기 

 vim /lib/systemd/system/docker.service

# 파일에서 아래 내용 추가(또는 수정)
ExecStart=/usr/bin/dockerd -H unix:///var/run/docker.sock -H 0.0.0.0:2375

주석 처리한 부분은 기존에 존재하던 줄이고

아래 부분을 추가해 주었다. 

 

2. Docker 서비스 재시작하여 변경된 파일 내용 적용하기

systemctl daemon-reload
systemctl restart docker.service

 

3. 다른 서버에서 docker 명령 쳐보기

1,2를 진행한 서버의 ip와 방금 설정한 port로 아래와 같이 명령을 날려본다. 

docker -H 10.120.1.99:2375 ps

원격지의 docker ps 정보가 출력되었다!!! 

 

 

오늘의 심화 실습

Docker REST API를 사용하여 원격지(또는 로컬)의 Docker 제어 및 정보 얻기

 

1. Container id로 특정 컨테이너 start, stop, restart ( POST /containers/{id}/start )

- 참고 API 문서 : https://docs.docker.com/engine/api/v1.41/#operation/ContainerStart

[root@localhost soyeon]# curl -X POST 10.120.1.99:2375/containers/c68e41e87973/stop
[root@localhost soyeon]# curl -X POST 10.120.1.99:2375/containers/c68e41e87973/start

와. 정말 docker stop {id}, docker start {id} 와 동일한 동작을 한다. 

 

 

2. Docker volume 조회 ( GET /volumes )

- 참고 API 문서 : https://docs.docker.com/engine/api/v1.41/#tag/Volume

[root@localhost soyeon]# curl 10.120.1.99:2375/volumes

 

 

3. Container id로 특정 컨테이너의 리소스 사용량 기반 통계 조회 ( GET /containers/144ddae64249/stats )

- 참고 API 문서 : https://docs.docker.com/engine/api/v1.41/#operation/ContainerStats

[root@localhost soyeon]# curl 10.120.1.99:2375/containers/144ddae64249/stats?stream=false
{"read":"2022-03-11T15:59:53.48911191Z","preread":"2022-03-11T15:59:52.487104839Z","pids_stats":{"current":12},"blkio_stats":{"io_service_bytes_recursive":[],"io_serviced_recursive":[],"io_queue_recursive":[],"io_service_time_recursive":[],"io_wait_time_recursive":[],"io_merged_recursive":[],"io_time_recursive":[],"sectors_recursive":[]},"num_procs":0,"storage_stats":{},"cpu_stats":{"cpu_usage":{"total_usage":630256059,"percpu_usage":[630256059],"usage_in_kernelmode":120000000,"usage_in_usermode":680000000},"system_cpu_usage":17797261860000000,"online_cpus":1,"throttling_data":{"periods":0,"throttled_periods":0,"throttled_time":0}},"precpu_stats":{"cpu_usage":{"total_usage":630176990,"percpu_usage":[630176990],"usage_in_kernelmode":120000000,"usage_in_usermode":680000000},"system_cpu_usage":17797260860000000,"online_cpus":1,"throttling_data":{"periods":0,"throttled_periods":0,"throttled_time":0}},"memory_stats":{"usage":21995520,"max_usage":22122496,"stats":{"active_anon":21995520,"active_file":0,"cache":0,"dirty":0,"hierarchical_memory_limit":9223372036854771712,"hierarchical_memsw_limit":9223372036854771712,"inactive_anon":0,"inactive_file":0,"mapped_file":0,"pgfault":10923,"pgmajfault":0,"pgpgin":6920,"pgpgout":1550,"rss":21995520,"rss_huge":0,"total_active_anon":21995520,"total_active_file":0,"total_cache":0,"total_dirty":0,"total_inactive_anon":0,"total_inactive_file":0,"total_mapped_file":0,"total_pgfault":10923,"total_pgmajfault":0,"total_pgpgin":6920,"total_pgpgout":1550,"total_rss":21995520,"total_rss_huge":0,"total_unevictable":0,"total_writeback":0,"unevictable":0,"writeback":0},"limit":8101003264},"name":"/gateway-interface","id":"144ddae64249ce4ba7f0398d504f676b38690eb5e2a2f964908bbade24f62e84","networks":{"eth0":{"rx_bytes":1017,"rx_packets":12,"rx_errors":0,"rx_dropped":0,"tx_bytes":244,"tx_packets":4,"tx_errors":0,"tx_dropped":0}}}

 

stream 파라미터의 기본값은 true. true인 경우 응답이 계쏙 스트리밍(?) 되므로 주의한다. 

나처럼 false로 지정해줘야 응답이 한번 출력 후 연결이 끊어진다.

 

 

Response 의 의미에 대해서는 API 문서에 자세히 써있으니 참고!

 

Get container stats based on resource usage

 

This endpoint returns a live stream of a container’s resource usage statistics.

The precpu_stats is the CPU statistic of the previous read, and is used to calculate the CPU usage percentage. It is not an exact copy of the cpu_stats field.

If either precpu_stats.online_cpus or cpu_stats.online_cpus is nil then for compatibility with older daemons the length of the corresponding cpu_usage.percpu_usage array should be used.

On a cgroup v2 host, the following fields are not set

  • blkio_stats: all fields other than io_service_bytes_recursive
  • cpu_stats: cpu_usage.percpu_usage
  • memory_stats: max_usage and failcnt Also, memory_stats.stats fields are incompatible with cgroup v1.

To calculate the values shown by the stats command of the docker cli tool the following formulas can be used:

  • used_memory = memory_stats.usage - memory_stats.stats.cache
  • available_memory = memory_stats.limit
  • Memory usage % = (used_memory / available_memory) * 100.0
  • cpu_delta = cpu_stats.cpu_usage.total_usage - precpu_stats.cpu_usage.total_usage
  • system_cpu_delta = cpu_stats.system_cpu_usage - precpu_stats.system_cpu_usage
  • number_cpus = lenght(cpu_stats.cpu_usage.percpu_usage) or cpu_stats.online_cpus
  • CPU usage % = (cpu_delta / system_cpu_delta) * number_cpus * 100.0

 

 


이후 포스팅

- Unix Socket 과 TCP Socket 의 차이점

 

 

참고 :

https://docs.docker.com/engine/reference/commandline/dockerd/#daemon-socket-option

https://docs.docker.com/engine/api/v1.41/#tag/Container

https://senticoding.tistory.com/94

https://blog.naver.com/alice_k106/220234130166

반응형

'Docker' 카테고리의 다른 글

Dockerize 하기  (0) 2022.08.19
Docker Container 시간 TIMEZONE 설정 하기  (0) 2021.11.15