[linux] 컨테이너 자체에서 Docker Linux 컨테이너 정보를 어떻게 얻을 수 있습니까?

docker containers메타 데이터를 통해 EC2 인스턴스에 대한 정보를 얻을 수있는 것과 같은 방식으로 구성을 알고 싶습니다 .

사용할 수 있습니다 (제공되는 docker포트에서 제공 4243)

curl http://172.17.42.1:4243/containers/$HOSTNAME/json

데이터의 일부를 얻으려면 HOSTNAME실제로 컨테이너의 전체 ID를 얻는 더 좋은 방법이 있는지 알고 싶습니다. 실제로 12 자로 단축되고 도커는 “최적의 일치”를 수행하는 것처럼 보입니다.

또한 도커 호스트의 외부 IP를 얻는 방법 (AWS 전용 EC2 메타 데이터에 액세스하는 것 제외)



답변

컨테이너 ID는 / proc / self / cgroup에서 찾을 수 있습니다.

그래서 당신은 ID를 얻을 수 있습니다 :

cat /proc/self/cgroup | grep -o  -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"


답변

재정의되지 않는 한 호스트 이름은 Docker 1.12의 짧은 컨테이너 ID 인 것으로 보입니다.

root@d2258e6dec11:/project# cat /etc/hostname
d2258e6dec11

외부 적으로

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED                 STATUS                      PORTS               NAMES
d2258e6dec11        300518d26271        "bash"              5 minutes ago

$ docker -v
Docker version 1.12.0, build 8eab29e, experimental


답변

Docker Remote API를 통해 유닉스 소켓을 사용하여 컨테이너 내부에서 도커와 통신 할 수 있습니다.

https://docs.docker.com/engine/reference/api/docker_remote_api/

컨테이너에서 $HOSTNAMEenv var 를 검사하여 단축 도커 ID를 찾을 수 있습니다 . 의사에 따르면, 충돌 가능성이 적습니다. 적은 수의 컨테이너에 대해서는 걱정할 필요가 없다고 생각합니다. 직접 신분을 얻는 방법을 모르겠습니다.

반얀 답변에 설명 된 것과 유사한 방식으로 컨테이너를 검사 할 수 있습니다 .

GET /containers/4abbef615af7/json HTTP/1.1

응답:

HTTP/1.1 200 OK
Content-Type: application/json

{
         "Id": "4abbef615af7......  ",
         "Created": "2013.....",
         ...
}

또는 도커 ID를 파일의 컨테이너로 전송할 수 있습니다. 파일이 “마운트 된 볼륨”에 있으므로 컨테이너로 전송됩니다.

docker run -t -i -cidfile /mydir/host1.txt -v /mydir:/mydir ubuntu /bin/bash

도커 ID (단축 됨)는 컨테이너의 /mydir/host1.txt 파일에 있습니다.


답변

컨테이너 내에서 전체 컨테이너 ID를 가져옵니다.

cat /proc/self/cgroup | grep "cpu:/" | sed 's/\([0-9]\):cpu:\/docker\///g'


답변

madeddie 의 의견은 나에게 가장 우아하게 보입니다.

CID=$(basename $(cat /proc/1/cpuset))


답변

경고 : 고려하기 전에이 방법의 보안 위험을 이해해야 합니다. 위험에 대한 John 의 요약 :

컨테이너에 대한 액세스 권한을 부여하면도 /var/run/docker.sock커가 제공 한 격리를 벗어나 호스트 시스템에 액세스하는 것이 [사실] 쉽습니다. 분명히 이것은 잠재적으로 위험합니다.


컨테이너 내에서 dockerId는 호스트 이름입니다. 그래서 당신은 할 수 있습니다 :

  • 호스트와 동일한 버전으로 컨테이너에 docker-io 패키지 를 설치하십시오.
  • 로 시작 --volume
    /var/run/docker.sock:/var/run/docker.sock --privileged
  • 마지막으로 docker inspect $(hostname)컨테이너 내부에서 실행하십시오.

이것을 피하십시오. 위험을 이해하고 위험을 명확하게 완화 한 경우에만 수행하십시오.


답변

간단하게하기 위해

  1. 컨테이너 ID는 docker 내의 호스트 이름입니다.
  2. 컨테이너 정보는 / proc / self / cgroup에서 사용할 수 있습니다

호스트 이름을 얻으려면

hostname

또는

uname -n

또는

cat /etc/host

출력은 모든 파일로 경로 재 지정 될 수 있으며 응용 프로그램에서 다시 읽을 수 있습니다. 예 : # hostname > /usr/src//hostname.txt