나는 설치에 대한 실제 이유를 이해하려고 노력하고 있어요 docker.sock
에 docker-compose.yml
파일을. 자동 검색입니까?
volumes:
- /var/run/docker.sock:/var/run/docker.sock
답변
docker.sock
Docker 데몬이 수신하는 UNIX 소켓입니다. Docker API의 주요 진입 점입니다. TCP 소켓 일 수도 있지만 보안상의 이유로 Docker는 기본적으로 UNIX 소켓을 사용합니다.
Docker cli 클라이언트는이 소켓을 사용하여 기본적으로 docker 명령을 실행합니다. 이 설정도 무시할 수 있습니다.
컨테이너 안에 Docker 소켓을 마운트해야하는 이유는 여러 가지가있을 수 있습니다. 다른 컨테이너 내에서 새 컨테이너를 시작하는 것과 같습니다. 또는 자동 서비스 검색 및 로깅 목적. 컨테이너 내부에 도커 소켓을 마운트하면 해당 컨테이너 내부에서 신뢰할 수있는 코드가 실행됩니다. 그렇지 않으면 Docker가 기본적으로 모든 컨테이너를 루트로 시작하므로 docker 데몬을 실행하는 호스트를 손상시킬 수 있습니다.
도커 소켓에는 대부분의 설치에 도커 그룹이 있으므로 해당 그룹의 사용자는 루트 권한없이 도커 소켓에 대해 도커 명령을 실행할 수 있지만 도커 데몬은 루트로 효과적으로 실행되므로 실제 도커 컨테이너는 여전히 루트 권한을 갖습니다 (네임 스페이스 및 cgroup에 액세스하려면 루트 권한이 필요합니다) .
귀하의 질문에 대한 답변이 되었기를 바랍니다.
추가 정보 : https://docs.docker.com/engine/reference/commandline/dockerd/#examples
답변
나는 그것이 늦다는 것을 알고 있지만 내 대답이 많은 통찰력을 줄 수 있기를 바랍니다.
유닉스 소켓 에 대해 먼저 이야기하겠습니다
소켓이라는 용어는 일반적으로 IP 소켓을 나타냅니다. 이들은 포트 (및 주소)에 바인딩되어 있으며 TCP 요청을 보내고 응답을받습니다.
다른 유형의 소켓은 Unix 소켓이며,이 소켓은 IPC (Interprocess Communication)에 사용됩니다. 또한 UDS (Unix Domain Sockets)라고도 합니다. 유닉스 소켓은 통신을 위해 로컬 파일 시스템을 사용하는 반면 IP 소켓은 네트워크를 사용합니다.
Docker 데몬은 세 가지 유형의 Socket을 통해 Docker Engine API 요청을 청취 할 수 있습니다 unix, tcp, and fd
.
기본적으로 유닉스 도메인 소켓 (또는 IPC 소켓)은 /var/run/docker.sock에 생성됩니다.
실제 예를 보자 .
Docker 서버는이 소켓을 사용하여 REST API를 청취하고 클라이언트는 소켓을 사용하여 API 요청을 서버로 보냅니다.
curl 은
--unix-socket
플래그 를 통해 유닉스 소켓과 통신 할 수 있습니다 . Docker Server API는 REST로 노출되므로 HTTP를 통해 명령을 보내야합니다. 또한이 서버는 로컬이므로 (파일 시스템을 기억하십시오) URL의 모든 호스트 이름을 전달할 수 있습니다 (또는 로컬 호스트에 고정하면 제대로 작동합니다). 서버는 호스트 이름, 경로 만 신경 쓰지 않습니다.
curl --unix-socket /var/run/docker.sock http://localhost/images/json | jq
[
{
"Containers": -1,
"Created": 1525888860,
"Id": "sha256:24a77bfbb9ee3aeef9e24766ad6e9fa57f85c67596f154e8916e4f314067e149",
"Labels": null,
"ParentId": "",
"RepoDigests": [
"postgres@sha256:b06cdddba62f1550a1c674270814e72eaa8734d95912019b4ddc288b650ad67d"
],
"RepoTags": null,
"SharedSize": -1,
"Size": 39507096,
"VirtualSize": 39507096
}
]
일부 명령 :
- curl –unix-socket /var/run/docker.sock http : // localhost / images / json | jq
- curl –unix-socket /var/run/docker.sock http : // localhost / containers / json | jq
- curl -i -X POST –unix-socket /var/run/docker.sock ” http : // foo / images / a95fgf458dfd / tag? repo = redis & tag = foo “
- curl –no-buffer –unix-socket /var/run/docker.sock http : // localhost / events
docker.sock으로 많은 것을 할 수 있습니다.
답변
기본적으로 호스트 도커 데몬을 컨테이너에 노출시킵니다. 따라서 컨테이너에서 docker api / client를 호출하여 호스트에서 해당 명령을 직접 호출하는 것처럼 이미지 / 컨테이너를 시작 / 중지 / 빌드 할 수 있습니다.