?
This document uses PHP Chinese website manual Release
本節(jié)中的信息解釋bridge
了在安裝 Docker 時自動創(chuàng)建的
Docker 默認(rèn)網(wǎng)絡(luò)中的舊容器鏈接。
在 Docker 網(wǎng)絡(luò)功能之前,您可以使用 Docker 鏈接功能來允許容器相互發(fā)現(xiàn)并安全地將有關(guān)一個容器的信息傳輸?shù)搅硪粋€容器。通過引入 Docker 網(wǎng)絡(luò)功能,您仍然可以創(chuàng)建鏈接,但它們在默認(rèn)bridge
網(wǎng)絡(luò)和用戶定義網(wǎng)絡(luò)之間的行為不同。
本節(jié)簡要討論通過網(wǎng)絡(luò)端口進行連接,然后詳細(xì)介紹默認(rèn)bridge
網(wǎng)絡(luò)中的容器鏈接。
警告:該
--link
標(biāo)志是 Docker 的棄用遺留功能。它最終可能會被刪除。除非您絕對需要繼續(xù)使用它,否則我們建議您使用用戶定義的網(wǎng)絡(luò)來促進兩個容器之間的通信而不是使用--link
。用戶定義的網(wǎng)絡(luò)不支持的一個功能--link
是在容器之間共享環(huán)境變量。但是,您可以使用其他機制(如卷)以更受控制的方式在容器之間共享環(huán)境變量。
假設(shè)您使用此命令來運行簡單的 Python Flask 應(yīng)用程序:
$ docker run -d -P training/webapp python app.py
注意:容器具有內(nèi)部網(wǎng)絡(luò)和IP地址。Docker 可以有多種網(wǎng)絡(luò)配置。您可以在這里看到有關(guān) Docker 網(wǎng)絡(luò)的更多信息。
創(chuàng)建該容器時,該-P
標(biāo)志用于自動將其內(nèi)部的任何網(wǎng)絡(luò)端口映射到 Docker 主機上臨時端口范圍內(nèi)的隨機高端口。接下來,docker ps
運行時,您看到容器中的端口5000已綁定到主機上的端口49155。
$ docker ps nostalgic_morse CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES bc533791f3f5 training/webapp:latest python app.py 5 seconds ago Up 2 seconds 0.0.0.0:49155->5000/tcp nostalgic_morse
您還看到了如何使用-p
旗子。在這里,主機的端口80映射到容器的端口5000:
$ docker run -d -p 80:5000 training/webapp python app.py
你也看到了為什么這不是一個好主意,因為它限制你在那個特定的港口上只有一個集裝箱。
相反,您可以指定一系列主機端口,以便將容器端口綁定到與默認(rèn)端口不同的位置。短時端口范圍*
$ docker run -d -p 8000-9000:5000 training/webapp python app.py
這將將容器中的端口5000綁定到主機上8000到9000之間的隨機可用端口。
還有一些其他方法可以配置-p
旗子。默認(rèn)情況下,-p
標(biāo)志將指定的端口綁定到主機上的所有接口。但是,您還可以指定綁定到特定接口,例如,僅將綁定指定到localhost
...
$ docker run -d -p 127.0.0.1:80:5000 training/webapp python app.py
這將將容器內(nèi)的端口5000綁定到localhost
或127.0.0.1
主機上的接口。
或者,將容器的端口5000綁定到動態(tài)端口,但僅在localhost
,你可以:
$ docker run -d -p 127.0.0.1::5000 training/webapp python app.py
還可以通過添加尾隨來綁定UDP端口。/udp
例如:
$ docker run -d -p 127.0.0.1:80:5000/udp training/webapp python app.py
你也學(xué)到了有用的東西docker port
顯示當(dāng)前端口綁定的快捷方式。這對于顯示特定的端口配置也很有用。例如,如果您已經(jīng)將容器端口綁定到localhost
在主機上,然后docker port
產(chǎn)出將反映這一點。
$ docker port nostalgic_morse 5000127.0.0.1:49155
注*
-p
可以多次使用標(biāo)志來配置多個端口。
注本節(jié)將介紹默認(rèn)情況下的遺留鏈接功能。
bridge
網(wǎng)絡(luò)。請參閱在用戶定義的網(wǎng)絡(luò)中連接容器有關(guān)用戶定義網(wǎng)絡(luò)中鏈接的更多信息。
網(wǎng)絡(luò)端口映射并不是Docker容器相互連接的唯一方式。Docker還有一個鏈接系統(tǒng),允許您將多個容器連接在一起,并從一個容器到另一個容器發(fā)送連接信息。鏈接容器時,可以將有關(guān)源容器的信息發(fā)送到收件人容器。這允許收件人查看所選數(shù)據(jù)描述源容器的各個方面。
要建立鏈接,Docker依賴于容器的名稱。您已經(jīng)看到,您創(chuàng)建的每個容器都有一個自動創(chuàng)建的名稱;實際上,您已經(jīng)熟悉了我們的老朋友nostalgic_morse
在這個指南里。您也可以自己命名容器。這個命名提供了兩個有用的功能:
將執(zhí)行特定功能的容器命名為使您更容易記住它們的方法是有用的,例如命名包含web應(yīng)用程序的容器。web
...
它為Docker提供了一個引用點,允許它引用其他容器,例如,可以指定鏈接容器web
到集裝箱db
...
您可以使用--name
例如,國旗:
$ docker run -d -P --name web training/webapp python app.py
這將啟動一個新容器,并使用--name
標(biāo)志以命名容器web
.您可以使用docker ps
命令。
$ docker ps -l CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES aed84ee21bde training/webapp:latest python app.py 12 hours ago Up 2 seconds 0.0.0.0:49154->5000/tcp web
您也可以使用docker inspect
返回容器的名稱。
注容器名稱必須是唯一的。這意味著您只能調(diào)用一個容器。
web
.如果要重用容器名稱,必須刪除舊容器%28docker rm
%29,然后才能創(chuàng)建同名的新容器。作為替代,您可以使用--rm
帶docker run
命令。這將在容器停止后立即刪除它。
鏈接允許容器彼此發(fā)現(xiàn)并安全地將有關(guān)一個容器的信息傳輸?shù)搅硪粋€容器。設(shè)置鏈接時,可以在源容器和收件人容器之間創(chuàng)建管道。然后,收件人可以訪問有關(guān)源的選擇數(shù)據(jù)。若要創(chuàng)建鏈接,請使用--link
旗子。首先,創(chuàng)建一個新容器,這次是一個包含數(shù)據(jù)庫的容器。
$ docker run -d --name db training/postgres
這將創(chuàng)建一個名為db
從training/postgres
圖像,其中包含PostgreSQL數(shù)據(jù)庫。
現(xiàn)在,您需要刪除web
之前創(chuàng)建的容器,以便用鏈接的容器替換它:
$ docker rm -f web
現(xiàn)在,創(chuàng)建一個新的web
容器并將其與您的db
集裝箱。
$ docker run -d -P --name web --link db:db training/webapp python app.py
這將連接新的web
容器db
您之前創(chuàng)建的容器。大--link
國旗形式如下:
--link <name or id>:alias
何地name
是我們鏈接到的容器的名稱,并且alias
是鏈接名的別名。您很快就會看到這個別名是如何使用的。大--link
標(biāo)志還采取以下形式:
--link <name or id>
在這種情況下,別名將與名稱匹配。您可以將前面的示例編寫為:
$ docker run -d -P --name web --link db training/webapp python app.py
接下來,使用docker inspect
*
$ docker inspect -f "{{ .HostConfig.Links }}" web[/db:/web/db]
你可以看到web
容器現(xiàn)在鏈接到db
集裝箱web/db
。這允許它訪問有關(guān)db
集裝箱。
那么,連接容器實際上是做什么的呢?您已經(jīng)了解到,鏈接允許源容器向收件人容器提供有關(guān)自身的信息。在我們的例子中,接受者,web
,可以訪問有關(guān)源的信息。db
為此,Docker在容器之間創(chuàng)建一個安全隧道,不需要在容器外部公開任何端口;您將注意到,當(dāng)我們啟動db
容器,我們也沒有使用-P
或-p
旗子。這是鏈接的一個巨大好處:我們不需要將源容器(這里是PostgreSQL數(shù)據(jù)庫)公開到網(wǎng)絡(luò)中。
Docker以兩種方式公開源容器到收件人容器的連接信息:
環(huán)境變量,
更新/etc/hosts
檔案。
當(dāng)您鏈接容器時,Docker會創(chuàng)建多個環(huán)境變量。控件自動在目標(biāo)容器中創(chuàng)建環(huán)境變量。--link
參數(shù)。它還將公開源自源容器的Docker的所有環(huán)境變量。這些變量包括:
大ENV
源容器的Dockerfile中的命令
大-e
,,,--env
,和--env-file
上的選項docker run
在啟動源容器時發(fā)出
這些環(huán)境變量可以從目標(biāo)容器中發(fā)現(xiàn)與源容器相關(guān)的信息。
警告*重要的是要理解全從容器內(nèi)的Docker中產(chǎn)生的環(huán)境變量可用于任何鏈接到它的容器。如果將敏感數(shù)據(jù)存儲在其中,這可能會對安全產(chǎn)生嚴(yán)重影響。
碼頭設(shè)置<alias>_NAME
中列出的每個目標(biāo)容器的環(huán)境變量。--link
參數(shù)。例如,如果一個新容器調(diào)用web
鏈接到名為db
通孔--link db:webdb
,然后Docker創(chuàng)建一個WEBDB_NAME=/web/webdb
變量中的web
集裝箱。
Docker還為源容器公開的每個端口定義了一組環(huán)境變量。每個變量在表單中都有一個唯一的前綴:
<name>_PORT_<port>_<protocol>
這個前綴中的組件是:
別名<name>
中指定的--link
參數(shù)%28例如,webdb
%29
大<port>
暴露數(shù)
阿<protocol>
哪個是tcp或udp?
Docker使用這種前綴格式定義三個不同的環(huán)境變量:
大prefix_ADDR
變量包含來自URL的IP地址,例如WEBDB_PORT_5432_TCP_ADDR=172.17.0.82
...
大prefix_PORT
變量僅包含URL中的端口號,例如WEBDB_PORT_5432_TCP_PORT=5432
...
大prefix_PROTO
變量僅包含來自URL的協(xié)議,例如WEBDB_PORT_5432_TCP_PROTO=tcp
...
如果容器公開多個端口,則為每個端口定義一個環(huán)境變量集。這意味著,例如,如果容器公開了Docker創(chuàng)建的4個端口,每個端口將創(chuàng)建12個環(huán)境變量。
此外,Docker還創(chuàng)建了一個名為<alias>_PORT
此變量包含源容器的第一個公開端口的URL?!暗谝粋€”端口被定義為具有最低數(shù)目的公開端口。例如,考慮WEBDB_PORT=tcp://172.17.0.82:5432
變量。如果該端口同時用于TCP和UDP,則指定TCP端口。
最后,Docker還將來自源容器的每個Docker源環(huán)境變量公開為目標(biāo)中的環(huán)境變量。對于每個變量,Docker創(chuàng)建一個<alias>_ENV_<name>
變量在目標(biāo)容器中。變量的值設(shè)置為啟動源容器時使用的值Docker。
返回到我們的數(shù)據(jù)庫示例,您可以運行env
命令列出指定容器的環(huán)境變量。
$ docker run --rm --name web2 --link db:db training/webapp env . . . DB_NAME=/web2/db DB_PORT=tcp://172.17.0.5:5432 DB_PORT_5432_TCP=tcp://172.17.0.5:5432 DB_PORT_5432_TCP_PROTO=tcp DB_PORT_5432_TCP_PORT=5432 DB_PORT_5432_TCP_ADDR=172.17.0.5 . . .
您可以看到,Docker已經(jīng)創(chuàng)建了一系列環(huán)境變量,其中包含有關(guān)源的有用信息。db
集裝箱。每個變量都以前綴DB_
,它是從alias
你上面有說明。如果alias
成db1
,變量將以DB1_
.可以使用這些環(huán)境變量配置應(yīng)用程序,以連接到db
集裝箱。連接將是安全的和私有的;只有鏈接web
容器將能夠與db
集裝箱。
不像/etc/hosts
檔案,如果重新啟動源容器,存儲在環(huán)境變量中的IP地址不會自動更新。我們建議在/etc/hosts
若要解析鏈接容器的IP地址,請執(zhí)行以下操作。
這些環(huán)境變量僅為容器中的第一個進程設(shè)置。一些守護進程,例如sshd
,當(dāng)它們產(chǎn)卵時,會擦洗它們以連接。
/etc/hosts
檔案除了環(huán)境變量之外,Docker還將源容器的主機項添加到/etc/hosts
檔案。這里有一個條目web
集裝箱:
$ docker run -t -i --rm --link db:webdb training/webapp /bin/bash root@aed84ee21bde:/opt/webapp# cat /etc/hosts172.17.0.7 aed84ee21bde. . .172.17.0.5 webdb 6e5cdeb2d300 db
您可以看到兩個相關(guān)的主機條目。第一個條目是web
容器,它使用容器ID作為主機名。第二個條目使用鏈接別名引用db
集裝箱。除了您提供的別名之外,鏈接容器的名稱-如果是唯一的,則從提供給--link
參數(shù)-并且鏈接容器的主機名也將被添加到/etc/hosts
用于鏈接容器的IP地址。您現(xiàn)在可以通過以下任何一個條目來平該主機:
root@aed84ee21bde:/opt/webapp# apt-get install -yqq inetutils-ping root@aed84ee21bde:/opt/webapp# ping webdb PING webdb (172.17.0.5): 48 data bytes56 bytes from 172.17.0.5: icmp_seq=0 ttl=64 time=0.267 ms56 bytes from 172.17.0.5: icmp_seq=1 ttl=64 time=0.250 ms56 bytes from 172.17.0.5: icmp_seq=2 ttl=64 time=0.256 ms
注:在本例中,您將注意到您必須安裝
ping
因為它最初沒有包含在容器中。
在這里,你用ping
命令,將db
容器使用其主機項,該條目解析為172.17.0.5
.您可以使用此主機項配置應(yīng)用程序以使用db
集裝箱。
注::可以將多個收件人容器鏈接到單個源。例如,可以將多個%28不同名稱的web容器附加到
db
集裝箱。
如果重新啟動源容器,則鏈接容器/etc/hosts
文件將使用源容器的新IP地址自動更新,從而允許繼續(xù)進行鏈接通信。
$ docker restart db db $ docker run -t -i --rm --link db:db training/webapp /bin/bash root@aed84ee21bde:/opt/webapp# cat /etc/hosts172.17.0.7 aed84ee21bde. . .172.17.0.9 db