소켓을 통한 cURL 도커

도커 데몬이 통신을 위해 gRPC API를 노출하거나 cURL이 유닉스 소켓으로 데이터를 보낼 수 있다는 것을 알고 계셨습니까?

이 모든 것이 어떻게 작동하는지 봅시다.

도커 엔진



도커 생태계의 기본 인프라는 docker engine 입니다.

클라이언트/서버 모델(대부분의 유닉스 도구와 매우 유사)을 사용하여 구현되며 gRPC 인터페이스를 통해 해당 모델API을 노출합니다. 이러한 모델에서는 일반적으로 하나의 서버와 많은 클라이언트가 있으며 도커의 경우도 마찬가지입니다.


도커 아키텍처. https://docs.docker.com의 이미지

데몬은 서버 역할을 하고 우리 모두에게 익숙한 CLI는 클라이언트 중 하나 역할을 합니다. 통신의 단일 지점은 일반적으로 유닉스 소켓으로 노출되며 통신은 protocol buffers 형식으로 데이터를 교환하는 gRPC를 통해 수행됩니다.

cURL --유닉스 소켓



cURL은 HTTP 서버와 통신하는 데만 좋은 것이 아니라 UNIX SOCKETS를 통해서도 동일한 작업을 수행할 수 있습니다.

현재 설치된 도커 버전을 원한다고 가정해 보겠습니다. 일반적으로 명령줄에서 다음을 수행합니다.

docker version


API를 사용하여 다음과 같은 작업을 수행합니다.

curl --unix-socket --silent /run/user/1000/docker.sock http://v1.41/version


우리에게 다음을 제공합니다.

{"Platform":{"Name":"Docker Engine - Community"},"Components":[{"Name":"Engine","Version":"20.10.12","Details":{"ApiVersion":"1.41","Arch":"amd64","BuildTime":"2021-12-13T11:46:12.000000000+00:00","Experimental":"false","GitCommit":"459d0df","GoVersion":"go1.16.12","KernelVersion":"5.13.0-28-generic","MinAPIVersion":"1.12","Os":"linux"}},{"Name":"containerd","Version":"v1.4.12","Details":{"GitCommit":"7b11cfaabd73bb80907dd23182b9347b4245eb5d"}},{"Name":"runc","Version":"1.0.2","Details":{"GitCommit":"v1.0.2-0-g52b36a2d"}},{"Name":"docker-init","Version":"0.19.0","Details":{"GitCommit":"de40ad0"}}],"Version":"20.10.12","ApiVersion":"1.41","MinAPIVersion":"1.12","GitCommit":"459d0df","GoVersion":"go1.16.12","Os":"linux","Arch":"amd64","KernelVersion":"5.13.0-28-generic","BuildTime":"2021-12-13T11:46:12.000000000+00:00"}


얼마나 멋진데요?!



한 단계 더 나아가 tcp를 통해 인터넷을 통해 친구에게 로컬 도커 데몬을 노출할 수 있습니다. 다음은 cURL을 사용하지 않고 ncat을 사용하는 빠른 예입니다.

섬기는 사람




ncat -kl -p 2376 -c 'ncat -U /run/user/1000/docker.sock'


고객




curl http://localhost:2376/version | jq



마지막으로 언급할 것은 url ex의 형식입니다. http://v1.41/version 엄격하지 않습니다. 다음 중 하나라도 동일한 결과를 얻었을 것입니다.
  • http:/foo/version
  • http://dummy/version
  • http:/./version

  • recommendation은 docker가 지원하는 API 버전을 URL의 첫 부분으로 사용하고 실제 명령어는 나중에 온다.


    출처:
  • v1.41 api specification
  • https://nathanleclaire.com/blog/2015/11/12/using-curl-and-the-unix-socket-to-talk-to-the-docker-api/
  • 좋은 웹페이지 즐겨찾기