Apa perbedaan antara port docker-compose vs expose

461

Apa perbedaan antara portsdan exposeopsi didocker-compose.yml

bibstha
sumber

Jawaban:

527

Menurut referensi buruh pelabuhan ,

Port didefinisikan sebagai:

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

Paparan didefinisikan sebagai:

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
bibstha
sumber
24
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 :

  1. 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.
  2. Lebih dari satu port dapat ditentukan (itu sebabnya port bukan port)

masukkan deskripsi gambar di sini

mengekspos :

  1. Aktifkan wadah untuk mendengarkan port tertentu hanya dari dunia di dalam docker DAN bukan dunia yang dapat diakses di luar docker.
  2. Lebih dari satu port dapat ditentukan

masukkan deskripsi gambar di sini

Mehraj Malik
sumber
3
Perhatikan bahwa paparan memungkinkan beberapa port - docs.docker.com/compose/compose-file/#expose - namun Anda hanya memasok port internal daripada internal + eksternal
Stuart Moore
Tapi apa yang harus dilakukan jika saya ingin mengakses dunia luar dari wadah saya? stackoverflow.com/questions/61322256/…
gstackoverflow
26

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

sorabzone
sumber
19

Pelabuhan

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.

BMitch
sumber
3

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.

medTech
sumber