1. 程式人生 > >深入理解docker的link機制

深入理解docker的link機制

什麼是docker的link機制

同一個宿主機上的多個docker容器之間如果想進行通訊,可以通過使用容器的ip地址來通訊,也可以通過宿主機的ip加上容器暴露出的埠號來通訊,前者會導致ip地址的硬編碼,不方便遷移,並且容器重啟後ip地址會改變,除非使用固定的ip,後者的通訊方式比較單一,只能依靠監聽在暴露出的埠的程序來進行有限的通訊。通過docker的link機制可以通過一個name來和另一個容器通訊,link機制方便了容器去發現其它的容器並且可以安全的傳遞一些連線資訊給其它的容器。其使用方式如下:

1.執行一個容器,通過–name指定一個便於記憶的名字,這個容器被稱為source container,也就是要連線的容器

docker run --name db -e MYSQL_ROOT_PASSWORD=server -d mysql

上面通過傳遞環境變數MYSQL_ROOT_PASSWORD=server,來設定mysql服務的密碼為server

2.執行另外一個容器,並link到上面啟動的容器,這個容器被稱為received container

sudo docker run -d --name web --link db:aliasdb nginx

上面通過--link連線名為db的容器,併為其設定了別名aliasdb
完成了上面的兩個步驟後,在nginx的容器中就可以使用db或者aliasdb作為連線地址來連線mysql服務,即使容器重啟了,地址發生了變化,不會影響兩個容器之間的連線。

link機制的連線資訊傳遞

雖然通過使用link機制nginx可以和mysql進行通訊了,但是如何知道mysql的埠是多少呢,雖然說是固定的是
3306,但是也不排除更改埠號的問題,並且對應一些非固定埠的應用來說,只要要連線的容器的埠資訊也是尤為重要的,link機制通過環境變數的方式提供了這些資訊,除此之外像db的密碼這些資訊也會通過環境變數提供,docker將source container中定義的環境變數全部匯入到received container中,在received container中可以通過環境變數來獲取連線資訊下面是db中提供的環境變數:

PATH=/usr/local
/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/mysql/bin:/usr/local/mysql/scripts HOSTNAME=c1a7c7f091eb MYSQL_ROOT_PASSWORD=server MYSQL_MAJOR=5.5 MYSQL_VERSION=5.5.48 HOME=/root

注: 使用docker exec db env命令來獲得上面的結果
下面我們來看看在web這個容器中,這些變數是如何被匯入的。

PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
HOSTNAME=6337c0044215
ALIASDB_PORT=tcp://172.17.0.8:3306
ALIASDB_PORT_3306_TCP=tcp://172.17.0.8:3306
ALIASDB_PORT_3306_TCP_ADDR=172.17.0.8
ALIASDB_PORT_3306_TCP_PORT=3306
ALIASDB_PORT_3306_TCP_PROTO=tcp
ALIASDB_NAME=/web/aliasdb
ALIASDB_ENV_MYSQL_ROOT_PASSWORD=server
ALIASDB_ENV_MYSQL_MAJOR=5.5
ALIASDB_ENV_MYSQL_VERSION=5.5.48
NGINX_VERSION=1.9.10-1~jessie
HOME=/root

上面的變數被分成了五個部分:

  • 第一個部分是web容器自身提供的一些環境變數,如NGINX_VERSION,HOSTNAME,HOME,PATH等.
  • 第二個部分則是ALIASDB_ENV開頭的變數,這些都是從source container中匯入的,變數來源於Dockerfile中使用ENV命令定義的變數,或者是docker run的時候通過-e 新增的環境變數。
  • 第三個部分是ALIASDB_NAME 這個變數,這變數記錄了link的兩個容器的組合,這裡就是/web/db
  • 第四個部分就是ALIASDB_PORT開頭的一系列變數,這些變數會有很組,每組變數的命名格式如下
<alias>_PORT_<port>_<protocol>
<alias>_PORT_<port>_<protocol>_PORT
<alias>_PORT_<port>_<protocol>_PROTO
<alias>_PORT_<port>_<protocol>_ADDR

其中<port>是在Dockerfile中使用EXPOSE匯出的埠,還有docker run 的時候使用-p匯出的埠。<protocol>則是這些埠對應的協議。

  • 第五個部分就是ALIASDB_PORT這個變數,這個變數是EXPOSE匯出埠中的第一個埠對應的連線url,
    如果有EXPOSE匯出的埠,還有docker run -p指定匯出的埠,那麼通過-p指定的埠是第一個被匯出的埠

link機制和/etc/hosts

使用了link機制後,可以通過指定的名字來和目標容器通訊,這其實是通過給/etc/hosts中加入名稱和IP的解析關係來實現的,下面是名為web的容器中的/etc/hosts資訊.

172.17.0.10 6337c0044215
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
172.17.0.8  aliasdb c1a7c7f091eb db

通過上面的資訊可以看出,link機制給received container(這裡是名為web的容器)添加了一條關於db容器的名稱解析。有了這個名稱解析後就可以不使用ip來和目標容器通訊了,除此之外當目標容器重啟,docker會負責更新/etc/hosts檔案,因此可以不用擔心容器重啟後IP地址發生了改變,解析無法生效的問題。但是很不幸的是,環境變數無法更新,上文中提到了link機制會通過環境變數將一些db容器的資訊匯入到web容器中,這種匯入是一次性的,此後這個容器更新了環境變數的資訊是無法在web容器中更新的。

link機制和網路新特性

通過上文中對link機制的介紹,可以發現link機制提供瞭如下幾個功能

  • 名稱解析
  • 對link的容器可以使用別名
  • 安全的容器間連線通訊
  • 環境變數的注入

安全的容器間連線通訊,這個需要結合docker daemon的-icc=false 這個選項,默認同一個宿主機上的所有容器可以互相通訊,當使用-icc=false 的時候所有容器之間是無法進行互相通訊的(具體原因會單獨出篇文章分析),但是使用link機制後,即使使用了-icc=false 兩個容器之間也可以進行基於埠的通訊。很不幸的是當docker引入網路新特性後,link機制變的有些多餘,但是為了相容早期版本,–link機制在預設網路上的功能依舊沒有發生變化,docker引入網路新特性後,內建了一個DNS Server,但是隻有使用者建立了自定義網路後,這個DNS Server才會起作用。在網路新特性為未引入之前,有三種網路,第一種就是docker0這種橋接網路,用的也是最多的,第二個則是複用主機網路,稱為HOST網路,第三種就是none網路,只建立了一個空的網路名稱空間,沒有網路介面,無法和外界通訊,可以讓使用者自己去構建網路。當網路新特性引入後,有了overlay網路,有了使用者自定義網路。使用者自定義網路下,使用者可以通過docker的network子命令建立一個自定義的橋接網路,這個自定義橋接的網路和預設的docker0橋接網路基本功能都是一致的,只是在這個自定義橋接網路中擁有一些特性,可以替代link機制。這些特性包括如下幾個方面:

  • 基於DNS的名稱自動解析
  • 安全的隔離環境
  • 動態的附加或者脫離一個網路
  • 支援使用–link設定別名

在使用者自定義網路下,不使用link機制就可以實現名稱解析功能了,不再是通過link機制追加名稱解析關係到/etc/hosts檔案中了。並且在預設的docker0橋接網路和自定義網路下使用link機制的效果是不一樣的,在自定義網路中link機制只是負責設定別名的,不再提供環境變數注入的功能了。自定義網路中同時也提供了--net-alias功能和link機制提供別名功能是一樣的。保留link機制目的是為了相容。

參考文獻

相關推薦

深入理解springioc機制,以下為例子做理解

通過java反射機制來讀取applicationContext.xml的內容  該xml檔案內容如下 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org

深入理解this機制系列第二篇——this繫結優先順序

前面的話   上一篇介紹過this的繫結規則,那如果在函式的呼叫位置上同時存在兩種以上的繫結規則應該怎麼辦呢?本文將介紹this繫結的優先順序 顯式繫結 pk 隱式繫結   顯式繫結勝出 function foo() { console.log( this.a ); } var

深入理解this機制系列第一篇——this的4種繫結規則

前面的話   如果要問javascript中哪兩個知識點容易混淆,作用域查詢和this機制絕對名列前茅。前面的作用域系列已經詳細介紹過作用域的知識。本系列開始將介紹javascript的另一大山脈——this機制。本文是該系列的第一篇——this的4種繫結規則 預設繫結   全域性環境中,this預

JavaSrcipt的數字(number):深入理解內部機制

一、數字的語法 JavaScript中的數字字面量一般用十進位制表示。在JavaScript中表示數字的資料型別只有一種Number,這種天使與魔鬼同體的資料型別也就只有js了。 //同時表達整數和浮點數 var a = 78, b = 78.3; console.log(typeof a)

深入理解log機制

深入的探討了log機制中各種概念的來源、常用log庫的用法、內部處理流程,以及如何在一個涉及多臺主機的複雜系統中部署log等問題。本文是對這次分享的總結,將對這些問題一一展開介紹。 轉自:http://feihu.me/blog/2014/insight-into-log/

深入理解session機制

1. session概念 2. http協議與狀態保持 3. 理解cookie 4. php中session的生成機制 5. php中session的過期回收機制 6. php中session的客戶端儲存機制 1. session概念 在web伺服器蓬勃發

深入理解事件機制的實現

一、一個例項 假設你在家客廳裡玩遊戲,口渴了,需要到廚房開一壺水,等水開了的時候,為了防止水熬幹,你需要及時把火爐關掉。為了及時瞭解到水是否燒開,你有三種策略可以選擇: 1. 守在廚房內,等水燒開 這種策略顯然是很愚蠢的,採取這種策略,在燒水的過程中你將不能做任何事情,效率極低。 2. 呆在客廳玩遊戲

Android 深入理解 Notification 機制

本文需要解決的問題 筆者最近正在做一個專案,裡面需要用到 Android Notification 機制來實現某些特定需求。我

JDK原始碼系列(一) ------ 深入理解SPI機制

什麼是SPI機制 最近我建了另一個文章分類,用於擴充套件JDK中一些重要但不常用的功能。 SPI,全名Service Provider Interface,是一種服務發現機制。它可以看成是一種針對介面實現類的解耦方案。我們只需要採用配置檔案方式配置好介面的實現類,就可以利用SPI機制去載入到它們了,當我們需要

深入理解Java虛擬機- 學習筆記 - 虛擬機類加載機制

支持 pub eth 獲取 事件 必須 string 沒有 字節碼 虛擬機把描述類的數據從Class文件加載道內存,並對數據進行校驗,轉換解析和初始化,最終形成可以被虛擬機直接使用的Java類型,這就是虛擬機的類加載機制。在Java裏,類型的加載、連接和初始化過程都是在程序

深入理解JVM_java代碼的執行機制01

功能 存在 oot 對象實例 符號 token 類型 格式 找對象 本章學習重點: 1、Jvm: 如何將java代碼編譯為class文件。 如何裝載class文件及如何執行class文件。 jvm如何進行內存分配和回收。 jvm多線程

深入理解Java:類加載機制及反射

指定 請求 image vm虛擬機 常量池 使用 元素 靜態 創建 一、Java類加載機制 1.概述 Class文件由類裝載器裝載後,在JVM中將形成一份描述Class結構的元信息對象,通過該元信息對象可以獲知Class的結構信息:如構造函數,屬性和方法等,J

深入理解 Java 垃圾回收機制

nbsp 循環引用 方式 不同的 整理 一個 復制 垃圾回收機制 提高 垃圾回收機制中的算法: 1.引用計數法:無法檢測出循環引用。如父對象有一個對子對象的引用,子對象反過來引用父對象。這樣,他們的引用計數永遠不可能為0. 2 標記-清除算法:采用從根集合進行掃描,對存活

深入理解Java類型信息(Class對象)與反射機制

成員變量 字段 機制 () 程序 轉換 默認 數據 統一   深入理解Class對象    RRTI的概念以及Class對象作用    認識Class對象之前,先來了解一個概念,RTTI(Run-Time Type Identification)運行時類型識別,對於這個詞一

深入理解ceph-disk運行機制

意圖 gui for ons 簡單介紹 water 自動化 深入理解 /var/ 谷忠言 一,背景 目前項目所用的ceph集群內部的一個節點, 一般需要管理大約十塊硬盤左右的數據存儲空間,外加一到兩塊ssd組成的journal空間。Ceph要求每個osd對應的數據盤掛載到特

Android 異步消息處理機制前篇(二):深入理解Message消息池

連接 guid ply 指針 cau ann 區別 就會 消息處理機制 版權聲明:本文出自汪磊的博客,轉載請務必註明出處。 上一篇中共同探討了ThreadLocal,這篇我們一起看下常提到的Message消息池到底是怎麽回事,廢話少說吧,進入正題。 對於稍有經驗的開發人員來

深入理解asp.net裏的HttpModule機制

img 決定 來講 sessions test 需要 mce 應該 cat 轉自http://jeffwongishandsome.cnblogs.com/ 1、asp.net的HTTP請求處理過程說明:(1)、客戶端瀏覽器向服務器發出一個http請求,此請求會被ineti

深入理解Dalvik虛擬機- 解釋器的執行機制

util dlink stat counter before expose 加鎖 enter 機制 Dalvik的指令運行是解釋器+JIT的方式,解釋器就

iOS runtime探究(二): 從runtime開始深入理解OC消息轉發機制

phoenix face exp nslog void string ams ber 解釋 你要知道的runtime都在這裏 轉載請註明出處 http://blog

深入理解虛擬機之虛擬機類加載機制

Java JVM Java面試通關手冊(Java學習指南,歡迎Star,會一直完善下去,歡迎建議和指導):https://github.com/Snailclimb/Java_Guide 《深入理解Java虛擬機:JVM高級特性與最佳實踐(第二版》讀書筆記與常見相關面試題總結 本節常見面試題(推薦帶著