2017/6/19

Volumio2


Volumio 是支援類似 Raspberry Pi 等多款小電腦主機的音樂播放器,只要有一台 Raspberry Pi,就能夠接上網路上的串流、區域網路內的音樂庫、YouTube,進行音樂的播放。


內建的 Audio Out 就能夠播放音樂,但如果要得到更高語音品質的音樂輸出,則需要再購買 USB Speaker 或是 USB/I2S DAC。


安裝 volumio2 只要到 DOWNLOAD VOLUMIO FOR YOUR PLATFORM 網頁下載 Raspberry Pi 的 image,燒錄到 micro sdcard,直接用 RPi 開機就可以運作。


網路設定


如果直接接上 RPi console,可以用


帳號: volumio
密碼: volumio

登入進入 RPi,root 的密碼也是 volumio。


但基本上是 console mode。


volumio 必須要用 browser 進去設定以及使用,主畫面就像下面這樣。



我們除了設定連接到 NAS 的音樂庫,另外還下載了 YouTube Plugin。


設定「播放選項」


因為我沒買 DAC,在設定播放的輸出裝置時,一直發現一些問題,最後就是參考這個網頁


LIBRARY UPDATE: SEEMS TO CRASH VOLUMIO ON RASPI


把 /boot/cmdline.txt 裡面


由
"smsc95xx.turbo_mode=N"
改為
"smsc95xx.turbo_mode=Y"

另外把音量選項的 Mixer Type 改為 Software,就能運作了。


輸出裝置


RPi 內建的 Audio Out 聲音效果很差,會聽到很多雜音。


後來把一個 USB Speaker 接上 RPi,也沒有裝 Driver,就能在輸出設備中選到該 USB Speaker,聲音的品質改善很多。


APP


Volumio iOS 是個非常好用的工具,在 LAN 裡面把 app 打開,馬上就自動連接到 LAN 的 volumio。



References


Raspberry Pi 的應用 - 連音響發燒友也愛用的音樂播放器:Volumio


Raspberry Pi 的應用 - 數位音樂播放器的再進化:Volumio 2

2017/6/12

如何備份、還原處理 RPi 的 sdcard image


Raspberry Pi 使用的 sdcard 雖然同樣是 16GB,但因為不同廠牌還是有些大小的差異,備份跟還原 sdcard 有些問題,畢竟大檔案的 image 不能還原到稍小的 sdcard 中。


以下紀錄如何備份、還原及縮小 RPi 的 sdcard。


在 MAC 處理 image


  • 使用 [SD Formatter] 可格式化 SD Card

sudo newfs_msdos -F 16 /dev/disk2

  • RASPBIAN 下載 RASPBIAN JESSIE WITH PIXEL,取得 2016-09-23-raspbian-jessie.zip 解壓縮得到2016-09-23-raspbian-jessie.img

  • 重新插入 SD Card,用以下指令的結果,得知 SD Card 在 /dev/disk2 或是 /dev/disk1


diskutil list

/dev/disk0 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:      GUID_partition_scheme                        *480.1 GB   disk0
   1:                        EFI EFI                     209.7 MB   disk0s1
   2:                  Apple_HFS Macintosh HD            479.2 GB   disk0s2
   3:                 Apple_Boot Recovery HD             650.0 MB   disk0s3
/dev/disk2 (internal, physical):
   #:                       TYPE NAME                    SIZE       IDENTIFIER
   0:     FDisk_partition_scheme                        *15.9 GB    disk2
   1:             Windows_FAT_32 NO NAME                 15.9 GB    disk2s1

  • umount disk2

sudo diskutil unmountDisk /dev/disk2

  • 將 img 寫入 sdcard

如果 rdisk2 有問題,就改成 disk2


sudo dd bs=1m if=~/Downloads/2016-09-23-raspbian-jessie.img of=/dev/rdisk2

  • 將 sdcard dump 到 image

sudo dd bs=1m if=/dev/rdisk2 of=~/Downloads/messenger_20170405.img

在 RPi 開機狀態直接備份 sdcard


在 RPi 上,將新的 sdcard 放入 USB sdcard Reader 接上 RPi


sudo fdisk -l

如果是 Disk /dev/mmcblk0 的設備,就是 RPi 上原始的 sdcard,以 USB sdcard Reader 接上 RPi 後,會看到增加的 /dev/sda 設備,這是新的 sdcard


下載 rpi-clone


git clone https://github.com/billw2/rpi-clone.git
sudo cp rpi-clone/rpi-clone /usr/local/sbin
rm -rf rpi-clone

用以下指令就可以將 sdcard 複製到 新的 sdcard 上


sudo rpi-clone sda -v -x

在 Windows 處理 sdcard image


使用 Win32 Disk Imager 軟體就可以備份及還原 image


縮小 RPi image


使用 PiShrink 可以在 linux 縮小 RPi image


wget https://raw.githubusercontent.com/Drewsif/PiShrink/master/pishrink.sh

chmod +x ./pishrink.sh

sudo ./pishrink.sh ./raspbian_backup.img

以下是執行結果,可看到檔案縮小了 2G


Creating new /etc/rc.local
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/loop0: 301607/960992 files (0.2% non-contiguous), 3200117/3841024 blocks
resize2fs 1.41.12 (17-May-2010)
resize2fs 1.41.12 (17-May-2010)
Resizing the filesystem on /dev/loop0 to 3208948 (4k) blocks.
Begin pass 2 (max = 228392)
Relocating blocks             XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 3 (max = 118)
Scanning inode table          XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
Begin pass 4 (max = 25082)
Updating inode references     XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
The filesystem on /dev/loop0 is now 3208948 blocks long.

Shrunk ./raspbian_backup.img from 15G to 13G

References


How to Clone Raspberry Pi SD Card on Windows, Linux and macOS


Backup (or Clone) a Raspberry Pi SD Card


用 Win32 Disk Imager 備份和燒錄 Raspberry Pi 的 SD 卡

2017/6/5

倖存者偏差 survivorship bias


倖存者偏差(Survivorship Bias),就是只有存活下來的人,才會被後人看到,因此我們在分析資訊的時候,非常容易忽略掉那些被淘汰的競爭者,造成對局勢的評估過分樂觀,甚至導出完全相反的結論!


在觀察不熟悉的產業時,往往被這種倖存者偏差所蒙蔽,報章雜誌更是時常針對那些所謂成功的企業案例。實際上,這些結果論的成功故事所歸納出的成功要訣往往只是其中一小塊拼圖,這些1%的倖存者因為大量曝光的資訊,讓我們以為前景一片看好,我們卻沒有看到其他99%的競爭者早就默默地消失了!由於成功者的能見度壓倒性的高過失敗者,因此,人們總是系統性的高估了獲得成功的希望。


類似的名詞有:隱藏失敗者、沉默的數據、死人不會說話


統計的抽樣方法


抽樣 是一種推論統計方法,從目標總體(Population,母體)中抽取一部分個體作為樣本(Sample),通過觀察樣本的某一或某些屬性,依據所獲得的數據對總體的數量特徵得出具有一定可靠性的估計判斷,從而達到對總體的認識。


學問就在於,如何抽樣,抽樣的個體如何能代表整個母體?統計上有另一個名詞:信賴區間,信賴區間是樣本對某個總體參數的區間估計。信賴區間展現的是,這個總體參數的真實值有一定機率落在與該測量結果有關的某對應區間。


信賴區間會聲稱總體參數的真實值在測量值的區間所具有的可信程度,也就是前面所說的「一定機率」。這個機率被稱為信心水準。


舉例來說,如果在一次大選中某人的支持率為55%,而信心水準0.95上的信賴區間是(50%,60%),那麼他的真實支持率落在50%和60%之區間的機率為95%,因此他的真實支持率不足50%的可能性小於2.5%(假設分布是對稱的)。


在倖存者偏差中,由於抽樣的對象都是整個母體中的倖存者,因此對這些抽樣對象的分析結果,並不能代表整個母體,如果誤信這些倖存者的分析結果,忽略了原本母體中沈默的失敗者,就會造成對局勢過分樂觀的評估結果。


第二次世界大戰


1941年,第二次世界大戰中,美國哥倫比亞大學統計學亞伯拉罕.沃爾德(Abraham Wald)應軍方要求,利用其在統計方面的專業知識來提供關於《飛機應該如何加強防護,才能降低被炮火擊落的機率》的相關建議。


教授針對聯軍的轟炸機遭受攻擊後的數據,進行研究後發現:機翼是最容易被擊中的位置,機尾則是最少被擊中的位置。沃德教授的結論是「我們應該強化機尾的防護」,而軍方指揮官認為「應該加強機翼的防護,因為這是最容易被擊中的位置」。


沃德教授的堅持有以下幾點


  1. 統計的樣本,只涵蓋平安返回的轟炸機
  2. 被多次擊中機翼的轟炸機,似乎還是能夠安全返航
  3. 在機尾的位置,很少發現彈孔的原因並非真的不會中彈,而是一旦中彈,其安全返航的機率就微乎其微

軍方採用了教授的建議,並且後來證實該決策是正確的,看不見的彈痕卻最致命!


這個故事有兩個啟示:一是戰死或被俘的飛行員無法發表意見,所以彈痕數據的來源本身就有嚴重的偏誤;二是作戰經驗豐富的飛行員的專業意見也不一定能提升決策的質量,因為這些飛行員大多是機翼中彈機尾未中彈的倖存者。


基金及股票市場


基金行業會對外宣布,過去10年,基金行業的整體收益率超過100%,你是不是覺得買基金肯定賺翻了?


基金市場中,計算基金類股未來多年走勢時,通常會排除下檔基金的虧損,因此會高估了基金的整體報酬率,因為已經消失在市場的基金,沒有必要列在其中。


如果長期觀察新發行證券的股價發展,並排除已經破產的公司時,也會發現類似的效應。這種「排除」模式導致投資人對未來發展過度樂觀,因為破產公司無法拉低整體的統計數據。


股票指數的表現也會遭遇這類失真問題,因為指數表現較差的股票並不會納入計算,股市指數永遠只會統計表現最亮眼的那些股票。


讀書無用論


很多人在說,某某人當初沒好好上學如今照樣掙大錢,而好多用功讀書的人,畢業後反而不如那些沒好好學習的人混得好。並且因為這樣的例子有很多,所以很多人得出「讀書無用」的結論。


因為高學歷成功者的新聞性不會比低學歷成功者來得高,在報導成功案例時,如果有低學歷,或是輟學的過程,會讓整個故事更具有傳奇性,因此我們常常會聽到這樣的案例,相反的,如果是高學歷的成功者,報導中就不會強調這個部分。


生活中的 倖存者偏差


我親戚的病就是中醫看好的,所以中醫很靈驗。


喝葡萄酒的人比較長壽。


每個成功者都很努力,所以只要努力就能成功。


References


倖存者偏差


可怕的邏輯陷阱 -- 存活者偏差


彈孔最多的地方不需要保護──倖存者偏差


無所不在的生存者誤差 (Survivorship bias)


林斯諺/國外的月亮比較圓?《返校》熱潮的「倖存者偏差」


考研,一定要注意倖存者偏差


倖存者偏差是什麼意思?


3 - 6 信賴區間與信心水準的解讀

2017/5/22

監督式機器學習方法 Supervised Machine Learning: 生成模型 (Generative Model) 與判別模型 (Discriminative Model)


機器學習 是人工智慧的一個分支,讓機器透過某種學習方法,實現並解決人工智慧中的一些問題。機器學習演算法是從資料中自動分析獲得規律,並利用規律對未知資料進行預測的演算法。學習演算法需要用到大量的統計學理論,也被稱為統計學習理論。


Machine Learning 的分類


  1. 監督學習:從給定的訓練資料集中學習出一個函式,當新的資料到來時,可以根據這個函式預測結果,訓練資料中的目標是人工標註的。

  2. 無監督學習:與監督學習相比,訓練資料沒有人為標註的結果。常見的無監督學習演算法有聚類分析 Cluster Analysis

  3. 半監督學習:介於監督學習與無監督學習之間。

  4. 增強學習:通過觀察來學習做成如何的動作。每個動作都會對環境有所影響,學習物件根據觀察到的周圍環境的反饋來做出判斷。


監督式機器學習方法 Supervised Learning


監督式機器學習方法 Supervised Learning 是 Machine Learning 中的一個方法,可以由訓練資料中學到或建立一個模式(函數 / learning model),並依此模式推測新的實例,換句話說,任務就是在觀察完一些訓練範例(輸入和預期輸出)後,利用這個函數去對任何可能出現的輸入的值,預測輸出的結果。


訓練資料是由輸入物件(通常是向量)和期待的輸出所組成。函數的輸出可以是一個連續的值(稱為迴歸分析),或是預測一個分類標籤(稱作分類)。


監督式機器學習方法可以分為生成方法和判別方法兩類,常見的生成方法有混合高斯模型、樸素貝葉斯法和隱形馬爾科夫模型等,常見的判別方法有SVM、LR等,生成方法學習出的是生成模型,判別方法學習出的是判別模型。


生成模型就是能夠隨機生成觀測數據的模型,也就是對影像、聲音以及對現實世界的一切其他實物(representations)進行創造的系統。如果 AI 學會了建立現實世界中的種種細節,例如現實中的圖像和聲音,這將幫助 AI 更好地理解現實世界的結構。


生成模型與判別模型的比較


生成式模型和判別式模型的區別很像人和機器的區別:機器採取的是完美主義,因為它可以不斷優化,追求極致。而人是把事情做得夠好就滿足了。


因為人類的構造天生跟機器不同,所以人類不需要跟 Alpha Go 比賽圍棋分出高下,Alpha Go 只專注在做圍棋這件事,並把它做到極限。


生成模型是所有變量的全機率模型,而判別模型是在給定觀測變量值前提下,觀測目標變量條件機率模型。


生成模型能夠用於模擬(即生成)模型中任意變量的分布情況,而判別模型只能根據觀測變量得到目標變量的樣本。


判別模型不提供觀測變量的分布建模,因此它不能夠表達觀測變量與目標變量之間更複雜的關係。因此,生成模型適用於無監督的任務,如分類和聚類。


由生成模型可以得到判別模型,但由判別模型得不到生成模型。


生成模型收斂速度比較快,如果樣本數量較多時,生成模型能更快地收斂於真實模型。生成模型中的聯合分佈能提供更多的資訊,但也需要更多的樣本和更多計算。




例如我們有一個輸入數據x,然後我們想將它分類為標籤y。最自然的做法就是條件概率分佈p(y|x),這就是為什麼我們對其直接求p(y|x)方法叫做判別模型演算法。生成模型學習聯合概率分佈p(x,y),p(x,y)可以通過貝葉斯方法轉化為p(y|x),然後再用其分類。但是p(x,y)還有其他作用,例如,你可以用它去生成(x,y)。


假設我們有以下(x,y)形式的數據:(1,0), (1,0), (2,0), (2, 1)


那麼p(x,y)是:y 共有四種結果,0,0,0,1,產生的機率分別是 1/4,其中前面兩個 0,0,它的 x 都是 1,所以當 x 為 1,產生出 y 為 0 的機率是 1/4+1/4 = 1/2,不可能產生 y=1 的狀況,所以機率為0。而當 x 為 2,產生出 y 為 0 的機率是 1/4,產生出 y 為 1 的機率也是 1/4。目標是要生成 y,所以生成 y 的所有機率總和為 1。


            y=0   y=1

           -----------

   x=1 | 1/2   0

   x=2 | 1/4   1/4

而p(y|x) 是:因為當 x =1,y 一定為 0,所以在 x 為 1 的基本條件下,y 為 0 的機率為 1,如果 x = 2 的條件下,y 有 0 或 1 兩種可能,發生的機率分別是 1/2。目標是先以 x 為基本條件,在給定 x 之後,得到 y 的機率分佈。


           y=0   y=1

           -----------

    x=1| 1     0

    x=2| 1/2   1/2



如果有某項工作是要識別一個語音屬於哪種語言,有兩種方法達到這個目的:


1、把所有語言先都學會,然後就能識別任何一段新的語音了。


2、不去學習每一種語言,只學習這些語言模型之間的特徵及差別,然後再分類。只要學會了漢語和英語等語言的發音的差別,直接用這樣的差異去分類就好了。


第一種方法就是生成方法,第二種方法是判別方法。


生成算法嘗試去找到底這個數據是怎麼產生的,然後再對一個信號進行分類。基於你的生成假設,那個類別的資料最有可能產生這個信號,這個信號就屬於那個類別。判別模型不關心數據是怎麼生成的,它只關心信號之間的差異,然後用差異來簡單對給定的一個信號進行分類。




生成模型:一般是學習一個代表目標的模型,然後通過它去搜索圖像區域,然後最小化重構誤差。類似於生成模型描述一個目標,然後就是模式匹配了,在圖像中找到和這個模型最匹配的區域,就是目標了。


判別模型:將跟蹤問題看成一個二分類問題,找到目標和背景的決策邊界。它不管目標是怎麼描述的,只知道目標和背景的差異,然後你給一個新的圖像,看它屬於那一邊,就歸為哪一類。


生成式對抗網絡 GenerativeAdverserial Network GAN


有兩個系統,在互相對抗,兩個系統都試圖優化自己的目標函數。第一個系統對應判別式模型D:判別式模型D在試圖識別到來的樣本是否是自然真實的;它在儘量增大對真實樣本的識別率,同時減少對模擬生成的樣本的誤判率。


另一個系統則對應著生成式模型G:G希望它生成的模擬樣本可以在D那裡魚目混珠。 所以G試圖最大可能地產生真實的樣本。判別器D從判別角度來說,判別的越好,D的目標實現的就越強大。


但對於生成器G來說,它要最小化(minimize)對方的優化函數,這就相當於最大化(maximize)它自己的優化函數。這個過程就像G和D在下棋一樣。


用一個AI對現實世界的圖像進行創造,再用另一個AI去分析結果並對圖像的真偽進行識別。兩個系統在競爭中不斷成長,最後兩個都達到最佳化。


將二者的關係想像成一個藝術家和一個文藝批評家。作為藝術家,生成模型希望愚弄藝術批評家,讓後者認為它畫出來的東西是真實的。因為藝術批評家努力地將這些畫辨認為假畫,藝術家慢慢學會了如何摹擬那些真的東西,而這原本只靠它自己是做不到的。


References


楊強教授漫談《西部世界》、生成式對抗網絡及遷移學習


機器學習中的貝氏定理:生成模型 (Generative Model) 與判別模型 (Discriminative Model)


生成模型與判別模型


機器學習“判定模型”和“生成模型‘有什麼區別?


生成模型和判別模型


生成模型 wiki


判别模型 wiki


機器學習常用算法梳理


GAN誕生記:最火的AI模型,來自一群博士的酒後爭吵

2017/5/15

以 docker 測試網站


docker container 本身並沒有 persistence 的機制,但可以透過共享 valume 的方式,將本地機器的某個實體的路徑,綁定到 container 中,由於 container 疊加式的文件檔案系統,我們還是會覺得只有一個檔案系統。


靜態網站


在 sample 目錄中,製作一個 Dockerfile 檔案


FROM ubuntu:latest
MAINTAINER yaocl
ENV REFRESHED_AT 2016-12-23

# 安裝 ngnix
RUN apt-get -yqq update && apt-get -yqq install nginx

# 建立 website 目錄
RUN mkdir -p /var/www/html/website

# 調整 nginx 設定
ADD nginx/global.conf /etc/nginx/conf.d/
ADD nginx/nginx.conf /etc/nginx/

# TCP Port 80
EXPOSE 80

另外準備兩個 nginx 設定檔:


nginx/global.conf


server {
        listen          0.0.0.0:80;
        server_name     _;

        root            /var/www/html/website;
        index           index.html index.htm;

        access_log      /var/log/nginx/default_access.log;
        error_log       /var/log/nginx/default_error.log;
}

nginx/nginx.conf


user www-data;
# process 數量
worker_processes 4;
# 紀錄 process id
pid /run/nginx.pid;

# 不讓 nginx 進入 daemon 狀態,以前景執行,否則會讓 container 啟動後直接停掉
daemon off;

events {  }

http {
  sendfile on;
  tcp_nopush on;
  tcp_nodelay on;
  keepalive_timeout 65;
  types_hash_max_size 2048;
  include /etc/nginx/mime.types;
  default_type application/octet-stream;
  access_log /var/log/nginx/access.log;
  error_log /var/log/nginx/error.log;
  gzip on;
  gzip_disable "msie6";
  include /etc/nginx/conf.d/*.conf;
}

在 website 目錄,放一個 index.html 網頁。


所有檔案的目錄結構為


sample\
    Dockerfile
    nginx\
        global.conf
        nginx.conf
    website\
        index.html

以 build 指令產生 docker image


docker build -t yaocl/nginx .

可透過 history 查看 image 的過程


docker history yaocl/nginx

啟動 container,以 -v 將 website 目錄綁定為 container 的 /var/www/html/website 目錄,覆蓋掉原本在 image 中的那個目錄,我們就可以修改 website 的網頁,並即時由 browser 看到網頁的結果。


$ docker run -d -p 80:80 --name website \
    -v $PWD/website:/var/www/html/website \
    yaocl/nginx nginx
b64855fbfc6bb313c9190eeead2f1d433d28b9d759dba85d06399841e0ef9f78

如果加上 :ro ,就變成 readonly,rw 則是可讀寫


docker run -d -p 80:80 --name website \
    -v $PWD/website:/var/www/html/website:ro \
    yaocl/nginx nginx

連結兩個 container


如果我們需要用到兩個 containers,其中一個用來執行 application server,另一個執行 redis或 db,這時候有兩種方式,可以讓兩個 containers 可以互相連結使用服務。


我們建立一個 redis image 跟 container,另外產生一個只有 os 的 container,讓測試讓後面那個 container 可以用 redis-cli 連結到 redis server。


產生 redis db server 的 Dockerfile


FROM ubuntu:latest
MAINTAINER yaocl
ENV REFRESHED_AT 2016-12-23

RUN apt-get -yqq update && apt-get -yqq install redis-server redis-tools

EXPOSE 6379

ENTRYPOINT ["/usr/bin/redis-server"]
CMD []

產生 redis image,並啟動 container


docker build -t yaocl/redis .

docker run -d -p 6379:6379 --name redis yaocl/redis

如果剛剛沒有指定主機的 port 可以用 port 指令查詢 port


$ docker port redis 6379
0.0.0.0:6379

以本機的 redis-cli 測試 redis:6379


$ redis-cli -h 127.0.0.1 -p 6379
127.0.0.1:6379>



要從 container: redis-cli 連接到 redis,有兩種方式,一種是使用 docker 的內部網路 network stack,安裝 docker 時就會建立一個 docker0 的網路介面,每一個 docker container 都會在這個網路上分配到獨立的 172.16~172.30 這個範圍的 ip。


預設這些網路之間不能互相連接,如果搭配修改 iptables(DNAT),就可以讓 container 互相溝通,但 docker for mac 找不到 docker0 這個 network,如果要測試,可以參考 Docker container networking 的說明。


我們用另一個比較常見的方式,直接讓 container 互相連接。


在 mac 先將 lo0 綁定一個新的 ip


sudo ifconfig lo0 alias 10.200.10.1/24

首先刪除掉剛剛的 redis container


docker stop redis

docker rm redis

重新執行一個 redis container,但不指定 -p 6379


docker run -d --name redis yaocl/redis

redis-cli 的 Dockerfile


FROM ubuntu:latest
MAINTAINER yaocl
ENV REFRESHED_AT 2016-12-23

RUN apt-get update
RUN apt-get -y install inetutils-ping redis-tools

ENTRYPOINT ["/bin/bash"]
CMD []

產生 redis-cli image


docker build -t yaocl/redis-cli .

docker run --name webapp -t -i yaocl/redis-cli

如果不是用 docker for mac,可以用 link 的方式直接將 container 連接起來。


docker run --name webapp --link redis:db -t -i yaocl/redis-cli

啟動 redis-cli container webapp 後,就能直接用 db 這個 hostname 連接到 redis server


root@79bb961c2b78:/# redis-cli -h db
db:6379>

root@79bb961c2b78:/# env
HOSTNAME=79bb961c2b78
DB_NAME=/webapp/db
DB_PORT_6379_TCP_PORT=6379
TERM=xterm
DB_PORT=tcp://172.17.0.2:6379
DB_PORT_6379_TCP=tcp://172.17.0.2:6379
LS_COLORS=rs=0:di=01;34:ln=01;36:mh=00:pi=40;33:so=01;35:do=01;35:bd=40;33;01:cd=40;33;01:or=40;31;01:mi=00:su=37;41:sg=30;43:ca=30;41:tw=30;42:ow=34;42:st=37;44:ex=01;32:*.tar=01;31:*.tgz=01;31:*.arc=01;31:*.arj=01;31:*.taz=01;31:*.lha=01;31:*.lz4=01;31:*.lzh=01;31:*.lzma=01;31:*.tlz=01;31:*.txz=01;31:*.tzo=01;31:*.t7z=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.dz=01;31:*.gz=01;31:*.lrz=01;31:*.lz=01;31:*.lzo=01;31:*.xz=01;31:*.bz2=01;31:*.bz=01;31:*.tbz=01;31:*.tbz2=01;31:*.tz=01;31:*.deb=01;31:*.rpm=01;31:*.jar=01;31:*.war=01;31:*.ear=01;31:*.sar=01;31:*.rar=01;31:*.alz=01;31:*.ace=01;31:*.zoo=01;31:*.cpio=01;31:*.7z=01;31:*.rz=01;31:*.cab=01;31:*.jpg=01;35:*.jpeg=01;35:*.gif=01;35:*.bmp=01;35:*.pbm=01;35:*.pgm=01;35:*.ppm=01;35:*.tga=01;35:*.xbm=01;35:*.xpm=01;35:*.tif=01;35:*.tiff=01;35:*.png=01;35:*.svg=01;35:*.svgz=01;35:*.mng=01;35:*.pcx=01;35:*.mov=01;35:*.mpg=01;35:*.mpeg=01;35:*.m2v=01;35:*.mkv=01;35:*.webm=01;35:*.ogm=01;35:*.mp4=01;35:*.m4v=01;35:*.mp4v=01;35:*.vob=01;35:*.qt=01;35:*.nuv=01;35:*.wmv=01;35:*.asf=01;35:*.rm=01;35:*.rmvb=01;35:*.flc=01;35:*.avi=01;35:*.fli=01;35:*.flv=01;35:*.gl=01;35:*.dl=01;35:*.xcf=01;35:*.xwd=01;35:*.yuv=01;35:*.cgm=01;35:*.emf=01;35:*.ogv=01;35:*.ogx=01;35:*.aac=00;36:*.au=00;36:*.flac=00;36:*.m4a=00;36:*.mid=00;36:*.midi=00;36:*.mka=00;36:*.mp3=00;36:*.mpc=00;36:*.ogg=00;36:*.ra=00;36:*.wav=00;36:*.oga=00;36:*.opus=00;36:*.spx=00;36:*.xspf=00;36:
DB_ENV_REFRESHED_AT=2016-12-23
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
REFRESHED_AT=2016-12-23
PWD=/
DB_PORT_6379_TCP_ADDR=172.17.0.2
DB_PORT_6379_TCP_PROTO=tcp
SHLVL=1
HOME=/root
no_proxy=*.local, 169.254/16
DB_ENV_no_proxy=*.local, 169.254/16
_=/usr/bin/env

root@79bb961c2b78:/# ping db
PING db (172.17.0.2): 56 data bytes
64 bytes from 172.17.0.2: icmp_seq=0 ttl=64 time=0.223 ms
64 bytes from 172.17.0.2: icmp_seq=1 ttl=64 time=0.139 ms

References


The Docker Book


Networking your docker containers using docker0 bridge


How to create a bidirectional link between containers?