I'm sedikit pemula untuk Docker. Saya tidak't menemukan gambaran yang jelas dari apa opsi ini tidak di docker menjalankan perintah di dalam dan sedikit bingung tentang hal itu.
Kita bisa menggunakannya untuk mengakses aplikasi yang berjalan pada docker containers tanpa menentukan port? Sebagai contoh jika saya menjalankan sebuah webapp dikerahkan melalui docker gambar di port 8080 dengan menggunakan opsi -p 8080:8080
di docker menjalankan perintah, aku tahu aku akan memiliki akses pada port 8080 pada Docker containers ip /theWebAppName. Tapi aku tidak bisa benar-benar memikirkan cara bagaimana --bersih=host
pilihan bekerja.
Setelah docker instalasi anda memiliki 3 jaringan secara default:
docker network ls
NETWORK ID NAME DRIVER SCOPE
f3be8b1ef7ce bridge bridge local
fbff927877c1 host host local
023bb5940080 none null local
I'm mencoba untuk tetap sederhana ini. Jadi jika anda memulai sebuah wadah yang secara default akan dibuat di dalam jembatan (docker0) jaringan.
$ docker run -d jenkins
1498e581cdba jenkins "/bin/tini -- /usr..." 3 minutes ago Up 3 minutes 8080/tcp, 50000/tcp friendly_bell
Di dockerfile dari jenkins port 8080
dan 50000
yang terkena. Port tersebut dibuka untuk kontainer di jembatan jaringan. Sehingga segala sesuatu di dalam jembatan itu jaringan dapat mengakses kontainer di pelabuhan 8080
dan 50000
. Segala sesuatu di jembatan jaringan di swasta berbagai "Subnet": "172.17.0.0/16",
Jika anda ingin mengaksesnya dari luar anda harus memetakan port dengan -p 8080:8080
. Ini akan memetakan port kontainer ke pelabuhan real server (host jaringan). Jadi mengakses server anda pada 8080
akan rute anda bridgenetwork pada port 8080
.
Sekarang anda juga memiliki jaringan host. Yang tidak containerize wadah jaringan. Jadi jika anda memulai sebuah wadah dalam jaringan host itu akan terlihat seperti ini (itu's yang pertama):
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
1efd834949b2 jenkins "/bin/tini -- /usr..." 6 minutes ago Up 6 minutes eloquent_panini
1498e581cdba jenkins "/bin/tini -- /usr..." 10 minutes ago Up 10 minutes 8080/tcp, 50000/tcp friendly_bell
Perbedaannya adalah dengan pelabuhan. Wadah anda sekarang dalam jaringan host. Jadi jika anda membuka port 8080
pada host anda anda akan acces wadah segera.
$ sudo iptables -I INPUT 5 -p tcp -m tcp --dport 8080 -j ACCEPT
I've membuka port 8080
di firewall saya dan ketika saya'm sekarang saya akses server pada port 8080
I'm mengakses my jenkins. Saya pikir blog ini ini juga berguna untuk memahami dengan lebih baik.
The --bersih=host
pilihan ini digunakan untuk membuat program-program dalam kontainer Docker terlihat seperti mereka sedang berjalan pada host itu sendiri, dari perspektif jaringan. Hal ini memungkinkan wadah yang lebih besar akses jaringan dari biasanya dapat mendapatkan.
Biasanya anda harus meneruskan port dari host mesin ke dalam wadah, tapi ketika wadah berbagi host's jaringan, jaringan apapun kegiatan yang terjadi secara langsung pada mesin host - sama seperti itu akan jika program ini berjalan secara lokal, bukan di dalam sebuah wadah.
Sementara ini tidak berarti anda tidak lagi memiliki untuk mengekspos port dan peta mereka untuk pelabuhan kontainer, itu berarti anda harus mengedit Dockerfiles untuk mengatur port yang masing-masing wadah didengarkan, untuk menghindari konflik seperti yang anda bisa't memiliki dua wadah yang beroperasi pada saat yang sama port host. Namun, alasan sebenarnya untuk pilihan ini adalah untuk menjalankan aplikasi yang membutuhkan akses jaringan yang sulit untuk maju melalui sebuah wadah di tingkat port.
Misalnya, jika anda ingin menjalankan server DHCP maka anda perlu untuk dapat mendengarkan siaran lalu lintas pada jaringan, dan ekstrak MAC address dari packet. Informasi ini hilang selama port forwarding proses, sehingga satu-satunya cara untuk menjalankan DHCP server dalam Docker adalah untuk menjalankan wadah sebagai --bersih=host
.
Pada umumnya, --bersih=host
hanya diperlukan ketika anda sedang menjalankan program dengan sangat spesifik, tidak biasa kebutuhan jaringan.
Terakhir, dari perspektif keamanan, Docker containers dapat mendengarkan di banyak pelabuhan, meskipun mereka hanya beriklan (mengekspos) satu port. Biasanya ini baik-baik saja karena anda hanya meneruskan tunggal diharapkan pelabuhan, namun jika anda menggunakan --host=net
kemudian anda'll mendapatkan semua wadah's port mendengarkan pada tuan rumah, bahkan orang-orang yang tidak't tercantum dalam Dockerfile. Ini berarti anda akan perlu untuk memeriksa wadah erat (terutama jika itu's bukan milikmu, misalnya aplikasi yang resmi yang diberikan oleh sebuah proyek perangkat lunak) untuk memastikan anda don't secara tidak sengaja mengekspos layanan tambahan pada mesin.