Qual è la differenza tra EXPOSE una port dal file dockerfile con le porzioni di mapping quando si esegue un contenitore?

So che posso esporre una port (ad es. 8888) nel file dockerfile. Con questo file dockerfile posso build un'image, quindi docker run --name container1 -p 8888:8888 image run docker run --name container1 -p 8888:8888 image . Con questo metodo posso accedere alla port 8888 nel contenitore.

Il secondo modo non esporre alcuna port dal file dockerfile. Con questo file dockerfile posso build image2, quindi eseguire docker run --name container2 -p 8888:8888 image2 .

Voglio chiedere quale sia la differenza tra loro?

Trovo qualcosa di strano.

Nel container1 ho eseguito il jupyter notebook --port 8888 . Posso entrambi accedere alla port 8888 dall'host che gestisce il contenitore ( localhost:8888 ) e il computer ( hostip:8888 ) nella stessa networking locale

In container2 ho eseguito il jupyter notebook --port 8888 . Posso accedere alla port 8888 dall'host che gestisce il contenitore ( localhost:8888 ), ma non posso accedere alla port 8888 via hostip:8888 dal computer nella stessa networking locale.