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