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


135

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

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

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

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

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


2
조심 :이 읽어야 lvh.io/posts/...을 의 어떤을 시도하기 전에하는 것은 용기 내부 /var/run/docker.sock 사용하는 것을 시도 아래 접근
harschware

1
@harschware의 링크가 끊어진 경우 여기에 요약하겠습니다. 컨테이너에 대한 액세스 권한을 부여하면도 /var/run/docker.sock커가 제공 한 격리를 해제하고 호스트 시스템에 액세스 할 수 있습니다. 분명히 이것은 잠재적으로 위험합니다.
John

1
--hostname 인수를 run 명령과 함께 사용하여 단순히 'hostname'을 실행해도 더 이상 containerid를 제공하지 않으면 Windows 도커 컨테이너 에서 동일한 정보를 얻는 방법을 아는 사람이 있습니까?
Timothy John Laird

답변:


68

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

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

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

15
그것을 조금 조정할했다, 도커 1.4.1에서 나를 위해이 작품 cat /proc/self/cgroup | grep "docker" | sed s/\\//\\n/g | tail -1
ICAS

5
docker 1.6.2의 경우 다음을 사용해야했습니다.cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1
Jay Taylor

14
Aaaaand Docker 1.12 :cat /proc/1/cgroup | grep 'docker/' | tail -1 | sed 's/^.*\///' | cut -c 1-12
smets.kevin

24
종류 등을 I basename "$(cat /proc/1/cpuset)"basename "$(head /proc/1/cgroup)"
madeddie

3
나중에 cgroup 네임 스페이스와 cgroup v2가 docker에서 사용되면이 방법이 더 이상 작동하지 않을 수 있습니다.
Jing Qiu

69

재정의되지 않는 한 호스트 이름은 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

4
그렇기 때문에 nodejs에서 정보를 쉽게 가져올 수 있습니다. const os = require('os'); console.log(os.hostname());
pulkitsinghal 2016 년

2
Java의 컨테이너 ID와 일치하는 호스트 이름을 얻으려면을 사용하십시오 InetAddress.getLocalHost().getHostName().
Nathan

2
때로는 환경 변수의 값을 읽는 것이 더 간단합니다 $HOSTNAME(예 : 셸 스크립트).
Faheel

34

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 파일에 있습니다.


2
고맙지 만 이것은 어쨌든 사용하는 것과 같은 접근 방식이며, docker를 실행할 때 호스트 이름을 -h로 설정하면 중단됩니다.
Alessandro

@Alessandro 나는 -cidfile 매개 변수에 대한 정보를 docker run에 추가했습니다. $ HOSTNAME을 사용하는 대신 도커 ID를 컨테이너에 전달하는 데 도움이 될 수 있습니다.
Jiri

큰! 네, 제가 사용할 수있는 것입니다! 감사합니다!
Alessandro

이상하게도 1.11.2에서는 env나열되지 HOSTNAME않지만 echo $HOSTNAME작동합니다.
Jesse Glick

이것은 전혀 작동하지 않으며 URL이 손상되어 잘못된 문서로 리디렉션됩니다. requests.exceptions.MissingSchema: Invalid URL '/containers/1d26a841bf07/json': No schema supplied. Perhaps you meant http:///containers/1d26a841bf07/json?
Cerin

24

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

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


21

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

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


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

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

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


1
docker run --hostname옵션을 사용 하면 이것이 작동하지 않는 것 같습니다 .
hairyhenderson

경우 --hostname당신이 응답과 허용 대답 @Jay 테일러에서 주석에서 조합을 사용할 수 있습니다 설정 : docker inspect $(cat /proc/self/cgroup | grep 'docker' | sed 's/^.*\///' | tail -n1)실행중인 컨테이너에 대한 모든 정보를 얻을 수 있습니다.
Michael K.

docker-io에 대한 참조를 넣을 수 있습니까?
Brad P.

나는 그것의 npmjs.com/package/docker-io를 가정 하지만 그것은 구글이 나에게 말한 것이며 아마도 당신이 의도 한 것이 아닙니다.
Brad P.

15

간단하게하기 위해

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

호스트 이름을 얻으려면

hostname

또는

uname -n

또는

cat /etc/host

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


10

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

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

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

$ cat /etc/hostname
4de1c09d3f19

또는 간단히 :

$ hostname
4de1c09d3f19

6

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

2

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

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

그런 다음 Docker API에 대한 약간의 요청 (/var/run/docker.sock을 공유 할 수 있음)으로 모든 정보를 검색하십시오.


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

2

형식이 변경되어 일부 게시 된 솔루션이 작동을 멈췄습니다 /proc/self/cgroup. 다음은 형식 변경에 좀 ​​더 강력한 단일 GNU grep 명령입니다.

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

다음은이 명령으로 테스트 한 내부 도커 컨테이너의 / proc / self / cgroup 스 니핏입니다.

리눅스 4.4 :

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

리눅스 4.8-4.13 :

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

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

0

따로, 컨테이너의 pid가 있고 컨테이너의 docker id를 얻으려면 위의 sed magic과 함께 nsenter를 사용하는 것이 좋습니다.

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


-19

사용하십시오 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",
...

다음과 같이 ip를 얻을 수 있습니다.

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

5
이것은 내가 의미하는 것이 아닙니다. 컨테이너 내부 에서이 정보를 얻을 수 있어야합니다 . 기본적으로 내부에서 실행중인 컨테이너의 ID를 이해하는 방법이 필요합니다.
Alessandro
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.