Mengapa menggunakan EXPOSE di Dockerfile - karena Anda dapat mengikat ke semua port

23

Saya bisa docker run -p 3000:3000 image tanpa EXPOSE memasukkan port itu ke dalam wadah (lihat di bawah). Jika itu benar, lalu mengapa repot-repot menempatkan EXPOSE di Dockerfile? Apakah hanya untuk komunikasi dengan pengguna gambar? Karena saya tidak tahu alasan fungsional untuk MENGUNGKAPKAN port jika semuanya dapat diikat.


Berikut adalah langkah-langkah yang menunjukkan saya mengikat ke port dalam wadah meskipun faktanya itu bukan EXPOSEd

$ cat Dockerfile
FROM alpine
RUN apk add nodejs npm vim
COPY webserver /webserver
CMD [ "node", "/webserver/index.js" ]


$ docker build .
Sending build context to Docker daemon  1.931MB
Step 1/4 : FROM alpine
 ---> 11cd0b38bc3c
Step 2/4 : RUN apk add nodejs npm vim
 ---> Using cache
 ---> 4270f8bdb201
Step 3/4 : COPY webserver /webserver
 ---> Using cache
 ---> 67f4cda61ff0
Step 4/4 : CMD [ "node", "/webserver/index.js" ]
 ---> Using cache
 ---> 1df8f9024b85
Successfully built 1df8f9024b85


$ curl localhost:4400
curl: (7) Failed to connect to localhost port 4400: Connection refused


$ docker run -d -p 4400:3000 1df8f9024b85
7d0e6c56f8ad8827fe72830a30c1aac96821104b8ea111291ca39e6536aad8fd


$ curl localhost:4400
Hello World!


$
Alexander Bird
sumber

Jawaban:

29

Dokumentasi EXPOSE Docker membahas titik khusus ini:

The EXPOSEinstruksi tidak benar-benar mempublikasikan pelabuhan. Ini berfungsi sebagai jenis dokumentasi antara orang yang membangun gambar dan orang yang menjalankan wadah, tentang port mana yang dimaksudkan untuk dipublikasikan. Untuk benar-benar menerbitkan port saat menjalankan wadah, gunakan -pbendera docker rununtuk mempublikasikan dan memetakan satu atau beberapa port, atau -Pbendera untuk menerbitkan semua port yang terbuka dan memetakannya ke port tingkat tinggi.

Perhatikan kalimat terakhir, jika Anda mengekspos banyak port maka -Pmenjadi berguna untuk menghindari pengaturan multipel -ppada baris perintah.

Tensibai
sumber
"Dokumentasi" adalah dalam bentuk metadata gambar. Selain berguna untuk -Pflag, utilitas lain dapat meminta wadah yang sedang berjalan untuk metadata ini, yang berguna dalam proksi yang secara dinamis memperbarui aturan penerusannya menggunakan port yang terbuka ini sebagai default.
BMitch
@Bitch tentu saja, saya merasa itu adalah informasi asing yang belum berguna untuk OP, tetapi jangan ragu untuk mengeditnya.
Tensibai
EXPOSE adalah dokumentasi
井上 智 文
4

Ini dilakukan demi otomatisasi. Anda dapat memiliki perintah universal yang dijalankan docker run -Puntuk memulai wadah dan Dockerfile sendiri digunakan untuk menentukan wadah mana yang mengekspos port mana. Jika Anda berurusan dengan puluhan atau ratusan kontainer yang sedang dibangun melalui pipa, ini cukup berguna. Melewati detail eksternal yang tidak terkandung dalam Dockerfile bersama-sama dengan wadah melalui pipa dari tahap ke tahap cukup sulit pada skala.

Jiri Klouda
sumber