컨테이너 자체에서 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/
컨테이너에서 $HOSTNAME
env 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)
컨테이너 내부에서 실행하십시오.
이것을 피하십시오. 위험을 이해하고 위험을 명확하게 완화 한 경우에만 수행하십시오.
간단하게하기 위해
- 컨테이너 ID는 docker 내의 호스트 이름입니다.
- 컨테이너 정보는 / 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
'Programing' 카테고리의 다른 글
HTML에서 onBlur와 onChange 속성의 차이점은 무엇입니까? (0) | 2020.08.03 |
---|---|
표준 모드에서 요소 너비 또는 높이 설정 (0) | 2020.08.03 |
힘내 rebase 병합 충돌을 계속할 수 없습니다 (0) | 2020.08.03 |
Eclipse의 정리와 같은 Intellij 아이디어로 프로젝트 캐시를 정리하는 방법은 무엇입니까? (0) | 2020.08.03 |
ASP.NET MVC HandleError (0) | 2020.08.03 |