九、鏈接容器
docker 允許把多個容器連接在一起,相互交互信息。docker 鏈接會創(chuàng)建一種容器父子級別的關(guān)系,其中父容器可以看到其子容器提供的信息。
9.1 容器命名
在創(chuàng)建容器時,如果不指定容器的名字,則默認(rèn)會自動創(chuàng)建一個名字,這里推薦給容器命名:
- 1、給容器命名方便記憶,如命名運(yùn)行 web 應(yīng)用的容器為 web
- 2、為 docker 容器提供一個參考,允許方便其他容器調(diào)用,如把容器 web 鏈接到容器 db
可以通過--name選項給容器自定義命名:
$ sudo docker run -d -t -i --name test ubuntu:14.04 bash
$ sudo docker inspect --format="{{ .Nmae }}" test
/test
注:容器名稱必須唯一,即你只能命名一個叫test的容器。如果你想復(fù)用容器名,則必須在創(chuàng)建新的容器前通過docker rm刪除舊的容器或者創(chuàng)建容器時添加--rm選項。
9.2 鏈接容器
鏈接允許容器間安全通信,使用--link選項創(chuàng)建鏈接。
$ sudo docker run -d --name db training/postgres
基于 training/postgres 鏡像創(chuàng)建一個名為 db 的容器,然后下面創(chuàng)建一個叫做 web 的容器,并且將它與 db 相互連接在一起
$ sudo docker run -d -P --name web --link db:db training/webapp python app.py
--link <name or id>:alias選項指定鏈接到的容器。
查看 web 容器的鏈接關(guān)系:
$ sudo docker inspect -f "{{ .HostConfig.Links }}" web
[/db:/web/db]
可以看到 web 容器被鏈接到 db 容器為/web/db,這允許 web 容器訪問 db 容器的信息。
容器之間的鏈接實(shí)際做了什么?一個鏈接允許一個源容器提供信息訪問給一個接收容器。在本例中,web 容器作為一個接收者,允許訪問源容器 db 的相關(guān)服務(wù)信息。Docker 創(chuàng)建了一個安全隧道而不需要對外公開任何端口給外部容器,因此不需要在創(chuàng)建容器的時候添加-p或-P指定對外公開的端口,這也是鏈接容器的最大好處,本例為 PostgreSQL 數(shù)據(jù)庫。
Docker 主要通過以下兩個方式提供連接信息給接收容器:
- 環(huán)境變量
- 更新/etc/hosts文件
環(huán)境變量
當(dāng)兩個容器鏈接,Docker 會在目標(biāo)容器上設(shè)置一些環(huán)境變量,以獲取源容器的相關(guān)信息。
首先,Docker 會在每個通過--link選項指定別名的目標(biāo)容器上設(shè)置一個<alias>_NAME環(huán)境變量。如果一個名為 web 的容器通過--link db:webdb被鏈接到一個名為 db 的數(shù)據(jù)庫容器,那么 web 容器上會設(shè)置一個環(huán)境變量為WEBDB_NAME=/web/webdb.
以之前的為例,Docker 還會設(shè)置端口變量:
$ sudo 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 # <name>_PORT_<port>_<protocol> 協(xié)議可以是 TCP 或 UDP
DB_PORT_5432_TCP_PROTO=tcp
DB_PORT_5432_TCP_PORT=5432
DB_PORT_5432_TCP_ADDR=172.17.0.5
. . .
注:這些環(huán)境變量只設(shè)置給容器中的第一個進(jìn)程,類似一些守護(hù)進(jìn)程 (如 sshd ) 當(dāng)他們派生 shells 時會清除這些變量
更新/etc/hosts文件
除了環(huán)境變量,Docker 會在目標(biāo)容器上添加相關(guān)主機(jī)條目到/etc/hosts中,上例中就是 web 容器。
$ sudo docker run -t -i --rm --link db:db training/webapp /bin/bash
root@aed84ee21bde:/opt/webapp# cat /etc/hosts
172.17.0.7 aed84ee21bde
. . .
172.17.0.5 db
/etc/host文件在源容器被重啟之后會自動更新 IP 地址,而環(huán)境變量中的 IP 地址則不會自動更新的。