Saya bereksperimen dengan Dockerfiles, dan saya pikir saya mengerti sebagian besar logika. Namun, saya tidak melihat perbedaan antara "mengekspos" dan "menerbitkan" port dalam konteks ini.
Semua tutorial yang telah saya lihat pertama-tama termasuk EXPOSE
perintah di Dockerfile:
...
EXPOSE 8080
...
Mereka kemudian membangun gambar dari Dockerfile ini:
$ docker build -t an_image - < Dockerfile
Dan kemudian terbitkan port yang sama seperti di atas saat menjalankan gambar:
$ docker run -d -p 8080 an_image
atau terbitkan semua port menggunakan
$ docker run -d -P an_image
Apa gunanya mengekspos port di Dockerfile, jika tetap akan dipublikasikan? Apakah akan ada kebutuhan untuk mengekspos port terlebih dahulu, dan tidak mempublikasikannya nanti? Secara efektif, saya ingin menentukan semua port yang akan saya gunakan di Dockerfile saat membuat gambar, dan kemudian tidak repot dengan mereka lagi, menjalankannya hanya dengan:
$ docker run -d an_image
Apakah ini mungkin?
EXPOSE
dan-p
dan bukan tiga poin-poin precedented. Membuat saya sedikit bingung.EXPOSE
, tapi Anda tidak menentukan-p
. Ini pemahaman saya bahwa jika Anda selalu menggunakan-p
dan menjalankan masing-masing wadah makaEXPOSE
tidak masalah untuk dihilangkan, tetapi itu menjadi berguna / perlu saat menggunakan-P
atau--link
. (Dan karena Anda tidak tahu bagaimana orang lain akan menggunakan gambar Anda,EXPOSE
harus ditentukan dalam gambar publik apa pun.)Jawaban singkat:
EXPOSE
adalah cara mendokumentasikan--publish
(atau-p
) adalah cara pemetaan sebuah port host untuk menjalankan pelabuhan kontainerPerhatikan di bawah ini:
EXPOSE
terkait denganDockerfiles
( mendokumentasikan )--publish
terkait dengandocker run ...
( eksekusi / run-time )Juga,
Akses layanan ketika
EXPOSE
/--publish
tidak didefinisikan:Pada jawaban @Golo Roden dinyatakan bahwa ::
Mungkin itu yang terjadi pada saat jawabannya sedang ditulis, tetapi sekarang tampaknya bahkan jika Anda tidak menggunakan
EXPOSE
atau--publish
, jaringanhost
lain dancontainers
yang sama akan dapat mengakses layanan Anda dapat mulai di dalam wadah itu.Cara menguji ini:
Saya telah menggunakan yang berikut ini
Dockerfile
. Pada dasarnya, saya mulai dengan ubuntu dan menginstal server web kecil:Saya
build
gambar sebagai "testexpose" danrun
wadah baru dengan:Di dalam wadah, saya meluncurkan beberapa contoh
mini-httpd
:Saya kemudian dapat menggunakan
curl
dari host atau wadah lain untuk mengambil halaman berandamini-httpd
.sumber
172.17.0.2
) dan semua port yang saya sebutkan. Jika Anda menggunakan Docker untuk Mac / Windows, jaringannya berbeda. Tidak adadocker0
jembatan.Lihat referensi dokumentasi resmi: https://docs.docker.com/engine/reference/builder/#expose
The
EXPOSE
memungkinkan Anda untuk menentukan swasta (container) dan publik (host) port untuk mengekspos pada gambar waktu membangun ketika wadah berjalan jika Anda menjalankan wadah dengan-P
.Port publik dan protokol bersifat opsional, jika bukan port publik yang ditentukan, port acak akan dipilih pada host oleh buruh pelabuhan untuk mengekspos pelabuhan kontainer yang ditentukan pada Dockerfile.
Praktik yang baik adalah jangan menentukan port publik, karena membatasi hanya satu kontainer per host (kontainer kedua akan membuang port yang sudah digunakan).
Anda dapat menggunakan
-p
didocker run
mengontrol apa pelabuhan umum pelabuhan kontainer terkena akan dihubungkan.Bagaimanapun, Jika Anda tidak menggunakan
EXPOSE
(dengan-P
on docker run) juga-p
, tidak ada port yang akan terbuka.Jika Anda selalu menggunakan
-p
padadocker run
Anda tidak perluEXPOSE
tetapi jika Anda menggunakanEXPOSE
Andadocker run
perintah mungkin lebih sederhana,EXPOSE
dapat berguna jika Anda tidak peduli apa pelabuhan akan mengekspos pada host, atau jika Anda yakin hanya satu kontainer akan dimuat.sumber
Anda mengekspos port menggunakan kata kunci EXPOSE di Dockerfile atau flag --expose ke run docker. Mengekspos port adalah cara mendokumentasikan port mana yang digunakan, tetapi sebenarnya tidak memetakan atau membuka port apa pun. Mengekspos port adalah opsional.
Sumber: github commit
sumber
Kebanyakan orang menggunakan buruh pelabuhan menulis dengan jaringan. The dokumentasi menyatakan:
Yang berarti bahwa jika Anda menggunakan jaringan untuk komunikasi antar wadah, Anda tidak perlu khawatir untuk mengekspos port.
sumber
EXPOSE digunakan untuk memetakan port container port lokal yaitu: jika Anda menentukan expose dalam file docker like
EXPOSE 8090
Apa yang akan dilakukan itu akan memetakan localhost port 8090 ke container port 8090
sumber