docker.sock

테라폼의 도커 프로바이더 블록에 host 파라미터를 구체적으로 지정하지않아도 기본값이 있다.

provider "docker" {}

대괄호 안에 host: “unix:///var/run/docker.sock” 이 생략 되어 있다.

Unix,tcp,ip 등등 호스트 파라미터를 지정 할수 있다.
자세한 내용은 테라폼 문서 참고

여기서 unix 소켓이란?
Unix 기반 시스템에서 프로세스 간 통신(IPC)을 위해 사용되는 통신 엔드포인트입니다. 이 소켓은 커널 내에서 작동하며, 같은 시스템 내에서의 효율적이고 저지연 통신을 제공합니다.

# 유닉스 소켓 경로
unix:///var/run/docker.sock

일부 컨테이너에서 /var/run/docker.sock 파일을 바인드 마운트(bind mount)하는 것을 본 적이 있을 것입니다. 간단한 답은 이것입니다: Docker daemon이 기본적으로 수신(listen)하고 있는 Unix socket이고 컨테이너 내부에서 Docker daemon과 통신하는 데에 사용됩니다.

여기서 바인드 마운트(bind mount, 이하 마운트)란 도커 컨테이너 실행시 v ${source}:${target}과 같이 특정 볼륨을 컨테이너에 연결하는 것을 의미합니다


curl 명령어를 통해서 {“Image”: “nginx”} 전송 데이터(payload)를 unix socket을 통해서 Docker daemon의 /containers/create 엔드포인트(endpoint)에 전달해 컨테이너 생성해보자.

ccurl -XPOST --unix-socket /var/run/docker.sock \
-d '{"Image":"centos"}' \
-H 'Content-Type: application/json'  \
http://localhost/containers/create

컨테이너가 생성되었다.

{"Id":"f5dd99791a38c178c853f2e8bc29c2e2b7796bddf2488688453e90cb9ce3f486","Warnings":[]}

docker ps -a 명령어를 통해서 컨테이너가 생성만 되고 실행되지 않은 것을 확인할 수 있습니다.

왜냐면 docker run 명령어는 docker create와 docker start를 동시에 수행하는 명령어이지만 HTTP API를 사용할 경우 docker create와 docker start를 나누어서 수행해야합니다.

반환된 ID를 활용하여 /containers//start 엔드포인트에 컨테이너 실행 요청을 보낼 수 있습니다.

 curl -XPOST --unix-socket /var/run/docker.sock http://localhost/containers/f5dd99791a38c178c853f2e8bc29c2e2b7796bddf2488688453e90cb9ce3f486/start

컨테이너가 Docker socket(/var/run/docker.sock)을 활용하여 어떻게 생성될 수 있는지를 보여줍니다. 물론 실제로는 curl을 사용하여 컨테이너를 생성하지는 않지만 그 원리는 이해할 수 있습니다.


이벤트 수신하기

Docker API /events/ 엔드포인트를 통하여 Docker daemon이 생성하는 이벤트를 전부 송출(streaming)합니다. 예를 들어 컨테이너의 생성 혹은 삭제 이벤트를 전달받고 동적으로 설정을 업데이트 하는 용도로 로드 밸런서가 사용할 수 있습니다.

아래의 명령어는 Alpine 컨테이너를 대화식(interactive) 모드로 실행하고 docker.sock을 바인드 마운트(bind mount)합니다.

docker run -v /var/run/docker.sock:/var/run/docker.sock -ti alpine sh

apk update && apk add curl

여기서 Alpine 컨테이너란 가볍고 간단한, 보안성을 목적으로 개발한 리눅스 배포판인 Alpinx Linux를 기반으로 하는 컨테이너입니다.

Docker socket(/var/run/docker.sock)을 통해서 HTTP 요청을 /events 엔드포인트에 보낼 수 있습니다. 이 명령어는 별도의 응답이 없으며(hang on) 새로운 이벤트가 Docker daemon으로부터 수신되기를 기다립니다. Docker daemon은 새로운 이벤트가 발생할 때마다 송출(straeming)을 진행할 것입니다.

curl --unix-socket /var/run/docker.sock http://localhost/events

이벤트를 받아오고 있다. nginx컨테이너를 새로 만들면 3가지 이벤트를 스트림으로 확인할수있다.

  1. 컨테이너 생성(create)
  2. default bridge network에 컨테이너 연결(connect)
  3. 컨테이너 시작(start)

출처

https://byungwoo.oopy.io/fe65e61c-236b-4a83-b3ba-d0a71dd20f16