創建一個docker容器,docker系統會自動為該容器分配一個ip地址,通常是172.17開頭。
我們可以在主機上用 docker inspect 命令 或者進入容器用ifconfig命令來查看容器的ip地址。
假設某個容器(假設容器的名稱為myweb)被分配的地址是 172.17.0.2,該容器上啟動了一個web服務,其端口號是80(注意這是容器中的端口號)。
這時我們用docker port命令可以查看該web服務在容器的端口對應到主機端口的信息,如:
docker port myweb
輸出
80/tcp -> 0.0.0.0:32776
一、這時我們在docker主機上可通過如下方式訪問容器的服務
1、方式一:
curl http://localhost:32776
2、方式二:
假設主機的ip地址為192.168.142.138
curl http://192.168.142.138:32776
這樣docker主機局域網內的機器就可以通過主機的地址和綁定的ip來訪問到docker容器上的服務了。不過這存在的問題是,需要將容器端口與主機上端口的映射關系變成固定的。否則一旦容器重啟,綁定端口就會變了。
3、方式三:
假設容器的ip地址為 172.17.0.2
curl http://172.17.0.2:80
二、其它容器訪問該容器的web服務
現在啟動另外一個容器,在該容器中要訪問myweb容器提供的web服務,可以用如下方式:
1、方式一:直接通過容器的ip地址訪問
curl http://172.17.0.2:80
說明:這么做是可以的,但問題是容器的ip地址是自動分配的,一旦提供該web服務的容器重啟后,其ip可能發生變化。這就導致原來指定的ip有問題了。
2、方式二:通過主機地址和映射端口訪問
curl http://192.168.142.138:32776
說明:這存在的問題是,端口的映射是自動的,容器一旦重啟后會發生變化。
總結下,如果某個容器提供了對外的服務(如web服務),則統一的訪問方式可以利用docker主機的ip地址和容器映射到主機上的端口來統一訪問。
三、容器之間互聯的另外一種方式
docker提供了一種機制,可以讓一個容器和另一個容器很方便的連接起來。舉例:
docker run --name test1 --link myweb:web -it ubuntu /bin/bash
上面命令創建了一個新的容器test1。 這里引入了一個新的標記 --link,其參數部分的myweb表示要連接的容器,web是要連接的容器的別名。
容器創建后,我們用 ping web命令發現能連接到myweb容器,這樣因為用的不是ip地址,而是別名。這樣即使myweb1容器重啟后,上面創建的test1容器對其連接的代碼或腳本也不用修改。
假設myweb容器提供了web服務,容器內的端口是80.
這時在test1容器內可以用如下方式訪問: curl http://web:80
顯然,這種方式的優點是不再指定ip地址,即使 myweb容器重啟后ip地址變了也沒關系。
注意:需要注意的是,如果myweb容器未啟動,但有別的容器啟動,test1容器利用別名web可能會關聯到別的容器上,這是個問題。
