方槍槍的java世界

          不要因為風雨飄落就停止了你的腳步,真正的得失就在你的心中。 做喜歡做的事,不輕言放棄!

          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 地址則不會自動更新的。

          posted on 2016-12-27 21:40 做強大的自己 閱讀(136) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 旺苍县| 保靖县| 沙洋县| 汾西县| 柳江县| 涿州市| 宁都县| 剑川县| 启东市| 海林市| 仙游县| 寻乌县| 枣阳市| 噶尔县| 张掖市| 大厂| 马龙县| 黄平县| 会昌县| 康平县| 峨边| 搜索| 吴堡县| 奉贤区| 广西| 六枝特区| 北辰区| 宜黄县| 马尔康县| 淄博市| 交口县| 合山市| 吴旗县| 临西县| 高唐县| 道真| 临潭县| 宝坻区| 屏南县| 溧水县| 南京市|