누구나 docker.sock을 설명 할 수 있습니까?


130

나는 설치에 대한 실제 이유를 이해하려고 노력하고 있어요 docker.sockdocker-compose.yml파일을. 자동 검색입니까?

volumes:
  - /var/run/docker.sock:/var/run/docker.sock

답변:


130

docker.sockDocker 데몬이 수신하는 UNIX 소켓입니다. Docker API의 주요 진입 점입니다. TCP 소켓 일 수도 있지만 보안상의 이유로 Docker는 기본적으로 UNIX 소켓을 사용합니다.

Docker cli 클라이언트는이 소켓을 사용하여 기본적으로 docker 명령을 실행합니다. 이 설정도 무시할 수 있습니다.

컨테이너 안에 Docker 소켓을 마운트해야하는 이유는 여러 가지가있을 수 있습니다. 다른 컨테이너 내에서 새 컨테이너를 시작하는 것과 같습니다. 또는 자동 서비스 검색 및 로깅 목적. 컨테이너 내부에 도커 소켓을 마운트하면 해당 컨테이너 내부에서 신뢰할 수있는 코드가 실행됩니다. 그렇지 않으면 Docker가 기본적으로 모든 컨테이너를 루트로 시작하므로 docker 데몬을 실행하는 호스트를 손상시킬 수 있습니다.

도커 소켓에는 대부분의 설치에 도커 그룹이 있으므로 해당 그룹의 사용자는 루트 권한없이 도커 소켓에 대해 도커 명령을 실행할 수 있지만 도커 데몬은 루트로 효과적으로 실행되므로 실제 도커 컨테이너는 여전히 루트 권한을 갖습니다 (네임 스페이스 및 cgroup에 액세스하려면 루트 권한이 필요합니다) .

귀하의 질문에 대한 답변이 되었기를 바랍니다.

추가 정보 : https://docs.docker.com/engine/reference/commandline/dockerd/#examples


1
링크가 끊어졌습니다. : 아마 예상과 유사한 정보가 이것이다 docs.docker.com/engine/admin는
보르 Bolilla

7
@boynux는 경고 외에도 Docker 보안 모범 사례 기사에서 자세한 정보를 찾을 수 있습니다 . 그들이 말하는이 하나에 : "설치 /var/run/docker.sock컨테이너 내부에 아직 매우 위험한 연습 공통 인 공격자는 일반적으로 루트로 고정 표시기 서비스가 실행으로 전체 호스트 시스템에 대한 액세스를 제공하는 고정 표시기 서비스를 실행할 수있는 명령을 실행할 수 있습니다.. "
Arnold Schrijver

36

나는 그것이 늦다는 것을 알고 있지만 내 대답이 많은 통찰력을 줄 수 있기를 바랍니다.

유닉스 소켓 에 대해 먼저 이야기하겠습니다

소켓이라는 용어는 일반적으로 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
  }
]

일부 명령 :

docker.sock으로 많은 것을 할 수 있습니다.

이 아름다운 기사를 확인 하십시오


6

기본적으로 호스트 도커 데몬을 컨테이너에 노출시킵니다. 따라서 컨테이너에서 docker api / client를 호출하여 호스트에서 해당 명령을 직접 호출하는 것처럼 이미지 / 컨테이너를 시작 / 중지 / 빌드 할 수 있습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.