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/
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가지 이벤트를 스트림으로 확인할수있다.
- 컨테이너 생성(create)
- default bridge network에 컨테이너 연결(connect)
- 컨테이너 시작(start)
출처
https://byungwoo.oopy.io/fe65e61c-236b-4a83-b3ba-d0a71dd20f16