Apabila menggunakan Docker, kadangkala kita akan mendapati port kontena Docker tidak boleh berkomunikasi dengan hos. Ini mungkin disebabkan oleh beberapa sebab, seperti isu konfigurasi rangkaian, isu tetapan keselamatan, isu firewall dan banyak lagi. Dalam artikel ini, kami akan meneroka bagaimana untuk menyelesaikan masalah pelabuhan Docker tidak dapat melakukan ping dan bagaimana untuk mengelakkan perkara ini daripada berlaku.
Fahami konfigurasi rangkaian Docker
Sebelum kita mendalami penyelesaian masalah, kita perlu memahami konfigurasi rangkaian Docker. Docker mempunyai tiga mod konfigurasi rangkaian asas: jambatan, hos dan tiada. Secara lalai, Docker menggunakan mod jambatan untuk menetapkan alamat IP kepada bekas dan menyambungkan bekas ke subnet maya. Ini bermakna alamat IP bekas adalah berbeza daripada alamat IP hos.
Apabila menggunakan bekas Docker untuk komunikasi rangkaian, Terjemahan Alamat Rangkaian (NAT) diperlukan antara hos dan bekas. Ini sebenarnya merupakan langkah keselamatan yang baik kerana ia melindungi hos daripada serangan yang datang dari bekas.
Walau bagaimanapun, ini juga bermakna port dalam kontena tidak boleh berkomunikasi secara langsung dengan hos. Ini kerana port dalam bekas biasanya ditetapkan dalam subnet kontena dan pada hos, kami tidak melihat subnet ini, jadi kami tidak mempunyai akses terus ke port kontena.
Menyelesaikan masalah port Docker tidak dapat melakukan ping
Sekarang kita memahami asas konfigurasi rangkaian Docker, kita boleh mula menyelesaikan masalah port Docker tidak dapat ping.
Pertama, kita perlu menyemak alamat IP bekas Docker. Kita boleh menyenaraikan bekas yang sedang berjalan menggunakan arahan berikut:
docker ps
Selepas menyenaraikan bekas, kita boleh mendapatkan alamat IP bekas menggunakan arahan berikut:
docker inspect <container_id>
Pastikan untuk menggantikan container_id
dengan ID bekas anda sendiri.
Seterusnya, kita perlu menyemak sama ada bekas Docker menjalankan perkhidmatan yang diperlukan. Kita boleh menggunakan arahan berikut untuk mengesahkan sama ada bekas menjalankan perkhidmatan:
docker logs <container_id>
Jika kita melihat mesej yang serupa dengan "mendengar di <port>" dalam log, ini bermakna bekas itu menjalankan perkhidmatan yang sepadan.
Seterusnya, kita perlu melihat sama ada tembok api menyekat komunikasi antara hos dan bekas. Jika kami menjalankan beberapa pengedaran Linux biasa, seperti Ubuntu atau CentOS, maka firewall tersebut akan didayakan secara lalai. Untuk membenarkan komunikasi antara hos dan bekas, kita perlu membuka port untuk bekas Docker.
Berikut ialah contoh membuka port, menggunakan Ubuntu sebagai contoh:
sudo ufw allow <port>/tcp
Sila pastikan untuk menggantikan <port>
dengan port yang ingin anda buka.
Akhir sekali, kita perlu menyemak sama ada port kontena Docker dipetakan ke mesin hos. Dalam Docker, kita boleh menggunakan "port mapping" untuk memetakan port kontena ke port hos. Sebagai contoh, kita boleh memetakan port 80 dalam bekas ke port 8080 pada hos. Dengan cara ini, apabila kami mengakses hos melalui http://localhost:8080
, port 80 bekas Docker akan diakses.
Berikut ialah contoh menggunakan pilihan -p
untuk pemetaan port dalam Docker:
docker run -p 8080:80 <image_name>
Pastikan untuk menggantikan <image_name>
dengan nama imej anda sendiri.
Mencegah masalah port Docker tidak boleh ping
Selain menyelesaikan masalah port Docker yang tidak stabil yang tidak boleh ping, terdapat langkah pencegahan lain yang boleh diambil untuk memastikan bahawa Bekas Docker boleh mengendalikan komunikasi darat seperti biasa.
Pertama, kita boleh menentukan port dalam fail Docker Compose. Ini boleh mengurangkan operasi manual dengan berkesan dan memendekkan masa daripada pembangunan kepada penggunaan persekitaran pengeluaran. Berikut ialah contoh menentukan port dalam fail Docker Compose:
services: web: build: . ports: - "8080:80"
Kedua, kita boleh menggunakan mod rangkaian jambatan Docker untuk memastikan semua bekas berada pada rangkaian yang sama. Ini akan membolehkan bekas untuk berkomunikasi antara satu sama lain dan hos untuk berkomunikasi dengan bekas. Berikut ialah contoh menggunakan mod jambatan:
docker run --network=bridge <image_name>
Akhir sekali, kita boleh menentukan port yang perlu didedahkan dalam Dockerfile. Ini akan memastikan bahawa bekas Docker boleh membuka port yang betul secara automatik. Berikut ialah contoh untuk menentukan port yang perlu didedahkan dalam Dockerfile:
EXPOSE 80
Kesimpulan
Apabila menggunakan Docker, adalah perkara biasa untuk menghadapi masalah bahawa port tidak boleh ping . Walau bagaimanapun, selagi kami menguasai konfigurasi rangkaian Docker dan mengambil beberapa langkah pencegahan, kami boleh mengelakkan situasi ini daripada berlaku dan menyelesaikan masalah dalam masa. Saya harap artikel ini dapat membantu anda apabila anda menghadapi masalah bahawa port tidak boleh diping semasa menggunakan Docker.
Atas ialah kandungan terperinci Port docker tidak boleh diping. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!