大量的互聯網應用服務包含多個服務組件,這往往需要多個容器之間通過網絡通信進行相互配合。Docker 目前提供了映射容器端口到宿主主機和容器互聯機制來為容器提供網絡服務。接下來我們將講述 Docker 的網絡功能,包括使用端口映射機制來將容器內應用服務提供給外部網絡,以及通過容器互聯系統讓多個容器之間進行快捷的網絡通信。
端口映射實現訪問容器
從外部訪問容器應用
在啟動容器的時候,如果不指定對應的參數,在容器外部是無法通過網絡來訪問容器內的網絡應用和服務的。當容器中運行了一些網絡應用,要讓外部訪問這些應用時,可以通過 -P 或 -p 參數來指定端口映射。當使用 -P 參數時,Docker 會隨機選擇一個主機可用的端口映射至容器內部開放的網絡端口:
$ docker run -d -P training/webapp python app.py
使用 docker ps 命令查看一下映射結果:

我這里主機的 32768 端口映射到了容器的 5000 端口。此時訪問主機的 32768 端口就可以訪問容器內 web 應用提供的內容。
-p (小寫)參數則可以指定要映射的主機端口。注意,在一個指定的主機端口上只能綁定一個容器。我們可以通過不同的參數格式映射主機和容器之間的端口:Ip:hostPort:containerPort
Ip::containerPort
hostPort:containerPort
映射所有接口地址
使用 hostPort:containerPort 格式將本地的 5000 端口映射到容器的 5000 端口,可以執行如下命令:
$ sudo docker run -d -p 5000:5000 training/webapp python app.py
此時默認會綁定本地所有接口上的所有地址(如果主機有多個 IP,那么每個 IP 的 5000 端口都映射到了容器的 5000 端口)。
多次使用 -p 參數可以綁定多個端口:
$ sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
映射到指定地址的指定端口
可以使用 ip:hostPort:containerPort 格式的參數指定映射使用一個特定地址,比如 localhost 地址 127.0.0.1:
$ sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
使用 ip::containerPort 格式的參數可以綁定 localhost 的任意端口到容器的 5000 端口,本地主機會自動分配一個端口:
$ sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
另外還可以使用 udp 標記來指定 udp 端口:
$ sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置
使用 docker port 命令可以查看當前映射的端口配置,也可以查看到綁定的地址:

上圖中 mad_einstein 是容器的名字,32768 是容器的 5000 端口映射到主機上的端口。
容器互聯實現容器間通信
容器的連接(linking)系統是除了端口映射外另一種可以與容器中應用進行交互的方式。它會在源和接收容器之間創建一個隧道,接收容器可以看到源容器指定的信息。
自定義容器命名
連接系統依據容器的名稱來執行。因此,首先需要自定義一個好記的容器名稱。雖然當創建容器的時候,系統默認會分配一個名字,但自定義命名容器有兩個好處:
新聞熱點
疑難解答