วิธีรับที่อยู่ IP ของคอนเทนเนอร์ Docker จากโฮสต์


1409

มีคำสั่งที่ฉันสามารถเรียกใช้เพื่อรับที่อยู่ IP ของคอนเทนเนอร์จากโฮสต์หลังจากสร้างคอนเทนเนอร์ใหม่หรือไม่

โดยพื้นฐานแล้วเมื่อนักเทียบท่าสร้างคอนเทนเนอร์ฉันต้องการม้วนการปรับใช้รหัสของตัวเองและสคริปต์การกำหนดค่าคอนเทนเนอร์


28
ฉันแค่ต้องการทำให้แน่ใจว่า noobs อื่นไม่ทำผิดพลาดและพยายามรับ IP จากภาพแทนที่จะเป็นที่เก็บ ตรวจสอบให้แน่ใจว่าคุณได้รับ CID หรือรหัสคอนเทนเนอร์และสอบถามว่า CID ผ่าน 'นักเทียบท่า ps' นั่นคือ
Paul Gregoire

วิธีการรับในทางกลับกัน? โฮสต์ IP หรือโทรจากคอนเทนเนอร์?
Somnath Muluk

คำตอบ:


2328

ทาง--formatเลือกของinspectการช่วยเหลือ

ไวยากรณ์ไคลเอนต์ Docker ที่ทันสมัยคือ:

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id

ไวยากรณ์ของไคลเอ็นต์ Docker เก่าคือ:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id

คำสั่งเหล่านี้จะส่งคืนที่อยู่ IP ของคอนเทนเนอร์ Docker

ดังที่ได้กล่าวไว้ในความคิดเห็น: หากคุณใช้ Windows ให้ใช้เครื่องหมายคำพูดคู่"แทนคำพูดเดี่ยว'รอบวงเล็บปีกกา


34
นี่เป็นวิธีที่ดีกว่ามาก ถามเฉพาะสิ่งที่คุณต้องการถ้าเป็นไปได้!
MikeyB

8
อืมมม รับการ<no value>ตอบสนองบน Mac โดยใช้ Fig / Boot2Docker
cevaris

2
@cevaris คุณจะได้รับ<no value>ถ้าคุณพยายามเรียกใช้กับคอนเทนเนอร์ที่ไม่ได้ทำงานอยู่ ตรวจสอบให้แน่ใจว่าคอนเทนเนอร์ของคุณทำงานก่อนที่คุณจะทำสิ่งนี้
TheJediCowboy

55
!คำเตือน! มันไม่ทำงานอีกต่อไป {{ .NetworkSettings.Networks.$network.IPAddress }}รูปแบบใหม่จะเป็นเฉพาะกับภาชนะและตามแบบฟอร์ม ค่าเริ่มต้นดูเหมือนจะเป็นบริดจ์ แต่ภายใต้นักเทียบท่าเขียนนี้จะเป็นชื่อเฉพาะที่ขึ้นอยู่กับชื่อแอปของคุณ (ฉันคิดว่าจาก --project-name flag แม้ว่ามันจะขึ้นอยู่กับประเภทของการกำหนดค่าเครือข่ายด้วยเช่นกัน คุณได้ตั้งค่า) ฉันเขียนคำตอบแบบเต็มในคำตอบที่นี่stackoverflow.com/questions/17157721/…
Dunk

5
บางทีฉันอาจเป็นแกะที่ง่วงนอน แต่คำเตือนเกี่ยวกับเครื่องหมายคำพูดคู่นั้นไม่หนาและบิ่นพอที่จะดึงดูดความสนใจของฉันได้ อาจให้สองตัวอย่างที่ชัดเจนว่า Linux และ Windows ฉันแค่พิมพ์ตัวอย่างตรวจสอบเอกสารที่ยังใช้เครื่องหมายคำพูดเดี่ยวแล้วก็ Googled ข้อผิดพลาด ฉันแน่ใจว่าฉันไม่ได้อยู่คนเดียว
Wyck

513

docker inspect <container id>คุณสามารถใช้

ตัวอย่างเช่น:

CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID

67
เพื่อที่จะดึงไอพีออกมาคุณสามารถทำสิ่งต่างdocker inspect $CID | grep IPAddress | cut -d '"' -f 4ๆ ได้มันทำงานได้ดี :)
creack

9
นำมารวมกันนามแฝงของเชลล์นี้ควรแสดงรายการรหัสคอนเทนเนอร์ทั้งหมดและรหัสของพวกเขา:alias dockerip='docker ps | tail -n +2 | while read cid b; do echo -n "$cid\t"; docker inspect $cid | grep IPAddress | cut -d \" -f 4; done'
ko-dos

64
ตามที่กล่าวถึงโดย @ user3119830 มีตัวเลือกใหม่สำหรับการตรวจสอบ ตอนนี้คุณสามารถทำให้ Ip ง่ายขึ้นด้วยdocker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
creack

16
เพียงแค่ทราบ ตัวเลือกเส้นประเดียวถูกเลิกใช้เพื่อให้ - รูปแบบจะกลายเป็น - รูปแบบ
jamtur01

7
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}เป็นไวยากรณ์ใหม่ จะเลิกมันจะกลายเป็น-format --format
Devy

408

ก่อนรับ ID คอนเทนเนอร์:

docker ps

(คอลัมน์แรกใช้สำหรับ ID คอนเทนเนอร์)

ใช้ ID คอนเทนเนอร์เพื่อเรียกใช้:

docker inspect <container ID>

ที่ด้านล่างภายใต้ "การตั้งค่าเครือข่าย" คุณจะพบ "IPAddress"

หรือเพียงแค่ทำ:

docker inspect <container id> | grep "IPAddress"

5
น่าเสียดายที่หนึ่งในอินสแตนซ์ของฉัน (เริ่มต้นด้วยdocker run -it MYCONTAINER /bin/bash) ผลลัพธ์ของinspectไม่มีส่วนNetworkSettings!
Eric

3
สิ่งนี้ไม่ทำงานบน Windows 10 คุณต้องหาที่อยู่ ip ของ DockerNAT ด้วย ipconfig ด้วย
ntiedt

@Eric นอกจากนี้คุณยังสามารถตรวจสอบสะพานเครือข่ายเพื่อ:docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
Tomasz Kapłoński

5
ฉันชอบ... | grep IPโซลูชันมากสำหรับรายละเอียดการจัดรูปแบบทั้งหมดที่จำเป็นในการรับ IP +1
d8aninja

1
@Eric - คุณสับสนกับภาพคอนเทนเนอร์ภาพคำสั่งเป็นจริงdocker run -it MYIMAGE(นั่นไม่ใช่ชื่อคอนเทนเนอร์ ); ถ้าคุณทำdocker inspect MYIMAGEคุณจะได้รับข้อมูลคงที่เกี่ยวกับภาพ คุณต้องค้นหาชื่อของคอนเทนเนอร์ที่ใช้งานอยู่ (หรือใช้รหัสตามที่คนอื่นแนะนำ) ในระบบของฉันคอนเทนเนอร์ดังกล่าวแรกที่สร้างจากอิมเมจนั้นใช้ค่าเริ่มต้นเป็นชื่อMYIMAGE_1ดังนั้นdocker inspect MYIMAGE_1มี NetworkSettings
ToolmakerSteve

216
docker inspect CONTAINER_ID | grep "IPAddress"

คุณสามารถเพิ่มลง-iใน grep เพื่อเพิกเฉยกรณีและปัญหาดังต่อไปนี้:

docker inspect CONTAINER_ID | grep -i "IPaDDreSS"

5
คำตอบนี้ดีกว่า / แตกต่างจากอีก 22 อย่างไร
sds

นี่ไม่ใช่คำตอบที่ดีที่สุดแน่นอน คำตอบของ WouterD คือคำตอบที่คุณกำลังมองหา
M.Vanderlee

7
@ M.Vanderlee คำตอบนี้มีคำสั่งที่จำง่ายกว่าซึ่งทำให้เป็นคำตอบที่ดีกว่า IMO
huysentruitw

1
@WouterHuysentruit แน่นอน แต่คุณได้รับหลายรายการและข้อความ "IPAddress" ที่แท้จริง คุณไม่สามารถใช้งานได้ในสคริปต์หากไม่มีการจัดการเพิ่มเติม
M.Vanderlee

คุณถูก. ในบริบทของคำถามคำตอบอื่น ๆ จะเหมาะกว่า
huysentruitw

133

ในการรับชื่อคอนเทนเนอร์ทั้งหมดและที่อยู่ 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

5
ฉันชอบสิ่งนี้มาก แต่ก็ไม่ได้ผลสำหรับ Docker Compose เช่นกันบางอย่างเกี่ยวกับการมีเครือข่ายของตัวเอง แทนที่จะเปลี่ยน{{.NetworkSettings.IPAddress }}เป็น{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
clockworkgeek

นี่คือการใช้รูปแบบ docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'I: sed(1)ลบบรรทัดว่างเปล่าสำหรับบรรจุปัจจุบัน แต่ไม่ได้มีที่อยู่ IP
NYCeyes

97

เพิ่มเชลล์สคริปต์นี้ใน~/.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}}' "$@"
}

5
Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings"
saiyancoder

สิ่งนี้ใช้ได้สำหรับฉัน แต่จำเป็นต้องsource ~/.bash_profile
penny chan

1
คุณจะได้รับข้อผิดพลาดนี้หากคุณไม่ได้ตรวจสอบคอนเทนเนอร์ที่ใช้งานอยู่ แต่มีเพียงรูปภาพ ... รูปภาพที่ไม่มี IPAddress ... ข้อความแสดงข้อผิดพลาดแย่ใช่
dagelf

37

แสดงที่อยู่ IP ของคอนเทนเนอร์ทั้งหมด:

docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)

37

ใน 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

สำหรับ windows:

docker exec [container-id or container-name] ipconfig

1
หรือเพียงแค่docker exec [container-name-or-id] ip a
เตฟานริชเตอร์

สำหรับ windowsdocker exec [container-id or container-name] ipconfig
GreatAndPowerfulOz

27

ในฐานะของ 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"
        }
    }
]

หมายความว่าอย่างไรถ้าส่วนคอนเทนเนอร์ของคุณว่างเปล่า กระนั้นภาชนะก็ยังเปิดใช้งานอยู่
StackEdd

24

ดำเนินการ:

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

ใช้ค่ารหัสคอนเทนเนอร์:

docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1

"172.17.0.2"


23

จากคำตอบบางคำตอบที่ฉันรักฉันตัดสินใจที่จะรวมมันเข้ากับฟังก์ชั่นเพื่อรับที่อยู่ 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

16

อ้างอิงคอนเทนเนอร์ตามชื่อ:

docker run ... --name pg-master

จากนั้นหยิบที่อยู่ IP ตามชื่อ:

MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)

15

ผมเขียนสคริปต์ทุบตีต่อไปนี้จะได้รับตารางของที่อยู่ IP docker-composeจากภาชนะทั้งหมดที่ทำงานภายใต้

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
}

คุณควรเปลี่ยนเครือข่ายตัวแปรเป็นชื่อเครือข่ายของคุณเอง


1
Tuong Le คำตอบจากที่นี่stackoverflow.com/questions/17157721/..หลีกเลี่ยงการระบุเครือข่ายแบบจุ่ม (): นักเทียบท่าตรวจสอบ - จัดรูปแบบ '{{range .NetworkSettings.Networks}} {{. IPAddress}} {{end} } '"$ @"
JoanComasFdz

1
@JoanComasFdz คุณช่วยฉันขอบคุณมาก!
Chagai Friedlander

14

นี่คือคำตอบที่ใช้งานได้อย่างรวดเร็ว:

รับชื่อคอนเทนเนอร์หรือ ID ของคุณ:

docker container ls

จากนั้นรับ IP:

docker inspect <container_ID Or container_name> |grep 'IPAddress'

รับพอร์ต:

docker inspect <container_ID Or container_name> |grep 'Port'

13

นักเทียบท่าถูกเขียนใน Go และใช้ไวยากรณ์ของ Go เพื่อจุดประสงค์ในการสืบค้นด้วย

ในการตรวจสอบที่อยู่ IP ของคอนเทนเนอร์เฉพาะคุณต้องรันคำสั่ง ( -fสำหรับ "รูปแบบ"):

docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name

สำหรับ ID คอนเทนเนอร์หรือชื่อคุณสามารถเรียกใช้คำสั่ง

docker container ls

ซึ่งจะแสดงรายการทุกคอนเทนเนอร์ที่ทำงาน


1
มันมีประโยชน์มาก ฉันจะหาเอกสารเพื่อเขียนข้อความค้นหา Go ของตัวเองได้ที่ไหน
Michael Hoffmann

12

นี่คือวิธีแก้ปัญหาที่ฉันพัฒนาในปัจจุบันใน Python โดยใช้ docker inspect containerเอาต์พุต JSON เป็นแหล่งข้อมูล

ฉันมีคอนเทนเนอร์และโครงสร้างพื้นฐานจำนวนมากที่ฉันต้องตรวจสอบและฉันจำเป็นต้องได้รับข้อมูลเครือข่ายพื้นฐานจากคอนเทนเนอร์ใด ๆ อย่างรวดเร็วและสวยอย่าง นั่นเป็นเหตุผลที่ฉันทำสคริปต์นี้

สำคัญ:ตั้งแต่เวอร์ชัน 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

ได้โปรดเปลี่ยนเป็น python2.7 ในสคริปต์ตอนนี้ python3 ใช้งานทั่วไปหรือเขียนสองรุ่น
42n4

ฉันจะอัปเดตส่วนสำคัญของฉันและทันทีที่ฉันมีฉันจะโพสต์ที่นี่ ที่จริงแล้วเสื้อคลุมนี้ออกแบบมาสำหรับ Python 2.7 ขอบคุณสำหรับความคิดเห็น!
ivanleoncz

9
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}'

9

หากต้องการขยายคำตอบของ ko-dos ต่อไปนี้เป็นชื่อแทนเพื่อแสดงชื่อคอนเทนเนอร์ทั้งหมดและที่อยู่ IP ของพวกเขา:

alias docker-ips='docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect $name | grep IPAddress | cut -d \" -f 4; done'

1
ที่สามารถลดความซับซ้อนได้เล็กน้อย - ใช้docker ps -qเพื่อหลีกเลี่ยงtailและ--formatเพื่อหลีกเลี่ยง grep นอกจากนี้คุณสามารถส่ง ID คอนเทนเนอร์จำนวนdocker inspectมากไปยังแทนที่จะวนซ้ำในเชลล์
ไบรอัน

1
docker ps -qแสดงเฉพาะรหัสตัวเลขของคอนเทนเนอร์ แต่ฉันคิดว่าการใช้ชื่อของพวกเขาดีกว่า tailเป็นเพียงการกำจัดบรรทัดแรก (ส่วนหัวของตาราง) และยังจำเป็น ฉันสามารถใช้--formatแม้ว่า: docker ps | tail -n +2 | while read -a a; do name=${a[$((${#a[@]}-1))]}; echo -ne "$name\t"; docker inspect --format="{{.NetworkSettings.IPAddress}}" $name | cut -d \" -f 4; done. แต่นั่นไม่ได้เป็นการปรับปรุงที่ยิ่งใหญ่ ... grepIMO ที่อ่านได้ง่ายขึ้น
Marco Roy

1
เวอร์ชันที่เปลี่ยนแปลงเล็กน้อยซึ่งแสดงรายการ IP ก่อนในหนึ่งบรรทัดพร้อมกับชื่อคอนเทนเนอร์: docker ps | tail -n +2 | ในขณะที่อ่าน -aa; do name = $ {a [$ (($ {# a [@]} - 1))]}; นักเทียบท่าตรวจสอบ $ name | grep "IPAddress. * [0-9] \ +" | ตัด -d \ "-f 4 | tr" \ n "" "; echo -e" \ t $ {name} "; เสร็จแล้ว
Gilead

จบลงด้วย:docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
antogerva

9

ฉันใช้วิธีง่าย ๆ นี้

docker exec -it <container id or name> hostname -i

เช่น

ubuntu@myhost:~$ docker exec -it 3d618ac670fe hostname -i
10.0.1.5

7

หากคุณติดตั้ง Docker โดยใช้ Docker Toolbox คุณสามารถใช้แอพพลิเคชั่น Kitematic เพื่อรับที่อยู่ IP ของคอนเทนเนอร์:

  1. เลือกภาชนะ
  2. คลิกที่การตั้งค่า
  3. คลิกในแท็บพอร์ต

สำหรับฉันที่อยู่ IP อยู่บนแท็บ "ชื่อโฮสต์ / พอร์ต" แต่นี่เป็นคำตอบที่เป็นประโยชน์มาก! โปรดทราบว่าdocker inspectจะไม่ทำงานเมื่อคุณเรียกใช้กล่องเครื่องมือนักเทียบท่า จะรายงานที่อยู่ IP แต่ไม่ใช่ที่อยู่ที่ถูกต้องที่บริการของคุณจะใช้
Göran Roseen

7

ในการรับที่อยู่ IP และโฮสต์พอร์ตของคอนเทนเนอร์:

docker inspect containerId | awk '/IPAddress/ || /HostPort/'

เอาท์พุท:

    "HostPort": "4200"
                    "HostPort": "4200"
        "SecondaryIPAddresses": null,
        "IPAddress": "172.17.0.2",
                "IPAddress": "172.17.0.2",

7

บันทึก!!! สำหรับนักเทียบท่าการใช้งานเขียน:

เนื่องจาก Docker Compose สร้างเครือข่ายแยกสำหรับแต่ละคลัสเตอร์วิธีการด้านล่างจึงไม่สามารถใช้งานdocker-composeได้


วิธีที่ง่ายและสง่างามที่สุดคือการกำหนดฟังก์ชั่นของเชลล์ซึ่งปัจจุบันเป็นคำตอบที่ได้รับการโหวตมากที่สุด@ WouterD's :

dockip() {
  docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}

นักเทียบท่าสามารถเขียนคอนเทนเนอร์ ID ไปยังไฟล์เช่นโปรแกรม Linux:

ทำงานด้วย--cidfile=filenameDocker ทิ้ง ID ของคอนเทนเนอร์ไปที่ "ชื่อไฟล์"

โปรดดูข้อมูลเพิ่มเติมที่ " นักเทียบท่าทำงาน PID ที่เทียบเท่า "

--cidfile="app.cid": Write the container ID to the file

ใช้ไฟล์ PID:

  1. ใช้คอนเทนเนอร์ด้วย--cidfileพารามิเตอร์app.cidเนื้อหาไฟล์เป็นดังนี้:

    a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
    
  2. คุณสามารถใช้เนื้อหาไฟล์เพื่อตรวจสอบคอนเทนเนอร์ Docker:

    blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
    
  3. คุณสามารถแตก IP คอนเทนเนอร์ได้โดยใช้สคริปต์ Python แบบอินไลน์:

    $ 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'])

ดู " ทางเลือก 10 ทางในการรับที่อยู่ IP ของนักเทียบท่าคอนเทนเนอร์ " สำหรับข้อมูลเพิ่มเติม



5

สิ่งนี้จะแสดงรายการ IP ของคอนเทนเนอร์ทั้งหมดบนโฮสต์:

sudo docker ps -aq | while read line;  do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done

5

นักเทียบท่าตรวจสอบการใช้งานเพื่อพิมพ์ IPS ของคอนเทนเนอร์และชื่อที่เกี่ยวข้อง

docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'

5

เพียงเพื่อความสมบูรณ์:

ฉันชอบ--formatตัวเลือกจริงๆแต่ในตอนแรกฉันไม่รู้ตัวดังนั้นฉันจึงใช้ Python One-Liner แบบง่าย ๆ เพื่อให้ได้ผลลัพธ์เดียวกัน:

docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'

นี่คือคำตอบที่เจ๋งที่สุด ดูคำตอบอื่น - stackoverflow.com/a/36306632/432903
prayagupd

5

การรวมคำตอบก่อนหน้านี้กับการค้นหา ID คอนเทนเนอร์ตามชื่ออิมเมจ Docker:

docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`

4

ใช้:

docker inspect $CID | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1

นี่คือคำสั่งที่เหมาะสมสำหรับบรรทัดเดียวจริง นี่คือสิ่งที่ฉันได้รับ $ docker inspect c4591485328d | grep IPAddress | grep -v null| cut -d '"' -f 4 | head -1 172.17.0.2
Jayant Bhawal

4

สำหรับคอนเทนเนอร์ Windows ให้ใช้

docker exec <container> ipconfig

ที่<container>ใดชื่อหรือรหัสของภาชนะ

คุณสามารถใช้docker psเพื่อค้นหารหัสของภาชนะ


อย่าลืมใช้“ --rm” ไม่เช่นนั้นมันจะกินพื้นที่ฮาร์ดไดรฟ์อย่างช้าๆด้วยเลเยอร์ที่ไม่ถูกลบ เป็นการดีที่จะจับคู่“ —rm” กับ“ run” ในเกือบทุกกรณี
Contango

@Contango: 'นักเทียบท่า exec' ดำเนินการคำสั่งในคอนเทนเนอร์ที่รันอยู่แล้ว มันไม่มีสวิตช์ --rm docs.docker.com/engine/reference/commandline/exec
kirodge

4

หากคุณลืม ID คอนเทนเนอร์หรือไม่ต้องการจัดการกับคำสั่งเชลล์จะดีกว่าถ้าใช้ UI เช่น Portainer

https://portainer.io/

$ docker volume create portainer_data
$ docker run -d -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock -v portainer_data:/data portainer/portainer

มีคุณสามารถค้นหาข้อมูลทั้งหมดเกี่ยวกับคอนเทนเนอร์ด้วย IP


4
ในขณะที่ลิงก์นี้อาจตอบคำถาม แต่ลิงก์เพียงคำตอบนั้นไม่ได้รับการสนับสนุนใน Stack Overflow คุณสามารถปรับปรุงคำตอบนี้ได้โดยนำส่วนที่สำคัญของลิงก์และใส่ลงในคำตอบของคุณทำให้แน่ใจว่าคำตอบของคุณยังคงเป็นคำตอบ หรือลบ :)
WhatsThePoint
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.