새 컨테이너가 생성된 후 호스트에서 바로 컨테이너의 IP 주소를 가져오기 위해 실행할 수 있는 명령이 있습니까?
기본적으로 Docker가 컨테이너를 생성하면 자체 코드 배포 및 컨테이너 구성 스크립트를 실행하고 싶습니다.
질문자 :Murali Allada
새 컨테이너가 생성된 후 호스트에서 바로 컨테이너의 IP 주소를 가져오기 위해 실행할 수 있는 명령이 있습니까?
기본적으로 Docker가 컨테이너를 생성하면 자체 코드 배포 및 컨테이너 구성 스크립트를 실행하고 싶습니다.
inspect
의 --format
옵션이 도움이 됩니다.
최신 Docker 클라이언트 구문은 다음과 같습니다.
docker inspect -f '{{range.NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
이전 Docker 클라이언트 구문은 다음과 같습니다.
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
이 명령은 Docker 컨테이너의 IP 주소를 반환합니다.
주석에서 언급했듯이 Windows를 사용하는 경우 중괄호 주위에 '
작은 따옴표 대신 "
docker inspect <container id>
사용할 수 있습니다.
예를 들어:
CID=$(docker run -d -p 4321 base nc -lk 4321); docker inspect $CID
먼저 컨테이너 ID를 가져옵니다.
docker ps
(첫 번째 열은 컨테이너 ID입니다)
컨테이너 ID를 사용하여 다음을 실행합니다.
docker inspect <container ID>
하단의 "NetworkSettings"에서 "IPAddress"를 찾을 수 있습니다.
또는 다음을 수행하십시오.
docker inspect <container id> | grep "IPAddress"
docker inspect CONTAINER_ID | grep "IPAddress"
대소 문자를 무시하기 위해 grep에 -i
를 추가하면 다음도 작동합니다.
docker inspect CONTAINER_ID | grep -i "IPaDDreSS"
단 하나의 명령으로 모든 컨테이너 이름과 해당 IP 주소를 가져옵니다.
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
docker-compose
사용하는 경우 명령은 다음과 같습니다.
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
출력은 다음과 같습니다.
/containerA - 172.17.0.4 /containerB - 172.17.0.3 /containerC - 172.17.0.2
~/.bashrc
또는 관련 파일에 다음 셸 스크립트를 추가합니다.
docker-ip() { docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@" }
그런 다음 컨테이너의 IP 주소를 얻으려면 다음을 수행하십시오.
docker-ip YOUR_CONTAINER_ID
새 버전의 Docker의 경우 다음을 사용하십시오.
docker-ip() { docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@" }
Docker 1.3 이상에서는 다음을 사용하여 확인할 수도 있습니다.
실행 중인 Docker(Linux)를 입력합니다.
docker exec [container-id or container-name] cat /etc/hosts 172.17.0.26 d8bc98fa4088 127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 172.17.0.17 mysql
윈도우의 경우:
docker exec [container-id or container-name] ipconfig
모든 컨테이너의 IP 주소 표시:
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Docker 버전 1.10.3부터 빌드 20f81dd
Docker에 달리 지정하지 않는 한 Docker는 항상 브리지 네트워크에서 컨테이너를 시작합니다. 따라서 아래에서 이 명령을 시도할 수 있습니다.
docker network inspect bridge
그런 다음 실행 중인 컨테이너의 IP 주소를 표시하는 컨테이너 섹션을 반환해야 합니다.
[ { "Name": "bridge", "Id": "40561e7d29a08b2eb81fe7b02736f44da6c0daae54ca3486f75bfa81c83507a0", "Scope": "local", "Driver": "bridge", "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.17.0.0/16" } ] }, "Containers": { "025d191991083e21761eb5a56729f61d7c5612a520269e548d0136e084ecd32a": { "Name": "drunk_leavitt", "EndpointID": "9f6f630a1743bd9184f30b37795590f13d87299fe39c8969294c8a353a8c97b3", "IPv4Address": "172.17.0.2/16", "IPv6Address": "" } }, "Options": { "com.docker.network.bridge.default_bridge": "true", "com.docker.network.bridge.enable_icc": "true", "com.docker.network.bridge.enable_ip_masquerade": "true", "com.docker.network.bridge.host_binding_ipv4": "0.0.0.0", "com.docker.network.bridge.name": "docker0", "com.docker.network.driver.mtu": "1500" } } ]
실행하다:
docker ps -a
그러면 활성 도커 이미지가 표시됩니다.
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 3b733ae18c1c parzee/database "/usr/lib/postgresql/" 6 minutes ago Up 6 minutes 5432/tcp serene_babbage
CONTAINER ID 값을 사용합니다.
docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1
"172.17.0.2"
내가 좋아하는 답변 중 일부를 기반으로 모든 IP 주소와 특정 컨테이너에 대한 다른 주소를 가져오는 기능으로 병합하기로 결정했습니다. 그들은 이제 내 .bashrc
파일에 있습니다.
docker-ips() { docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq) } docker-ip() { docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@" }
첫 번째 명령은 모든 컨테이너의 IP 주소를 제공하고 두 번째 명령은 특정 컨테이너의 IP 주소를 제공합니다.
docker-ips docker-ip YOUR_CONTAINER_ID
다음은 빠른 작업 답변입니다.
컨테이너 이름 또는 ID를 가져옵니다.
docker container ls
그런 다음 IP를 가져옵니다.
docker inspect <container_ID Or container_name> |grep 'IPAddress'
포트 가져오기:
docker inspect <container_ID Or container_name> |grep 'Port'
내 대답:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq ) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n
또한 bash 별칭으로:
docker-ips() { docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} %tab% {{.Name}}' $(docker ps -aq) | sed 's#%tab%#\t#g' | sed 's#/##g' | sort -t . -k 1,1n -k 2,2n -k 3,3n -k 4,4n }
출력은 IP 주소별로 정렬되고 탭으로 구분됩니다.
# docker-ips 172.18.0.2 memcached 172.18.0.3 nginx 172.18.0.4 fpm-backup 172.18.0.5 dns 172.18.0.6 fpm-beta 172.18.0.7 exim 172.18.0.8 fpm-delta 172.18.0.9 mariadb 172.18.0.10 fpm-alpha 172.19.0.2 nextcloud-redis 172.19.0.3 nextcloud-db 172.19.0.4 nextcloud
docker-compose
실행되는 모든 컨테이너에서 IP 주소 테이블을 가져오기 위해 다음 Bash 스크립트를 작성했습니다.
function docker_container_names() { docker ps -a --format "{{.Names}}" | xargs } # Get the IP address of a particular container dip() { local network network='YOUR-NETWORK-HERE' docker inspect --format "{{ .NetworkSettings.Networks.$network.IPAddress }}" "$@" } dipall() { for container_name in $(docker_container_names); do local container_ip=$(dip $container_name) if [[ -n "$container_ip" ]]; then echo $(dip $container_name) " $container_name" fi done | sort -t . -k 3,3n -k 4,4n }
네트워크 변수를 자신의 네트워크 이름으로 변경해야 합니다.
Docker는 Go로 작성되었으며 쿼리 목적으로도 Go 구문을 사용합니다.
특정 컨테이너의 IP 주소를 검사하려면 다음 명령을 실행해야 합니다("형식"의 경우 -f
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name
컨테이너 ID 또는 이름에 대해 다음 명령을 실행할 수 있습니다.
docker container ls
실행 중인 모든 컨테이너를 나열합니다.
이름별 참조 컨테이너:
docker run ... --name pg-master
그런 다음 이름으로 IP 주소 주소를 가져옵니다.
MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
docker inspect container
JSON 출력을 데이터 소스로 사용하여 오늘 Python에서 개발한 솔루션입니다.
검사해야 할 컨테이너와 인프라가 많고 모든 컨테이너에서 빠르고 예쁜 방식으로 기본 네트워크 정보를 가져와야 합니다. 그래서 이 스크립트를 만들었습니다.
중요: 버전 1.9부터 Docker를 사용하면 여러 네트워크를 만들고 컨테이너에 연결할 수 있습니다.
#!/usr/bin/python import json import subprocess import sys try: CONTAINER = sys.argv[1] except Exception as e: print "\n\tSpecify the container name, please." print "\t\tEx.: script.py my_container\n" sys.exit(1) # Inspecting container via Subprocess proc = subprocess.Popen(["docker","inspect",CONTAINER], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) out = proc.stdout.read() json_data = json.loads(out)[0] net_dict = {} for network in json_data["NetworkSettings"]["Networks"].keys(): net_dict['mac_addr'] = json_data["NetworkSettings"]["Networks"][network]["MacAddress"] net_dict['ipv4_addr'] = json_data["NetworkSettings"]["Networks"][network]["IPAddress"] net_dict['ipv4_net'] = json_data["NetworkSettings"]["Networks"][network]["IPPrefixLen"] net_dict['ipv4_gtw'] = json_data["NetworkSettings"]["Networks"][network]["Gateway"] net_dict['ipv6_addr'] = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6Address"] net_dict['ipv6_net'] = json_data["NetworkSettings"]["Networks"][network]["GlobalIPv6PrefixLen"] net_dict['ipv6_gtw'] = json_data["NetworkSettings"]["Networks"][network]["IPv6Gateway"] for item in net_dict: if net_dict[item] == "" or net_dict[item] == 0: net_dict[item] = "null" print "\n[%s]" % network print "\n{}{:>13} {:>14}".format(net_dict['mac_addr'],"IP/NETWORK","GATEWAY") print "--------------------------------------------" print "IPv4 settings:{:>16}/{:<5} {}".format(net_dict['ipv4_addr'],net_dict['ipv4_net'],net_dict['ipv4_gtw']) print "IPv6 settings:{:>16}/{:<5} {}".format(net_dict['ipv6_addr'],net_dict['ipv6_net'],net_dict['ipv6_gtw'])
출력은 다음과 같습니다.
$ python docker_netinfo.py debian1 [frontend] 02:42:ac:12:00:02 IP/NETWORK GATEWAY -------------------------------------------- IPv4 settings: 172.18.0.2/16 172.18.0.1 IPv6 settings: null/null null [backend] 02:42:ac:13:00:02 IP/NETWORK GATEWAY -------------------------------------------- IPv4 settings: 172.19.0.2/16 172.19.0.1 IPv6 settings: null/null null
나는 이 간단한 방법을 사용한다
docker exec -it <container id or name> hostname -i
예
ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i 10.0.1.5
docker inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>
위의 내용은 컨테이너가 기본 브리지 네트워크에 배포된 경우 작동합니다.
그러나 사용자 지정 브리지 네트워크 또는 오버레이 네트워크를 사용하는 경우 아래에서 더 잘 작동하는 것으로 나타났습니다.
docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
ko-dos의 답변을 확장하기 위해 다음은 모든 컨테이너 이름과 해당 IP 주소를 나열하는 별칭입니다.
alias docker-ips='docker ps | tail -n +2 | while read -aa; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect $name | grep IPAddress | cut -d \" -f 4; done'
노트!!! Docker Compose 사용법:
Docker Compose는 각 클러스터에 대해 격리된 네트워크를 생성하기 때문에 아래 방법은 docker-compose
작동하지 않습니다.
가장 우아하고 쉬운 방법은 현재 가장 많이 투표된 @WouterD의 답변인 쉘 함수를 정의하는 것입니다.
dockip() { docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@" }
Docker는 Linux 프로그램과 같은 파일에 컨테이너 ID를 쓸 수 있습니다.
--cidfile=filename
실행하면 Docker는 컨테이너의 ID를 "filename"으로 덤프합니다.
자세한 내용은 " Docker가 PID에 해당하는 섹션을 실행 합니다."를 참조하십시오.
--cidfile="app.cid": Write the container ID to the file
PID 파일 사용:
--cidfile
매개변수로 컨테이너를 실행 app.cid
파일 내용은 다음과 같습니다.
a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
파일 콘텐츠를 사용하여 Docker 컨테이너를 검사할 수 있습니다.
blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
인라인 Python 스크립트를 사용하여 컨테이너 IP를 추출할 수 있습니다.
$ docker inspect `cat app.cid` | python -c "import json;import sys;\ sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])" 172.17.0.2
다음은 보다 인간 친화적인 형태입니다.
#!/usr/bin/env python # Coding: utf-8 # Save this file like get-docker-ip.py in a folder that in $PATH # Run it with # $ docker inspect <CONTAINER ID> | get-docker-ip.py import json import sys sys.stdout.write(json.load(sys.stdin)[0]['NetworkSettings']['IPAddress'])
자세한 내용은 " Docker 컨테이너 IP 주소 가져오기의 10가지 대안 "을 참조하십시오.
Docker 이미지 이름을 기반으로 컨테이너 ID 찾기와 이전 답변 결합:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
Docker Toolbox를 사용하여 Docker를 설치한 경우 Kitematic 애플리케이션을 사용하여 컨테이너 IP 주소를 가져올 수 있습니다.
컨테이너의 IP 주소와 호스트 포트를 가져오려면:
docker inspect containerId | awk '/IPAddress/ || /HostPort/'
산출:
"HostPort": "4200" "HostPort": "4200" "SecondaryIPAddresses": null, "IPAddress": "172.17.0.2", "IPAddress": "172.17.0.2",
완전성을 위해:
--format
옵션이 정말 마음에 들지만 처음에는 이를 인식하지 못했기 때문에 동일한 결과를 얻기 위해 간단한 Python 한 줄짜리를 사용했습니다.
docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
Windows 10의 경우:
docker inspect --format "{{ .NetworkSettings.IPAddress }}" containerId
그러면 호스트의 모든 컨테이너 IP가 나열됩니다.
sudo docker ps -aq | while read line; do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
허용되는 답변은 컨테이너당 여러 네트워크에서 제대로 작동하지 않습니다.
> docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' cc54d96d63ea 172.20.0.4172.18.0.5
다음으로 가장 좋은 답변은 다음과 같습니다.
> docker inspect cc54d96d63ea | grep "IPAddress" "SecondaryIPAddresses": null, "IPAddress": "", "IPAddress": "172.20.0.4", "IPAddress": "172.18.0.5",
jq
를 사용하여 네트워크 JSON을 구문 분석하고 싶습니다.
> docker inspect cc54d96d63ea | jq -r 'map(.NetworkSettings.Networks) []' { "proxy": { "IPAMConfig": null, "Links": [ "server1_php_1:php", "server1_php_1:php_1", "server1_php_1:server1_php_1" ], "Aliases": [ "cc54d96d63ea", "web" ], "NetworkID": "7779959d7383e9cef09c970c38c24a1a6ff44695178d314e3cb646bfa30d9935", "EndpointID": "4ac2c26113bf10715048579dd77304008904186d9679cdbc8fcea65eee0bf13b", "Gateway": "172.20.0.1", "IPAddress": "172.20.0.4", "IPPrefixLen": 24, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:14:00:04", "DriverOpts": null }, "webservers": { "IPAMConfig": null, "Links": [ "server1_php_1:php", "server1_php_1:php_1", "server1_php_1:server1_php_1" ], "Aliases": [ "cc54d96d63ea", "web" ], "NetworkID": "907a7fba8816cd0ad89b7f5603bbc91122a2dd99902b504be6af16427c11a0a6", "EndpointID": "7febabe380d040b96b4e795417ba0954a103ac3fd37e9f6110189d9de92fbdae", "Gateway": "172.18.0.1", "IPAddress": "172.18.0.5", "IPPrefixLen": 24, "IPv6Gateway": "", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:12:00:05", "DriverOpts": null } }
모든 컨테이너의 IP 주소를 나열하려면 다음이 됩니다.
for s in `docker ps -q`; do echo `docker inspect -f "{{.Name}}" ${s}`: docker inspect ${s} | jq -r 'map(.NetworkSettings.Networks) []' | grep "IPAddress"; done /server1_web_1: "IPAddress": "172.20.0.4", "IPAddress": "172.18.0.5", /server1_php_1: "IPAddress": "172.20.0.3", "IPAddress": "172.18.0.4", /docker-gen: "IPAddress": "172.18.0.3", /nginx-proxy: "IPAddress": "172.20.0.2", "IPAddress": "172.18.0.2",
Docker는 모든 컨테이너 IP 및 해당 이름을 인쇄하는 데 사용을 검사합니다.
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
스크립트가 아닌 터미널에서 명령 실행을 위한 솔루션을 찾기 위해 Google에서 온 사람들을 위해 자동 완성 및 제안 기능이 있는 대화형 JSON 드릴다운 유틸리티인 " jid "를 사용하면 더 적은 입력으로 동일한 작업을 수행할 수 있습니다. .
docker inspect $CID | jid
Tab .Net Tab을 입력하면 다음과 같은 내용이 표시됩니다.
[Filter]> .[0].NetworkSettings { "Bridge": "", "EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5", "Gateway": "172.17.0.1", "GlobalIPv6Address": "", "GlobalIPv6PrefixLen": 0, "HairpinMode": false, "IPAddress": "172.17.0.2", "IPPrefixLen": 16, "IPv6Gateway": "", "LinkLocalIPv6Address": "", "LinkLocalIPv6PrefixLen": 0, "MacAddress": "02:42:ac:11:00:02", "Networks": { "bridge": { "Aliases": null, "EndpointID": "b69eb8bd4f11d8b172c82f21ab2e501fe532e4997fc007ed1a997750396355d5", "Gateway": "172.17.0.1", "GlobalIPv6Address": "",
.IPA
탭을 입력하면 다음과 같은 내용이 표시됩니다.
[Filter]> .[0].NetworkSettings.IPAddress "172.17.0.2"
출처 : http:www.stackoverflow.com/questions/17157721/how-to-get-a-docker-containers-ip-address-from-the-host
Git으로 파일의 이전 버전을 보려면 어떻게 해야 합니까? (0) | 2022.01.06 |
---|---|
지도 정렬<Key, Value> 값으로 (0) | 2022.01.06 |
객체 자체가 아닌 포인터를 사용해야 하는 이유는 무엇입니까? (0) | 2022.01.06 |
이미지 처리: '코카콜라 캔' 인식을 위한 알고리즘 개선 (0) | 2022.01.06 |
문자열 "StartWith"가 다른 문자열인지 확인하는 방법은 무엇입니까? (0) | 2022.01.06 |