Docker 學(xué)習(xí)筆記 - 端口映射與容器互聯(lián)
作者:?馬燕龍
時(shí)間:?2017-11-06
分類(lèi):?Docker
一、前言
在實(shí)際應(yīng)用中烂斋,經(jīng)常會(huì)碰到需要多個(gè)服務(wù)組件容器共同協(xié)作的情況屹逛,這往往需要多個(gè)容器之間有能夠互相訪(fǎng)問(wèn)到對(duì)方的服務(wù)。
除了通過(guò)網(wǎng)絡(luò)訪(fǎng)問(wèn)外汛骂,Docker 還提供了兩個(gè)很方便的功能來(lái)滿(mǎn)足服務(wù)訪(fǎng)問(wèn)的基本需求:
端口映射:允許映射容器內(nèi)應(yīng)用的服務(wù)端口到本地宿主主機(jī)罕模;
容器互聯(lián):提供了互聯(lián)機(jī)制實(shí)現(xiàn)多個(gè)容器間通過(guò)容器名來(lái)快速訪(fǎng)問(wèn)。
二帘瞭、端口映射
Docker 端口映射即映射容器內(nèi)應(yīng)用的服務(wù)端口到本機(jī)宿主機(jī)器淑掌。
當(dāng)容器中運(yùn)行一些網(wǎng)絡(luò)應(yīng)用,要讓外部訪(fǎng)問(wèn)這些應(yīng)用時(shí)蝶念,可以通過(guò) -P 或 -p 參數(shù)兩種方式來(lái)指定端口映射抛腕。
1. 隨機(jī)映射
使用 -P 參數(shù)時(shí),Docker 會(huì)隨機(jī)映射一個(gè)端口到內(nèi)部容器開(kāi)放的網(wǎng)絡(luò)端口祸轮,如下開(kāi)啟一個(gè) nginx 服務(wù):
$dockerrun-d-Pnginxe93349d539119dc48dc841e117f6388d6afa6a6065b75a5b4aedaf5fb2a051fc$$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESe93349d53911nginx"nginx-g'daemon..."11secondsagoUp9seconds0.0.0.0:32769->80/tcpzen_kirch
使用 docker ps 看到兽埃,本地主機(jī)的 32769 端口被映射到了容器的 80 端口,這時(shí)我們通過(guò)本機(jī)瀏覽器訪(fǎng)問(wèn)?http://localhost:32769?就會(huì)出現(xiàn) nginx 歡迎頁(yè)面适袜。
2. 指定端口
使用 -p 參數(shù)時(shí)柄错,可以指定要映射的端口,并且在一個(gè)指定的端口上只可以綁定一個(gè)容器。支持的格式有:
IP:HostPort:ContainerPort
IP:ContainerPort
HostPort:ContainerPort
下面開(kāi)啟一個(gè) nginx 服務(wù)售貌,將本機(jī) 8080 端口映射到容器的 80 端口:
$dockerrun-d-p8080:80nginx23e725098712d061a1382f33d6fe54da23ae37597a62f8debdd3731b5f9cc4b9$$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES23e725098712nginx"nginx-g'daemon..."8secondsagoUp6seconds0.0.0.0:8080->80/tcpfrosty_ptolemy
使用 docker ps 看到给猾,本地主機(jī)的 8080 端口被映射到了容器的 80 端口,這時(shí)我們通過(guò)本機(jī)瀏覽器訪(fǎng)問(wèn)?http://localhost:8080?就會(huì)出現(xiàn) nginx 歡迎頁(yè)面颂跨。
3. 查看映射端口
使用 docker port 命令來(lái)查看當(dāng)前映射的端口配置敢伸,也可以查看到綁定的地址。命令格式如下:
$ docker portCONTAINER[PRIVATE_PORT[/PROTO]]
容器有自己的內(nèi)部網(wǎng)絡(luò)和 IP 地址恒削,可以使用 docker inspect + 容器ID 獲取容器的具體信息池颈。
三、容器互聯(lián)
容器的互聯(lián)(linking)是一種讓多個(gè)容器中應(yīng)用進(jìn)行快速交互的方式钓丰。它會(huì)在源和接收容器之間創(chuàng)建連接關(guān)系躯砰,接收容器可以通過(guò)容器名快速訪(fǎng)問(wèn)到源容器,而不是指定具體的 IP 地址携丁。
下面使用 mysql 和 wordpress 鏡像來(lái)搭建 wordpress 運(yùn)行環(huán)境琢歇,演示容器互聯(lián)的使用。
1. 自定義容器名
連接系統(tǒng)依據(jù)容器的名稱(chēng)來(lái)執(zhí)行梦鉴。雖然創(chuàng)建容器時(shí)系統(tǒng)會(huì)默認(rèn)分配一個(gè)名字李茫,但建議自己自定義命名。
首先啟動(dòng)一個(gè) mysql 容器肥橙,使用 --name 標(biāo)記自定義容器名為 db:
$dockerrun--namedb-d-eMYSQL_ROOT_PASSWORD=123456mysql:latest35bd73d4d41370bb5218818f58b7f1b89744728c4cb6317d85634abdb47da461$$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMES35bd73d4d413mysql:latest"docker-entrypoint..."11secondsagoUp10seconds3306/tcpdb
使用 docker ps 可以看到該容器的 NAMES 為 db魄宏。
注:-e MYSQL_ROOT_PASSWORD=123456?是為 mysql 服務(wù)設(shè)置密碼,具體可以查看 mysql 鏡像的使用快骗。
2. 容器互聯(lián)
使用 --link 參數(shù)可以讓容器之間安全地交互娜庇。--link 的參數(shù)格式為 --link name:alias,其中 name 是要連接的容器名稱(chēng)方篮,alias 是這個(gè)連接的別名名秀。
下面啟動(dòng)一個(gè) wordpress 容器,并將它連接到 db 容器:
$dockerrun--namewp--linkdb:mysql-d-p8080:80wordpress:latestd9ee6660b48f80328d14e7a2a57013e72fa8d88de8524d651e003940563e3090$dockerpsCONTAINERIDIMAGECOMMANDCREATEDSTATUSPORTSNAMESd9ee6660b48fwordpress:latest"docker-entrypoint..."5secondsagoUp4seconds0.0.0.0:8080->80/tcpwp35bd73d4d413mysql:latest"docker-entrypoint..."18minutesagoUp18minutes3306/tcpdb
此時(shí)藕溅,wp 容器和 db 容器建立了互聯(lián)關(guān)系匕得。
在瀏覽器中訪(fǎng)問(wèn)?http://localhost:8080/?會(huì)進(jìn)入 wordpress 安裝程序,安裝完成后進(jìn)入容器 db巾表,你會(huì)發(fā)現(xiàn)數(shù)據(jù)表確實(shí)被寫(xiě)在該容器中汁掠。
注:如提示數(shù)據(jù)庫(kù)連接錯(cuò)誤,先進(jìn)入 db 容器新建數(shù)據(jù)庫(kù)集币,如默認(rèn)名為 wordpress考阱。
本文為博主學(xué)習(xí)筆記,首發(fā)于馬燕龍個(gè)人博客鞠苟,歡迎分享乞榨,轉(zhuǎn)載請(qǐng)標(biāo)明出處秽之。
馬燕龍個(gè)人博客:http://www.mayanlong.com
馬燕龍個(gè)人微博:http://weibo.com/imayanlong
馬燕龍Github主頁(yè):https://github.com/yanlongma