GNU/Linux >> Belajar Linux >  >> Panels >> Docker

Cara Mendapatkan Alamat IP Docker Container

Ingin tahu apa alamat IP wadah buruh pelabuhan Anda yang sedang berjalan? Anda dapat memeriksa container yang sedang berjalan untuk mendapatkan informasi tersebut.

sudo docker container inspect container_name_or_ID
Tidak tahu nama atau ID wadah? Gunakan perintah sudo docker ps .

inspect perintah memberi Anda banyak detail tentang wadah yang Anda periksa. Pergi ke akhir dan lihat Networks bagian untuk mendapatkan alamat IP penampung.

Anda juga dapat menggunakan perintah grep untuk mendapatkan baris yang cocok dengan string "IPAddress".

Jangan khawatir jika wadah Anda memiliki lebih dari satu alamat IP. Itu tidak biasa. Untuk memahaminya, Anda perlu memahami bagaimana container berkomunikasi satu sama lain.

Saya akan menjelaskannya kepada Anda di bagian berikutnya diikuti dengan beberapa metode lain untuk mendapatkan alamat IP dari wadah buruh pelabuhan yang sedang berjalan.

Bagaimana wadah buruh pelabuhan berkomunikasi?

Docker adalah alat untuk mengemas dan mengirimkan perangkat lunak ke massa menggunakan teknologi containerization. Perangkat lunak dapat memiliki banyak tujuan, dari kemungkinan pemrosesan teks sederhana hingga server web lengkap, yang menampung file pribadi Anda. Masing-masing perangkat lunak ini dipecah menjadi layanan mikro dan kemudian dikemas sebagai wadah. Bergantung pada tujuan perangkat lunak, satu layanan mungkin perlu berkomunikasi dengan layanan lainnya.

Misalnya, pertimbangkan WordPress. Ada dua layanan, satu adalah server web yang melayani frontend, dan yang lainnya adalah backend, database. Frontend harus berkomunikasi dengan database, jika tidak, itu tidak akan berfungsi.

Komunikasi ini dicapai dengan memiliki setidaknya dua antarmuka jaringan yang terkait dengan masing-masing dari dua wadah ini, kedua antarmuka terhubung ke jaringan yang sama. Jaringan ini disebut "jaringan buruh pelabuhan".

Jaringan buruh pelabuhan

Pikirkan jaringan buruh pelabuhan sebagai kumpulan alamat IP yang tersedia. Jika dua kontainer mengambil alamat IP dari kumpulan yang sama, mereka akan dapat berkomunikasi satu sama lain.

Pada dasarnya ada dua jenis jaringan, jaringan default atau jaringan yang ditentukan sebelumnya dan jaringan yang ditentukan pengguna.

Anda bisa mendapatkan daftar jaringan menggunakan perintah berikut

docker network ls

Pertimbangkan daftar saya di bawah ini:

❯ docker network ls
NETWORK ID     NAME      DRIVER    SCOPE
272ff2e44dc2   bridge    bridge    local
5e4a3f5e99dd   host      host      local
cdaef1e49ddc   none      null      local

Abaikan dua yang terakhir dan fokus pada jaringan pertama. bridge network adalah jaringan default yang akan disambungkan ke setiap wadah jika tidak ada yang ditentukan secara eksplisit. Anda bisa mendapatkan detail lebih lanjut tentang jaringan ini dengan menjalankan docker network inspect bridge memerintah.

Saya akan memfilter hasilnya karena untuk demonstrasi ini saya tidak memerlukan semua data yang inspect akan meledak.

❯ docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Subnet
172.17.0.0/16
Jika Anda belum menginstal jq, silakan instal menggunakan manajer paket distribusi Anda.

Masing-masing jaringan buruh pelabuhan ini memiliki subnet, dalam kasus bridge jaringan, subnet ini adalah 172.17.0.0/16. Ini berarti ada total 65.534 - 1 =65.533 host atau alamat IP yang dapat digunakan. Saya mengurangi satu karena 172.17.0.1 dialokasikan untuk gateway. Anda dapat melihatnya juga menggunakan perintah berikut

docker network inspect -f '{{json .IPAM.Config}}' bridge | jq -r .[].Gateway

Memeriksa alamat IP wadah buruh pelabuhan Anda

Ada beberapa cara untuk memeriksa alamat IP yang terkait dengan penampung Anda, berikut adalah daftar semuanya termasuk contoh perintah.

Metode 1:Dengan memeriksa wadah

inspect sub-perintah buruh pelabuhan sangat membantu. Sebuah container dapat diperiksa menggunakan docker container inspect [CONTAINER ID]|[CONTAINER NAME] memerintah.

Memeriksa container berarti mendapatkan informasi sebanyak mungkin tentang container, dari port, variabel lingkungan hingga titik mount, data cgroup, dll. Alamat IP dapat diekstraksi darinya.

Jika Anda menjalankan inspect perintah pada wadah, Anda akan mendapatkan banyak informasi, dalam format JSON. Gulir ke bawah hingga Anda menemukan kunci NetworkSettings , di sana cari sub-kunci IPAddress . Itu alamat IP penampung Anda.

Perintah untuk mengeksekusi terlihat seperti berikut

docker container inspect [CONTAINER ID]|[CONTAINER NAME]

Ini hasil saya (terpotong)

> docker container inspect ubuntu-ip
.
.
.
"NetworkSettings": {
.
.
.
            "IPAddress": "172.17.0.2",
.
.
.

Alih-alih menggulir semua itu, Anda dapat memfilter output seperti ini:

docker container inspect -f '{{ .NetworkSettings.IPAddress }}' CONTAINER_ID_OR_NAME

Berikut adalah keluaran yang difilter:

❯ docker container inspect -f '{{ .NetworkSettings.IPAddress }}' ubuntu-ip 
172.17.0.2

Jika Anda ingin mendapatkan alamat IP yang terkait dengan jaringan tertentu, gunakan perintah seperti berikut

docker container inspect -f '{{ .NetworkSettings.Networks.[NETWORK NAME].IPAddress }}' CONTAINER_ID_OR_NAME

Contoh keluaran:

❯ docker container inspect -f '{{ .NetworkSettings.Networks.bridge.IPAddress }}' ubuntu-ip 
172.17.0.2

metode 2:Menggunakan cangkang penampung

Ini adalah metode yang paling mudah, tetapi juga sesuatu yang tidak saya rekomendasikan .

Dalam metode ini, Anda melampirkan stdin|stdout Anda dengan wadah dan menjalankan ip perintah (atau perintah lain yang menunjukkan alamat IP yang terkait dengan NIC).

Alasan saya tidak menyarankan ini adalah karena banyak gambar yang cukup ringan, dan tidak mengandung ip perintah (atau yang serupa).

Ambil ubuntu:20.04 gambar sebagai contoh, buat container seperti berikut

docker run --rm --name ubuntu-ip -d ubuntu:20.04 sleep 1d

Agar wadah tetap berjalan, saya menggunakan sleep 1d perintah.

Sekarang mulai proses shell di dalam wadah dan lampirkan stdin|stdout Anda seperti itu

docker exec -ti ubuntu-ip sh

Setelah Anda berada di wadah ini, coba jalankan ip atau ifconfig . Anda akan melihat sesuatu seperti berikut:

❯ docker exec -ti ubuntu-ip sh
# ip
sh: 1: ip: not found
# ifconfig
sh: 2: ifconfig: not found

Agar perintah tersebut berfungsi, Anda perlu menginstal paket yang relevan. Untuk mendapatkan ip perintah, instal iproute2 paket dan jalankan kembali perintah sebagai ip a

# apt update -qq                                       
6 packages can be upgraded. Run 'apt list --upgradable' to see them.
# apt install iproute2 -yqq
# ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
4: [email protected]: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default 
    link/ether 02:42:ac:11:00:02 brd ff:ff:ff:ff:ff:ff link-netnsid 0
    inet 172.17.0.2/16 brd 172.17.255.255 scope global eth0
       valid_lft forever preferred_lft forever

Sekarang Anda dapat melihat alamat IP yang terkait dengan kartu [email protected] menjadi 172.17.0.2.

Perhatikan jaringan tempat penampung ini berada. Karena saya tidak membuat dan menghubungkan jaringan yang ditentukan pengguna ke wadah ini, itu terhubung ke jaringan jembatan, itulah sebabnya jaringan IP ini adalah 172.17.0.0

Metode ini pasti berhasil, meskipun lebih berhasil dan tidak terlalu dapat direproduksi, ini intuitif. Metode selanjutnya harus jauh lebih baik dibandingkan dengan yang ini.

Metode 3:Dengan memeriksa jaringan itu sendiri

Setiap kali sebuah wadah terhubung ke jaringan, wadah yang terhubung itu juga terlihat dari jaringan, bersama dengan alamat IP yang dialokasikan untuk wadah tersebut.

Karena wadah saya terhubung ke jaringan jembatan, saya dapat memeriksa jaringan dengan perintah berikut

docker network inspect [NETWORK NAME][NETWORK ID]

Di sini alih-alih id, saya akan menggunakan nama, bridge

docker network inspect bridge

Alih-alih menggulir ke bawah ke Containers bagian, saya akan menggunakan jq untuk menyaring keluaran kali ini.

❯ docker network inspect bridge | jq .[].Containers
{
  "1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba": {
    "Name": "ubuntu-ip",
    "EndpointID": "44d6b85348d6274b4ee779f9d3617d184ccfd3bad228ee652141d9b4157c50ae",
    "MacAddress": "02:42:ac:11:00:02",
    "IPv4Address": "172.17.0.2/16",
    "IPv6Address": ""
  },
  "50a4f195d8eae6b6b714e8aa058c6058dbe91d0a272c8ca826d4442df1c63885": {
    "Name": "ip",
    "EndpointID": "d4e72a4df81ee7023386df9d96676d9c291e2902349eb453338b8e0145a610fd",
    "MacAddress": "02:42:ac:11:00:03",
    "IPv4Address": "172.17.0.3/16",
    "IPv6Address": ""
  }
}

Untuk mendemonstrasikan ini, saya menggunakan wadah lain dengan nama ip . Anda dapat melihat wadah dan alamat IP di objek JSON di atas. Sekarang mengekstrak IP wadah tertentu sedikit lebih sulit di sini.

Jika Anda mengetahui id wadah, Anda dapat menggunakan jq seperti ini

docker network inspect bridge | jq '.[].Containers."[CONTAINER ID]".IPv4Address'

Ini contohnya

❯ docker network inspect bridge | jq '.[].Containers."1c76f35ce42ca0d31cfcc79da80eadfa4f69cb82e292e249ee1bd75d83a8e4ba".IPv4Address' -r
172.17.0.2/16

Sebagian besar waktu Anda tidak dapat mengingat id wadah, jadi jika Anda ingin mendapatkan IP hanya dari nama wadah, Anda memerlukan pengetahuan tentang jq (atau cukup gunakan kembali perintah berikut).

docker network inspect -f '{{json .Containers}}' bridge | \
    jq '..|if type == "object" and has("Name") then select(.Name=="[CONTAINER NAME]") | .IPv4Address else empty end' -r

Tempatkan nama container di select berfungsi dan lihat keajaiban terjadi.

❯ docker network inspect -f '{{json .Containers}}' bridge | \
    jq '..|if type == "object" and has("Name") then select(.Name=="ubuntu-ip") | .IPv4Address else empty end' -r

172.17.0.2/16

Metode mana yang Anda sukai? Metode 1 mungkin

Itulah semua metode di mana Anda bisa mendapatkan alamat IP dari wadah buruh pelabuhan. Metode kedua meskipun intuitif tidak dapat direproduksi. Sebagian besar waktu itu adalah metode pertama yang digunakan karena ini yang paling mudah dan menyelesaikan pekerjaan.

Tetapi mungkin ada saatnya ketika Anda ingin memeriksa beberapa wadah yang terhubung ke jaringan tertentu dan mendapatkan alamat IP di jaringan itu. Dalam hal ini, memeriksa jaringan dan mendapatkan IP masuk akal. Anda bisa mendapatkan semua nama kontainer dan IP yang dialokasikan untuk mereka dari jaringan seperti ini

❯ docker network inspect -f '{{json .Containers}}' bridge | \
    jq '.. | if type=="object" and has("Name") then {(.Name): .IPv4Address} else empty end'

{
  "ubuntu-ip": "172.17.0.2/16"
}
{
  "ip": "172.17.0.3/16"
}

Ubah bridge ke beberapa jaringan lain, dan Anda akan mendapatkan semua container dan alamat IP-nya seperti ini.

Itu saja untuk hari ini. Saya harap artikel ini bermanfaat bagi Anda. Jika Anda memiliki pertanyaan, beri tahu saya di komentar di bawah.


Docker
  1. Cara Menjalankan MySQL Dalam Wadah Docker

  2. Cara SSH Ke Wadah Docker

  3. Cara Menginstal Vim di Wadah Docker

  1. Cara menginstal WordPress menggunakan Docker

  2. Bagaimana Cara Menjalankan Program Di Dalam Wadah Docker?

  3. Cara Mengakses Namespace Jaringan Docker Container dari Host

  1. Cara Menjalankan Perintah di Running Docker Container

  2. Cara Menetapkan IP Statis ke Wadah Docker

  3. Cara Mendaftar Kontainer Docker