Ekspos port . Tentukan kedua port (HOST: CONTAINER), atau hanya port container (port host acak akan dipilih).
Port yang disebutkan dalam docker-compose.yml akan dibagi di antara berbagai layanan yang dimulai oleh docker-compose.
Port akan diekspos ke mesin host ke port acak atau port yang diberikan.
docker-compose.ymlPenampilan saya seperti:
mysql:
image: mysql:5.7
ports:
- "3306"
Jika saya melakukannya docker-compose ps, akan terlihat seperti:
Name Command State Ports
-------------------------------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 0.0.0.0:32769->3306/tcp
mungkinkah eto menjelaskan apa keuntungan yang ada untuk menentukan exposedalam docker-compose? Sejauh yang saya tahu, Anda tidak perlu menentukan paparan untuk membuat port dapat diakses oleh layanan terkait.
Juicy
3
Bukankah seharusnya memberitahu bahwa port yang terbuka hanya akan tersedia untuk layanan di jaringan buruh pelabuhan yang sama (menghubungkan sedang diganti untuk sebagian besar bagian) ?.
meow
8
@Juicy Saya kira mirip dengan exposedi Dockerfiles: "Instruksi EXPOSE tidak benar-benar mempublikasikan port. Ini berfungsi sebagai jenis dokumentasi ..." docs.docker.com/engine/reference/builder/#expose
tsauerwein
1
Apakah Port mengabaikan pengaturan di tingkat firewall? Saya hanya memperhatikan bahwa saya tidak membuka port untuk mysql di firewall, tetapi mereka dapat diakses dari jarak jauh. Saya memiliki Ports yang diatur ke "3306: 3306" alih-alih mengekspos.
TekiusFanatikus
3
Dan ingat, jika Anda menggunakan docker-compose run, definisi pelabuhan di docker-compose.ymlyang diabaikan secara default. Baik menggunakan docker-compose upatau memberikan parameter--service-ports
Juha Untinen
177
port :
Aktifkan wadah untuk mendengarkan port tertentu dari dunia di luar buruh pelabuhan (dapat berupa mesin host yang sama atau mesin yang berbeda) DAN juga dunia yang dapat diakses di dalam buruh pelabuhan.
Lebih dari satu port dapat ditentukan (itu sebabnya port bukan port)
mengekspos :
Aktifkan wadah untuk mendengarkan port tertentu hanya dari dunia di dalam docker DAN bukan dunia yang dapat diakses di luar docker.
Ports
Bagian ini digunakan untuk menentukan pemetaan antara server host dan wadah Docker.
ports:
- 10005:80
Ini berarti aplikasi yang berjalan di dalam wadah terbuka di port 80. Tetapi sistem / entitas eksternal tidak dapat mengaksesnya, sehingga perlu dipetakan ke port server host.
Catatan: Anda harus membuka port host 10005 dan memodifikasi aturan firewall untuk memungkinkan entitas eksternal mengakses aplikasi.
Mereka bisa menggunakannya
http: // {host IP}: 10005
sesuatu seperti ini
EXPOSE
Ini khusus digunakan untuk menentukan port tempat aplikasi berjalan di dalam wadah buruh pelabuhan.
Anda dapat mendefinisikannya di dockerfile juga. Secara umum, ini adalah praktik yang baik dan banyak digunakan untuk mendefinisikan EXPOSE di dalam dockerfile karena sangat jarang ada yang menjalankannya di port lain selain port 80 default
The portsbagian akan mempublikasikan port pada host. Docker akan mengatur maju untuk port tertentu dari jaringan host ke wadah. Secara default ini diterapkan dengan proses proxy userspace ( docker-proxy) yang mendengarkan pada port pertama, dan meneruskan ke dalam wadah, yang perlu mendengarkan pada poin kedua. Jika kontainer tidak mendengarkan pada port tujuan, Anda masih akan melihat sesuatu mendengarkan pada host, tetapi koneksi ditolak jika Anda mencoba menghubungkan ke port host, dari gagal meneruskan ke dalam wadah Anda.
Catatan, wadah harus mendengarkan pada semua antarmuka jaringan karena proksi ini tidak berjalan di dalam namespace jaringan wadah dan tidak dapat mencapai 127.0.0.1 di dalam wadah. Metode IPv4 untuk itu adalah mengkonfigurasi aplikasi Anda untuk mendengarkan 0.0.0.0.
Perhatikan juga bahwa port yang diterbitkan tidak bekerja dengan arah yang berlawanan. Anda tidak dapat terhubung ke layanan di host dari wadah dengan menerbitkan port. Alih-alih, Anda akan menemukan kesalahan buruh pelabuhan saat mencoba mendengarkan port host yang sudah digunakan.
Membuka
Paparan adalah dokumentasi. Ini mengatur metadata pada gambar, dan saat dijalankan, pada wadah juga. Biasanya Anda mengkonfigurasi ini di Dockerfile dengan EXPOSEinstruksi, dan ini berfungsi sebagai dokumentasi untuk pengguna yang menjalankan gambar Anda, agar mereka tahu di port mana secara default aplikasi Anda akan mendengarkan. Saat dikonfigurasikan dengan file penulisan, metadata ini hanya diset pada wadah. Anda dapat melihat port yang terbuka saat Anda menjalankan docker inspectgambar atau wadah.
Ada beberapa alat yang mengandalkan port terbuka. Di buruh pelabuhan, -Pbendera akan mempublikasikan semua port terbuka ke port sementara pada host. Ada juga berbagai proksi terbalik yang secara default akan menggunakan port terbuka ketika mengirim lalu lintas ke aplikasi Anda jika Anda tidak secara eksplisit mengatur port container.
Selain alat-alat eksternal itu, paparan tidak berdampak sama sekali pada jaringan antar wadah. Anda hanya perlu jaringan buruh pelabuhan umum, dan menghubungkan ke port kontainer, untuk mengakses satu kontainer dari yang lain. Jika jaringan itu dibuat pengguna (mis. Bukan jaringan jembatan yang dinamai bridge), Anda dapat menggunakan DNS untuk menyambung ke wadah lain.
Saya sangat setuju dengan jawaban sebelumnya. Saya hanya ingin menyebutkan bahwa perbedaan antara mengekspos dan port adalah bagian dari konsep keamanan di buruh pelabuhan. Ini berjalan seiring dengan jaringan buruh pelabuhan. Sebagai contoh:
Bayangkan aplikasi dengan front-end web dan back-end database. Dunia luar membutuhkan akses ke front-end web (mungkin pada port 80), tetapi hanya back-end itu sendiri yang memerlukan akses ke host database dan port. Menggunakan jembatan yang ditentukan pengguna, hanya port web yang perlu dibuka, dan aplikasi basis data tidak membutuhkan port apa pun, karena web front-end dapat mencapainya di atas jembatan yang ditentukan pengguna.
Ini adalah kasus penggunaan umum ketika mengatur arsitektur jaringan di buruh pelabuhan. Jadi misalnya dalam jaringan jembatan default, bukan port yang dapat diakses dari dunia luar. Untuk itu Anda dapat membuka titik masuk dengan "port". Dengan menggunakan "mengekspos" Anda menentukan komunikasi dalam jaringan. Jika Anda ingin mengekspos port default Anda tidak perlu mendefinisikan "expose" di file docker-compose Anda.
expose
dalamdocker-compose
? Sejauh yang saya tahu, Anda tidak perlu menentukan paparan untuk membuat port dapat diakses oleh layanan terkait.expose
di Dockerfiles: "Instruksi EXPOSE tidak benar-benar mempublikasikan port. Ini berfungsi sebagai jenis dokumentasi ..." docs.docker.com/engine/reference/builder/#exposedocker-compose run
, definisi pelabuhan didocker-compose.yml
yang diabaikan secara default. Baik menggunakandocker-compose up
atau memberikan parameter--service-ports
port :
mengekspos :
sumber
Ports Bagian ini digunakan untuk menentukan pemetaan antara server host dan wadah Docker.
Ini berarti aplikasi yang berjalan di dalam wadah terbuka di port 80. Tetapi sistem / entitas eksternal tidak dapat mengaksesnya, sehingga perlu dipetakan ke port server host.
Catatan: Anda harus membuka port host 10005 dan memodifikasi aturan firewall untuk memungkinkan entitas eksternal mengakses aplikasi.
Mereka bisa menggunakannya
sesuatu seperti ini
EXPOSE Ini khusus digunakan untuk menentukan port tempat aplikasi berjalan di dalam wadah buruh pelabuhan.
Anda dapat mendefinisikannya di dockerfile juga. Secara umum, ini adalah praktik yang baik dan banyak digunakan untuk mendefinisikan EXPOSE di dalam dockerfile karena sangat jarang ada yang menjalankannya di port lain selain port 80 default
sumber
Pelabuhan
The
ports
bagian akan mempublikasikan port pada host. Docker akan mengatur maju untuk port tertentu dari jaringan host ke wadah. Secara default ini diterapkan dengan proses proxy userspace (docker-proxy
) yang mendengarkan pada port pertama, dan meneruskan ke dalam wadah, yang perlu mendengarkan pada poin kedua. Jika kontainer tidak mendengarkan pada port tujuan, Anda masih akan melihat sesuatu mendengarkan pada host, tetapi koneksi ditolak jika Anda mencoba menghubungkan ke port host, dari gagal meneruskan ke dalam wadah Anda.Catatan, wadah harus mendengarkan pada semua antarmuka jaringan karena proksi ini tidak berjalan di dalam namespace jaringan wadah dan tidak dapat mencapai 127.0.0.1 di dalam wadah. Metode IPv4 untuk itu adalah mengkonfigurasi aplikasi Anda untuk mendengarkan
0.0.0.0
.Perhatikan juga bahwa port yang diterbitkan tidak bekerja dengan arah yang berlawanan. Anda tidak dapat terhubung ke layanan di host dari wadah dengan menerbitkan port. Alih-alih, Anda akan menemukan kesalahan buruh pelabuhan saat mencoba mendengarkan port host yang sudah digunakan.
Membuka
Paparan adalah dokumentasi. Ini mengatur metadata pada gambar, dan saat dijalankan, pada wadah juga. Biasanya Anda mengkonfigurasi ini di Dockerfile dengan
EXPOSE
instruksi, dan ini berfungsi sebagai dokumentasi untuk pengguna yang menjalankan gambar Anda, agar mereka tahu di port mana secara default aplikasi Anda akan mendengarkan. Saat dikonfigurasikan dengan file penulisan, metadata ini hanya diset pada wadah. Anda dapat melihat port yang terbuka saat Anda menjalankandocker inspect
gambar atau wadah.Ada beberapa alat yang mengandalkan port terbuka. Di buruh pelabuhan,
-P
bendera akan mempublikasikan semua port terbuka ke port sementara pada host. Ada juga berbagai proksi terbalik yang secara default akan menggunakan port terbuka ketika mengirim lalu lintas ke aplikasi Anda jika Anda tidak secara eksplisit mengatur port container.Selain alat-alat eksternal itu, paparan tidak berdampak sama sekali pada jaringan antar wadah. Anda hanya perlu jaringan buruh pelabuhan umum, dan menghubungkan ke port kontainer, untuk mengakses satu kontainer dari yang lain. Jika jaringan itu dibuat pengguna (mis. Bukan jaringan jembatan yang dinamai
bridge
), Anda dapat menggunakan DNS untuk menyambung ke wadah lain.sumber
Saya sangat setuju dengan jawaban sebelumnya. Saya hanya ingin menyebutkan bahwa perbedaan antara mengekspos dan port adalah bagian dari konsep keamanan di buruh pelabuhan. Ini berjalan seiring dengan jaringan buruh pelabuhan. Sebagai contoh:
Ini adalah kasus penggunaan umum ketika mengatur arsitektur jaringan di buruh pelabuhan. Jadi misalnya dalam jaringan jembatan default, bukan port yang dapat diakses dari dunia luar. Untuk itu Anda dapat membuka titik masuk dengan "port". Dengan menggunakan "mengekspos" Anda menentukan komunikasi dalam jaringan. Jika Anda ingin mengekspos port default Anda tidak perlu mendefinisikan "expose" di file docker-compose Anda.
sumber