Jawaban:
Menurut referensi buruh pelabuhan ,
Ekspos port . Tentukan kedua port (HOST: CONTAINER), atau hanya port container (port host acak akan dipilih).
docker-compose.yml
Penampilan 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
Ekspos port tanpa mempublikasikannya ke mesin host - mereka hanya akan dapat diakses oleh layanan terkait. Hanya port internal yang dapat ditentukan.
Pelabuhan tidak terpapar ke mesin host, hanya terpapar ke layanan lain.
mysql:
image: mysql:5.7
expose:
- "3306"
Jika saya melakukannya docker-compose ps
, akan terlihat seperti:
Name Command State Ports
---------------------------------------------------------------
mysql_1 docker-entrypoint.sh mysqld Up 3306/tcp
expose
di Dockerfiles: "Instruksi EXPOSE tidak benar-benar mempublikasikan port. Ini berfungsi sebagai jenis dokumentasi ..." docs.docker.com/engine/reference/builder/#expose
docker-compose run
, definisi pelabuhan di docker-compose.yml
yang diabaikan secara default. Baik menggunakan docker-compose up
atau memberikan parameter--service-ports
port :
mengekspos :
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 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.
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 menjalankan docker 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.
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.