Jawaban singkat:
EXPOSE
adalah cara mendokumentasikan
--publish
(atau -p
) adalah cara pemetaan sebuah port host untuk menjalankan pelabuhan kontainer
Perhatikan di bawah ini:
EXPOSE
terkait dengan Dockerfiles
( mendokumentasikan )
--publish
terkait dengan docker run ...
( eksekusi / run-time )
Mengekspos dan menerbitkan porta
Di jaringan Docker, ada dua mekanisme berbeda yang secara langsung melibatkan port jaringan: mengekspos dan menerbitkan port. Ini berlaku untuk jaringan jembatan default dan jaringan jembatan yang ditentukan pengguna.
Anda mengekspos port menggunakan EXPOSE
kata kunci di Dockerfile atau --expose
flag to docker run. Mengekspos port adalah cara mendokumentasikan port mana yang digunakan, tetapi sebenarnya tidak memetakan atau membuka port apa pun . Mengekspos port adalah opsional.
Anda menerbitkan port menggunakan tanda --publish
atau --publish-all
untuk docker run
. Ini memberi tahu Docker port mana yang akan dibuka pada antarmuka jaringan wadah. Ketika port diterbitkan, port tersebut dipetakan ke port orde tinggi yang tersedia (lebih tinggi dari 30000
) pada mesin host, kecuali jika Anda menentukan port untuk dipetakan ke pada mesin host saat runtime. Anda tidak dapat menentukan port untuk memetakan pada mesin host ketika Anda membangun gambar (di Dockerfile), karena tidak ada cara untuk menjamin bahwa port akan tersedia pada mesin host di mana Anda menjalankan gambar .
dari: Jaringan kontainer Docker
Pembaruan Oktober 2019 : teks di atas tidak lagi ada dalam dokumen tetapi versi yang diarsipkan ada di sini: docs.docker.com/v17.09/engine/userguide/networking/#exposing-and-publishing-ports
Mungkin dokumentasi saat ini adalah di bawah ini:
Port yang dipublikasikan
Secara default, ketika Anda membuat sebuah wadah, itu tidak mempublikasikan port-portnya ke dunia luar. Untuk membuat port tersedia untuk layanan di luar Docker, atau ke wadah Docker yang tidak terhubung ke jaringan kontainer, gunakan bendera --publish
atau -p
. Ini menciptakan aturan firewall yang memetakan port kontainer ke port pada host Docker.
dan dapat ditemukan di sini: docs.docker.com/config/containers/container-networking/#published-ports
Juga,
MEMBUKA
... EXPOSE
Instruksi sebenarnya tidak mempublikasikan port . Fungsinya sebagai jenis dokumentasi antara orang yang membuat gambar dan orang yang menjalankan wadah, tentang port mana yang akan diterbitkan.
dari: referensi Dockerfile
Akses layanan ketika EXPOSE
/ --publish
tidak didefinisikan:
Pada jawaban @Golo Roden dinyatakan bahwa ::
"Jika Anda tidak menentukan salah satu dari itu, layanan dalam wadah tidak akan dapat diakses dari mana pun kecuali dari dalam wadah itu sendiri."
Mungkin itu yang terjadi pada saat jawabannya sedang ditulis, tetapi sekarang tampaknya bahkan jika Anda tidak menggunakan EXPOSE
atau --publish
, jaringan host
lain dan containers
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:
FROM ubuntu
RUN apt-get update && apt-get install -y mini-httpd
Saya build
gambar sebagai "testexpose" dan run
wadah baru dengan:
docker run --rm -it testexpose bash
Di dalam wadah, saya meluncurkan beberapa contoh mini-httpd
:
root@fb8f7dd1322d:/# mini_httpd -p 80
root@fb8f7dd1322d:/# mini_httpd -p 8080
root@fb8f7dd1322d:/# mini_httpd -p 8090
Saya kemudian dapat menggunakan curl
dari host atau wadah lain untuk mengambil halaman beranda mini-httpd
.