Docker 目前了提供映射容器端口至宿主主機(jī)和容器互聯(lián)機(jī)制來為容器提供網(wǎng)絡(luò)服務(wù)呈驶。
端口映射實(shí)現(xiàn)訪向容器
從外部訪問容器應(yīng)用
當(dāng)容器中運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部訪問這些應(yīng)用時疫鹊,可以通過 -P 或 -p 參數(shù)來指定端口映射袖瞻。當(dāng)使用 -P 標(biāo)記時司致, Docker 會隨機(jī)映射一個 49000 ~ 49900 的端口至容器內(nèi)部開放的網(wǎng)絡(luò)端口。
使用 docker ps 看到聋迎,本地主機(jī)的32769 被映射到了容器的5000端口脂矫。
訪問宿主機(jī)的32769 端口即可訪問容器內(nèi) Web 應(yīng)用提供的界面。
同樣霉晕,可以通過 docker logs 命令來查看應(yīng)用的信息:
root@localhost:~# sudo docker logs -f nostalgic_morse
-p(小寫)指定要映射的端口庭再,并且,在一個指定端口上只可以綁定一個容器牺堰。
映射所有接口地址
使用 hostPort:containerPort 格式將本地的5000 端口映射到容器的5000 端口拄轻,可執(zhí)行如下命令:
root@localhost:~# sudo docker run -d -p 5000:5000 training/webapp python app.py
此時默認(rèn)會綁定本地所有接口上的所有地址。多次使用 -p 標(biāo)記可以綁定多個端口伟葫。
例如:
root@localhost:~# sudo docker run -d -p 5000:5000 -p 3000:80 training/webapp python app.py
tainerPort 映射到指定地址的指定端口
可以使用 ip:hostPort:containerPort 格式指定映射使用一個特定地址恨搓,比如localhost 地址 127.0.0.1
root@localhost:~# sudo docker run -d -p 127.0.0.1:5000:5000 training/webapp python app.py
映射到指定地址的任意端口
使用 ip::containerPort 綁定 localhost 的任意端口到容器的 5000 端口,本地主機(jī)會自動分配一個端口:
root@localhost:~# sudo docker run -d -p 127.0.0.1::5000 training/webapp python app.py
還可以使用 udp 標(biāo)記來指定 udp 端口:
root@localhost:~# sudo docker run -d -p 127.0.0.1:5000:5000/udp training/webapp python app.py
查看映射端口配置
使用 docker port 來查看當(dāng)前映射的端口配置筏养,也可以查看到綁定的地址:
root@localhost:~# sudo docker port nostalgic_morse 5000
注意:容器有自己的內(nèi)部網(wǎng)絡(luò)和IP 地址(使用 docker inspect +容器ID 可以獲取所有的變量值)奶卓。
容器互聯(lián)實(shí)現(xiàn)容器間通信
容器的連接(linking) 系統(tǒng)是除了端口映射外另一種可以與容器中應(yīng)用進(jìn)行交互的方式。它會在源和接收容器之前創(chuàng)建一個隧道撼玄,接收容器可以看到源容器指定的信息夺姑。
自定義容器命名
連接系統(tǒng)依據(jù)容器的名稱來執(zhí)行。
使用 --name 標(biāo)記可以為容器自定義命名:
root@localhost:~# sudo docker run -d -P --name web training/webapp python app.py
使用 docker ps 來驗(yàn)證設(shè)定的命名:
也可以使用 docker inspect 來查看容器的名字:
root@localhost:~# sudo docker inspect -f "{{ .Name}}" 6531768ffa42
注意
容器的名稱是唯一的掌猛。如果已經(jīng)命名了一個叫 web 的容器盏浙,當(dāng)你要再次使用 web 這個名稱的時候,需要先用 docker rm 來刪除之前創(chuàng)建的同名容器荔茬。
容器互聯(lián)
使用 --link 參數(shù)可以讓容器之前安全的進(jìn)行交互废膘。
1.先創(chuàng)建一個數(shù)據(jù)庫容器
root@localhost:~# sudo docker run -d --name db training/postgres
2.刪除之前創(chuàng)建的 web 容器
root@localhost:~# sudo docker rm -f web
3.然后創(chuàng)建一個新的 web 容器,并將它連接到 db 容器:
root@localhost:~# sudo docker run -d -P --name web --link db:db training/webapp python app.py
此時 db 容器和 web 容器建立互聯(lián)關(guān)系慕蔚。
--link 參數(shù)的格式為 --link name:alias, 其中 name 是要鏈接的容器的名稱丐黄, alias 是這個連接的別名。
使用 docker ps 來查看容器的連接:
下面是父容器web 的hosts 文件:
可以在web容器中安裝ping命令來測試跟db容器的連通:
小結(jié):
網(wǎng)絡(luò)是云時代最核心也是最復(fù)雜的系統(tǒng)之一孔飒。Docker 目前采用了Linux 系統(tǒng)自帶的網(wǎng)絡(luò)系統(tǒng)來實(shí)現(xiàn)對網(wǎng)絡(luò)服務(wù)的支持灌闺,提供穩(wěn)定支持又可以實(shí)現(xiàn)快速的高性能轉(zhuǎn)發(fā)。
在生產(chǎn)環(huán)境中坏瞄,可以下入 SDN(軟件定義網(wǎng)絡(luò))或 NFV(網(wǎng)絡(luò)功能虛擬化)的相關(guān)技術(shù)桂对。
參考文檔
《Docker 技術(shù)入門與實(shí)戰(zhàn)》第7章 網(wǎng)絡(luò)基礎(chǔ)配置