Có lệnh nào tôi có thể chạy để lấy địa chỉ IP của bộ chứa ngay từ máy chủ sau khi bộ chứa mới được tạo không?
Về cơ bản, một khi Docker tạo ra container, tôi muốn cuộn các kịch bản cấu hình chứa và triển khai mã của riêng mình.
Có lệnh nào tôi có thể chạy để lấy địa chỉ IP của bộ chứa ngay từ máy chủ sau khi bộ chứa mới được tạo không?
Về cơ bản, một khi Docker tạo ra container, tôi muốn cuộn các kịch bản cấu hình chứa và triển khai mã của riêng mình.
Câu trả lời:
Các --format
tùy chọn inspect
đến để giải cứu.
Cú pháp máy khách Docker hiện đại là:
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_name_or_id
Cú pháp máy khách Docker cũ là:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' container_name_or_id
Các lệnh này sẽ trả về địa chỉ IP của Docker.
Như đã đề cập trong các bình luận: nếu bạn đang ở trên Windows, hãy sử dụng dấu ngoặc kép "
thay vì dấu ngoặc đơn '
xung quanh dấu ngoặc nhọn.
<no value>
phản hồi trên máy Mac bằng Fig / Boot2Docker
<no value>
nếu bạn cố chạy cái này với một container không chạy. Hãy chắc chắn rằng container của bạn đang chạy trước khi bạn làm điều này.
{{ .NetworkSettings.Networks.$network.IPAddress }}
. Mặc định có vẻ là cầu nối, nhưng trong phần soạn thảo docker, đây sẽ là một tên cụ thể phụ thuộc vào tên ứng dụng của bạn (tôi nghĩ từ cờ --project-name, mặc dù điều đó cũng sẽ phụ thuộc vào loại cấu hình mạng bạn đã thiết lập). Tôi đã viết một câu trả lời đầy đủ trong một câu trả lời ở đây stackoverflow.com/questions/17157721/ cấp
Bạn có thể sử dụng docker inspect <container id>
.
Ví dụ:
CID=$(docker run -d -p 4321 base nc -lk 4321);
docker inspect $CID
docker inspect $CID | grep IPAddress | cut -d '"' -f 4
, nó hoạt động tốt :)
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'
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
docker inspect -format '{{ .NetworkSettings.IPAddress }}' ${CID}
là cú pháp mới. -format
bị phản đối, nó trở thành --format
.
Đầu tiên lấy ID container:
docker ps
(Cột đầu tiên dành cho ID container)
Sử dụng ID container để chạy:
docker inspect <container ID>
Ở phía dưới, bên dưới "Cài đặt mạng", bạn có thể tìm thấy "IPAddress"
Hoặc chỉ cần làm:
docker inspect <container id> | grep "IPAddress"
docker run -it MYCONTAINER /bin/bash
), đầu ra của inspect
không có phần NetworkSettings
!
docker network inspect bridge | grep Gateway | grep -o -E '[0-9.]+'
... | grep IP
giải pháp cho tất cả các chi tiết định dạng cần thiết để có IP. +1
docker run -it MYIMAGE
(đó không phải là tên container ); nếu bạn làm docker inspect MYIMAGE
bạn sẽ nhận được thông tin tĩnh về hình ảnh . Bạn cần tìm tên của container đang chạy (hoặc sử dụng id của nó như những người khác đề xuất). Trên hệ thống của tôi, thùng chứa đầu tiên như vậy được tạo từ hình ảnh đó mặc định đặt tên MYIMAGE_1
, docker inspect MYIMAGE_1
NetworkSinstall cũng vậy .
docker inspect CONTAINER_ID | grep "IPAddress"
Bạn có thể thêm -i
vào grep để bỏ qua trường hợp sau đó ngay cả những điều sau đây sẽ hoạt động:
docker inspect CONTAINER_ID | grep -i "IPaDDreSS"
Để có được tất cả các tên container và địa chỉ IP của chúng chỉ bằng một lệnh duy nhất.
docker inspect -f '{{.Name}} - {{.NetworkSettings.IPAddress }}' $(docker ps -aq)
Nếu bạn đang sử dụng docker-compose
lệnh sẽ là:
docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
Đầu ra sẽ là:
/containerA - 172.17.0.4
/containerB - 172.17.0.3
/containerC - 172.17.0.2
{{.NetworkSettings.IPAddress }}
thành{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}
docker inspect --format '{{ .NetworkSettings.IPAddress }}' $(docker ps -aq | xargs) | sed -e '/^$/d'
. Loại sed(1)
bỏ các dòng trống cho các container hiện diện, nhưng không có địa chỉ IP.
Thêm tập lệnh shell này trong ~/.bashrc
tập tin của bạn hoặc có liên quan:
docker-ip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Sau đó, để có được địa chỉ IP của một container, chỉ cần làm điều này:
docker-ip YOUR_CONTAINER_ID
Đối với phiên bản mới của Docker, vui lòng sử dụng như sau:
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
Template parsing error: template: :1:19: executing "" at <.NetworkSettings.IPA...>: map has no entry for key "NetworkSettings"
source ~/.bash_profile
Trong Docker 1.3+, bạn cũng có thể kiểm tra nó bằng cách sử dụng:
Nhập Docker đang chạy (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
Cho cửa sổ:
docker exec [container-id or container-name] ipconfig
docker exec [container-name-or-id] ip a
docker exec [container-id or container-name] ipconfig
Kể từ phiên bản Docker 1.10.3, hãy xây dựng 20f81dd
Trừ khi bạn nói với Docker nếu không, Docker luôn khởi chạy các container của bạn trong mạng cầu. Vì vậy, bạn có thể thử lệnh này dưới đây:
docker network inspect bridge
Sau đó sẽ trả về phần Container sẽ hiển thị địa chỉ IP cho vùng chứa đang chạy đó.
[
{
"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"
}
}
]
Hành hình:
docker ps -a
Điều này sẽ hiển thị hình ảnh docker hoạt động:
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
3b733ae18c1c parzee/database "/usr/lib/postgresql/" 6 minutes ago Up 6 minutes 5432/tcp serene_babbage
Sử dụng giá trị ID CONTAINER:
docker inspect <CONTAINER ID> | grep -w "IPAddress" | awk '{ print $2 }' | head -n 1 | cut -d "," -f1
"172,17.0.2"
Dựa trên một số câu trả lời tôi yêu thích, tôi quyết định hợp nhất chúng thành một hàm để lấy tất cả các địa chỉ IP và một địa chỉ khác cho một vùng chứa cụ thể. Bây giờ họ đang ở trong .bashrc
tập tin của tôi .
docker-ips() {
docker inspect --format='{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $(docker ps -aq)
}
docker-ip() {
docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' "$@"
}
Lệnh đầu tiên cung cấp địa chỉ IP của tất cả các container và thứ hai là địa chỉ IP của một container cụ thể.
docker-ips
docker-ip YOUR_CONTAINER_ID
Container tham chiếu theo tên:
docker run ... --name pg-master
Sau đó lấy địa chỉ IP theo tên:
MASTER_HOST=$(docker inspect --format '{{ .NetworkSettings.IPAddress }}' pg-master)
Tôi đã viết tập lệnh Bash sau để lấy bảng địa chỉ IP từ tất cả các container đang chạy bên dưới 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
}
Bạn nên thay đổi mạng biến thành tên mạng của riêng bạn.
Đây là một câu trả lời nhanh chóng:
Nhận tên hoặc ID container của bạn:
docker container ls
Sau đó lấy IP:
docker inspect <container_ID Or container_name> |grep 'IPAddress'
Nhận cổng:
docker inspect <container_ID Or container_name> |grep 'Port'
Docker được viết bằng Go và nó cũng sử dụng cú pháp Go cho mục đích truy vấn.
Để kiểm tra địa chỉ IP của một container cụ thể, bạn cần chạy lệnh ( -f
cho "định dạng"):
docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' container_id_or_name
Đối với ID hoặc tên container, bạn có thể chạy lệnh
docker container ls
trong đó sẽ liệt kê mọi container đang chạy.
Đây là một giải pháp mà tôi đã phát triển ngày nay trong Python, sử dụng docker inspect container
đầu ra JSON làm nguồn dữ liệu.
Tôi có rất nhiều container và cơ sở hạ tầng mà tôi phải kiểm tra, và tôi cần lấy thông tin mạng cơ bản từ bất kỳ container nào, một cách nhanh chóng và đẹp . Đó là lý do tại sao tôi thực hiện kịch bản này.
QUAN TRỌNG: Kể từ phiên bản 1.9, Docker cho phép bạn tạo nhiều mạng và gắn chúng vào các thùng chứa.
#!/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'])
Đầu ra là:
$ 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 inspect --format '{{ .NetworkSettings.IPAddress }}' <containername or containerID here>
Các công việc trên nếu container được triển khai vào mạng cầu mặc định.
Tuy nhiên, nếu sử dụng mạng cầu tùy chỉnh hoặc mạng lớp phủ, tôi thấy các cách bên dưới để hoạt động tốt hơn:
docker exec <containername or containerID here> /sbin/ifconfig eth0 | grep 'inet addr:' | cut -d: -f2 | awk '{ print $1}'
Để mở rộng câu trả lời ko-dos ', đây là bí danh để liệt kê tất cả tên container và địa chỉ IP của chúng:
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'
docker ps -q
để tránh tail
và --format
tránh grep. Ngoài ra, bạn có thể chuyển nhiều ID container sang docker inspect
thay vì lặp trong shell.
docker ps -q
chỉ hiển thị ID số của container, nhưng tôi nghĩ sử dụng tên của họ là tốt hơn. tail
chỉ để thoát khỏi dòng đầu tiên (tiêu đề bảng) & vẫn cần thiết. Tôi có thể sử dụng --format
, mặc dù : 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
. Nhưng đó dường như không phải là một cải tiến lớn ... grep
IMO dễ đọc hơn.
docker inspect $cid | grep IPAddress | cut -d '"' -f 4 | tail -n 1
Nếu bạn đã cài đặt Docker bằng Docker Toolbox, bạn có thể sử dụng ứng dụng Kitical để lấy địa chỉ IP của container:
docker inspect
không hoạt động khi bạn chạy hộp công cụ docker. Nó sẽ báo cáo một địa chỉ IP, nhưng đó không phải là địa chỉ chính xác mà các dịch vụ của bạn sẽ sử dụng.
GHI CHÚ!!! cho Docker Soạn thư sử dụng:
Vì Docker Compose tạo một mạng riêng biệt cho mỗi cụm, nên các phương thức bên dưới không hoạt động docker-compose
.
Cách thanh lịch và dễ dàng nhất là xác định hàm shell, hiện là câu trả lời được bình chọn nhiều nhất @ WouterD's :
dockip() {
docker inspect --format '{{ .NetworkSettings.IPAddress }}' "$@"
}
Docker có thể ghi ID container vào một tệp như các chương trình Linux:
Chạy với --cidfile=filename
, Docker chuyển ID của container thành "tên tệp".
Xem " Docker chạy Phần tương đương PID " để biết thêm thông tin.
--cidfile="app.cid": Write the container ID to the file
Sử dụng tệp PID:
Chạy container với --cidfile
tham số, app.cid
nội dung tệp như sau:
a29ac3b9f8aebf66a1ba5989186bd620ea66f1740e9fe6524351e7ace139b909
Bạn có thể sử dụng nội dung tệp để kiểm tra các container Docker:
blog-v4 git:(develop) ✗ docker inspect `cat app.cid`
Bạn có thể trích xuất IP container bằng tập lệnh Python nội tuyến:
$ 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
Đây là một hình thức thân thiện hơn với con người:
#!/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'])
Xem " 10 lựa chọn thay thế để nhận địa chỉ IP của Docker container " để biết thêm thông tin.
Đối với cửa sổ 10:
docker inspect --format "{{ .NetworkSettings.IPAddress }}" containerId
Điều này sẽ liệt kê tất cả các IP container trên máy chủ:
sudo docker ps -aq | while read line; do sudo docker inspect -f '{{.Name}} - {{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $line ; done
Docker kiểm tra việc sử dụng để in tất cả các ips container và tên tương ứng của nó
docker ps -q | xargs -n 1 docker inspect --format '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}} {{ .Name }}' | sed 's/ \// /'
Chỉ để hoàn thiện:
Tôi thực sự thích --format
tùy chọn này, nhưng lúc đầu tôi không biết về nó nên tôi đã sử dụng một lớp lót Python đơn giản để có kết quả tương tự:
docker inspect <CONTAINER> |python -c 'import json,sys;obj=json.load(sys.stdin);print obj[0]["NetworkSettings"]["IPAddress"]'
Kết hợp các câu trả lời trước với việc tìm ID container dựa trên tên hình ảnh Docker:
docker inspect --format '{{ .NetworkSettings.IPAddress }}' `docker ps | grep $IMAGE_NAME | sed 's/\|/ /' | awk '{print $1}'`
Sử dụng:
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
Đối với Windows container sử dụng
docker exec <container> ipconfig
nơi <container>
là tên hoặc id của container.
Bạn có thể sử dụng docker ps
để tìm id của container.
Nếu bạn quên ID container hoặc không muốn thao tác với các lệnh shell, tốt hơn là sử dụng UI như Portainer.
$ 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
Ở đó bạn có thể tìm thấy tất cả thông tin về container cũng IP.