컨테이너 자체 내에서 Docker Linux 컨테이너 정보를 가져오려면 어떻게 해야 합니까?
나는 나의 것을 만들고 싶습니다.docker containers
메타데이터를 통해 EC2 인스턴스에 대한 정보를 얻을 수 있는 것과 동일한 방식으로 이러한 구성을 인식합니다.
할 수 , 사용제수다니있습공할제(▁().docker
포서수중에서 .4243
)
curl http://172.17.42.1:4243/containers/$HOSTNAME/json
일부 데이터를 얻기 위해, 하지만 적어도 컨테이너의 전체 ID를 얻는 더 나은 방법이 있는지 알고 싶습니다, 왜냐하면HOSTNAME
도커는 실제로 12자로 단축되었으며 "최상의 일치"를 수행하는 것으로 보입니다.
또한 도커 호스트의 외부 IP는 어떻게 가져올 수 있습니까(AWS와 관련된 EC2 메타데이터 액세스 제외).
재정의하지 않는 한 호스트 이름은 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
컨테이너 ID는 /proc/self/cgroup에서 찾을 수 있습니다.
따라서 다음을 통해 ID를 얻을 수 있습니다.
cat /proc/self/cgroup | grep -o -e "docker-.*.scope" | head -n 1 | sed "s/docker-\(.*\).scope/\\1/"
매드디의 발언이 제게는 가장 우아하게 보입니다.
CID=$(basename $(cat /proc/1/cpuset))
도커 원격 API를 통해 유닉스 소켓을 사용하여 컨테이너 내부에서 도커와 통신할 수 있습니다.
https://docs.docker.com/engine/reference/api/docker_remote_api/
은 테이너에검를통단도해락커 ID인수있다습을 으로써 짧은 수 .$HOSTNAME
환경의doc에 따르면 충돌 가능성이 적다고 하는데, 적은 수량의 컨테이너에 대해서는 걱정하지 않으셔도 될 것 같습니다.저는 풀 아이디를 직접 받는 방법을 모릅니다.
banyan 답변에 설명된 것과 유사한 방법으로 용기를 검사할 수 있습니다.
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는 호스트 이름입니다.다음과 같은 작업을 수행할 수 있습니다.
- 도커-io 패키지를 호스트와 동일한 버전으로 컨테이너에 설치합니다.
- 로시합다니로 합니다.
--volume /var/run/docker.sock:/var/run/docker.sock --privileged
- 마지막으로 실행:
docker inspect $(hostname)
이것을 피하세요.위험을 이해하고 위험을 명확하게 완화할 수 있는 경우에만 이 작업을 수행합니다.
간단히 말하면,
- 컨테이너 ID는 도커 내부의 호스트 이름입니다.
- 컨테이너 정보는 /proc/self/cgroup 내에서 사용할 수 있습니다.
호스트 이름을 가져오려면,
hostname
또는
uname -n
또는
cat /etc/host
출력을 임의의 파일로 리디렉션하고 응용 프로그램에서 다시 읽을 수 있습니다. 예:# hostname > /usr/src//hostname.txt
17.09에서 도커 컨테이너 내에서 이를 수행하는 가장 간단한 방법이 있다는 것을 알게 되었습니다.
$ cat /proc/self/cgroup | head -n 1 | cut -d '/' -f3
4de1c09d3f1979147cd5672571b69abec03d606afcc7bdc54ddb2b69dec3861c
또는 이미 말했듯이, 더 짧은 버전은
$ cat /etc/hostname
4de1c09d3f19
간단히 말하면:
$ hostname
4de1c09d3f19
를 도는기로본컨너 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
은 일부게솔루다음형변식중인 되었습니다./proc/self/cgroup
다음은 형식 변경에 좀 더 강력해야 하는 단일 GNU grep 명령입니다.
grep -o -P -m1 'docker.*\K[0-9a-f]{64,}' /proc/self/cgroup
다음은 다음 명령으로 테스트한 내부 도커 컨테이너의 /proc/self/cgroup 일부입니다.
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
지금까지 효과가 있을 수 있는 세 곳이 있는데, 각각 장단점이 있습니다.
echo $HOSTNAME
또는hostname
cat /proc/self/cgroup
cat /proc/self/mountinfo
$HOSTNAME
쉽지만 부분적이며 K8s에 의해 포드 이름으로 덮어쓰게 됩니다.
/proc/self/cgroup
cgroupV1과 함께 작동하는 것처럼 보이지만 cgroupV2에서 호스팅되는 것은 아닙니다.
/proc/self/mountinfo
cgroupV2에 대한 컨테이너 ID는 계속 유지되지만 마운트 지점의 값은 컨테이너 런타임에 따라 다릅니다.
- 예를 들어 도커 엔진에서 값은 다음과 같습니다.
678 655 254:1 /docker/containers/7a0144cee1256c539fab790199527b7051aff1b603ebcf7ed3fd436440ef3b3a/resolv.conf /etc/resolv.conf rw,relatime - ext4 /dev/vda1 rw
ContainerD
), 과 같은
1733 1729 0:35 /kubepods/besteffort/pod3272f253-be44-4a82-a541-9083e68cf99f/7a0144cee1256c539fab790199527b7051aff1b603ebcf7ed3fd436440ef3b3a /sys/fs/cgroup/blkio ro,nosuid,nodev,noexec,relatime master:17 - cgroup cgroup rw,blkio
또한, 위의 모든 것들의 가장 큰 문제는 그것들이 모두 구현이라는 것입니다. 추상화는 없고 시간이 지남에 따라 모두 바뀔 수 있습니다.
표준화하려는 노력이 있으며, 저는 이를 지켜볼 가치가 있다고 생각합니다.
https://github.com/opencontainers/runtime-spec/issues/1105
위의 모든 "문제"는 OCI 사양의 일부로서 헌신적인 퍼블릭 API, 프로토콜 또는 컨벤션을 통해가 아니라 도커 자체 또는 도커의 구현 방식과 cgroups 및 /proc와 상호 작용하는 방식에 달려 있다는 것입니다.
따라서 이러한 솔루션은 "짧은" 것이며 구현이 변경되거나 사용자 구성에 의해 규칙이 재정의될 때 예상치 못한 경우에 중단될 가능성이 높습니다.
컨테이너 및 이미지 ID는 컨테이너 인스턴스를 시작한 구성 요소에 의해 R/T 환경에 주입되어야 합니다. 코드 실행을 허용하는 것 외에는 다른 이유가 없습니다. 이 정보를 사용하여 로깅/디버깅 등을 위해 고유하게 자신을 식별할 수 있습니다.
0.02달러, YMMV...
이 명령줄을 사용하여 현재 컨테이너 ID(도커 1.9로 테스트됨)를 식별할 수 있습니다.
awk -F"-|/." '/1:/ {print $3}' /proc/self/cgroup
그런 다음 Docker API(/var/run/docker.sock을 공유할 수 있음)에 모든 정보를 검색하도록 약간의 요청을 합니다.
awk -F'[:/]' '(($4 == "docker") && (lastId != $NF)) { lastId = $NF; print $NF; }' /proc/self/cgroup
별도로, 컨테이너의 pid를 가지고 있고 해당 컨테이너의 도커 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/"
언급URL : https://stackoverflow.com/questions/20995351/how-can-i-get-docker-linux-container-information-from-within-the-container-itsel
'source' 카테고리의 다른 글
MVC와 같은 WebForms에서 데이터를 루프하는 방법 (0) | 2023.08.04 |
---|---|
.dex 파일의 메서드 참조 수는 64k API 17을 초과할 수 없습니다. (0) | 2023.08.04 |
iOS에서 문자열을 하위 문자열로 분할하는 방법은 무엇입니까? (0) | 2023.08.04 |
Swift를 사용하여 상위 보기에 맞게 텍스트 크기를 조정하는 방법UI? (0) | 2023.08.04 |
런타임에 사용자로부터 입력을 받는 방법 (0) | 2023.07.30 |