2.4 容器的 IP 位置以及 Port
檢查容器的 Port
首先可以透過 docker container port
的指令來確認容器本身的 port 及本機所對應到的 port:
$ docker container run --detach --publish 80:80 --name nginx nginx # 不換行
4de98848ecca383e48ca8a02ec767... # 先啟動一個 nginx 的服務
$ docker container port nginx
80/tcp -> 0.0.0.0:80
看到 Docker 的回應中,左邊是容器本身開啟的 port 而右邊則是本機所對應的 port。
首先關於容器應該要打開什麼 port 則會到 Docker 映像檔篇 做解說,因為每一個不同的服務預設打開的 port 都是不一樣的,這邊我們先專注在右邊本機所對應的 port。
0.0.0.0 以及 127.0.0.1 在 Docker 有什麼不同?
在 docker container port
的回應中有看到 0.0.0.0:80,這是因為容器本身沒有設定 IP 位置,Docker 則會默認為 0.0.0.0,這會和一般我們在本地端開發常常使用的 127.0.0.1 ( localhost ) 不太一樣,那這個 0.0.0.0 代表的是什麼呢?
在 Docker 的世界中,127.0.0.1 意味著 這個容器本身,而不是 這台機器。
如果從一個容器向外連接到 127.0.0.1,對於容器本身來說,就像連接到自己一樣,這樣的問題常常發生在之後 Docker Compose 的章節,當容器需要互相溝通的時候,卻不小心綁定在 127.0.0.1,則沒辦法向外部溝通。
而 0.0.0.0 本身意味著所有的網路接口,它將接受來自其他容器的連接,以及外部的連接都能成功到達容器內部。
不論是現在的章節或是以後使用 Docker,除非有特殊情境,不然我們都是預設綁定到 0.0.0.0 的 IP 地址,這樣可以減少很多不必要的麻煩。
容器的 IP 位置?
到目前為止,我們都還沒有談論過關於容器的 IP 位置,您或許會認為容器一直以來都和主機以相同的 IP 位置運行,但事實則相反,我們可以透過 docker container inspect
的指令來看到容器的 IP 位置:
$ docker container inspect --format '{{ .NetworkSettings.IPAddress }}' nginx # 不換行
172.17.0.2
接著可以透過 ifconfig en0
的指令來查看本機的 IP 位置:
$ ifconfig en0
en0: flags=8863<UP,BROADCAST,SMART,RUNNING,SIMP...
options=400<CHANNEL_IO>
ether 8c:85:90:11:17:bd
inet6 fe80::1c63:5f4c:ca77:69cc%en0 prefixlen 64 secue..
inet 192.168.1.101 netmask 0xffffff00 broadcast 192.168.1.255
....
上面輸出的 inet 192.168.1.101 就是我們本機的 IP 位置,但這似乎和啟動的 nginx 容器 IP 位置不相同呀,可見 Docker 的容器和我們本機並不在同一個網路內,這是什麼情況呢?
就讓我們進入下一章 Docker 虛擬網路篇 好好地解釋一番吧!