Programing

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

crosscheck 2020. 8. 3. 17:41
반응형

컨테이너 자체에서 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'

경고 : 고려하기 전에이 방법의 보안 위험을 이해해야 합니다. 위험에 대한 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


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

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

17.09에서 도커 컨테이너 내에서 가장 간단한 방법이 있음을 발견했습니다.

$ cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3
4de1c09d3f1979147cd5672571b69abec03d606afcc7bdc54ddb2b69dec3861c

또는 이미 언급했듯이 더 짧은 버전의

$ cat /etc/hostname
4de1c09d3f19

또는 간단히 :

$ hostname
4de1c09d3f19

Docker는 기본적으로 호스트 이름을 컨테이너 ID로 설정하지만 사용자는이를 사용하여이 이름을 무시할 수 있습니다 --hostname. 대신 다음을 검사하십시오 /proc.

$ more /proc/self/cgroup
14:name=systemd:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
13:pids:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
12:hugetlb:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
11:net_prio:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
10:perf_event:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
9:net_cls:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
8:freezer:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
7:devices:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
6:memory:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
5:blkio:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
4:cpuacct:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
3:cpu:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
2:cpuset:/docker/7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605
1:name=openrc:/docker

컨테이너 ID를 추출하는 편리한 한 줄짜리입니다.

$ grep "memory:/" < /proc/self/cgroup | sed 's|.*/||'
7be92808767a667f35c8505cbf40d14e931ef6db5b0210329cf193b15ba9d605

이 명령 행을 사용하여 현재 컨테이너 ID (docker 1.9로 테스트)를 식별 할 수 있습니다.

awk -F"-|/." '/1:/ {print $3}' /proc/self/cgroup

Then, a little request to Docker API (you can share /var/run/docker.sock) to retrieve all informations.


awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup

Some posted solutions have stopped working due to changes in the format of /proc/self/cgroup. Here is a single GNU grep command that should be a bit more robust to format changes:

grep -o -P -m1 'docker.*\K[0-9a-f]{64,}' /proc/self/cgroup

For reference, here are snippits of /proc/self/cgroup from inside docker containers that have been tested with this command:

Linux 4.4:

11:pids:/system.slice/docker-cde7c2bab394630a42d73dc610b9c57415dced996106665d427f6d0566594411.scope
...
1:name=systemd:/system.slice/docker-cde7c2bab394630a42d73dc610b9c57415dced996106665d427f6d0566594411.scope

Linux 4.8 - 4.13:

11:hugetlb:/docker/afe96d48db6d2c19585572f986fc310c92421a3dac28310e847566fb82166013
...
1:name=systemd:/docker/afe96d48db6d2c19585572f986fc310c92421a3dac28310e847566fb82166013

As an aside, if you have the pid of the container and want to get the docker id of that container, a good way is to use nsenter in combination with the sed magic above:

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


The simplest way i found is : docker inspect --format="{{.Id}}"


Use docker inspect.

$ docker ps # get conteiner id
$ docker inspect 4abbef615af7
[{
    "ID": "4abbef615af780f24991ccdca946cd50d2422e75f53fb15f578e14167c365989",
    "Created": "2014-01-08T07:13:32.765612597Z",
    "Path": "/bin/bash",
    "Args": [
        "-c",
        "/start web"
    ],
    "Config": {
        "Hostname": "4abbef615af7",
...

Can get ip as follows.

$ docker inspect -format="{{ .NetworkSettings.IPAddress }}" 2a5624c52119
172.17.0.24

참고URL : https://stackoverflow.com/questions/20995351/how-can-i-get-docker-linux-container-information-from-within-the-container-itsel

반응형