如何做出好的 Docker Image

Docker 愈來愈紅,而 image 也愈來愈多,於是就有人討論要如何做出好的 Docker image。

在「Building good docker images」這篇文章裡提到了不少現象以及改善的技巧。

首先是 base image 的選用。除非有特別的理由,不然作者建議是基於 debian:wheezy (85MB) 而非 ubuntu:14.04 (195MB)。甚至在某些極端的情況下,你可以選擇 busybox (2MB)。

再來是沒事不要塞 build tools 進去,除非那是之後執行必要的東西。

然後是避免暫存檔的產生,作者舉的例子還蠻容易懂的。這樣是 109MB:

FROM debian:wheezy
RUN apt-get update && apt-get install -y wget
RUN wget http://cachefly.cachefly.net/10mb.test
RUN rm 10mb.test

而這樣只有 99MB,原因是每一個 RUN 都會疊一層上去:

FROM debian:wheezy
RUN apt-get update && apt-get install -y wget
RUN wget http://cachefly.cachefly.net/10mb.test && rm 10mb.test

所以,同樣的道理,要避免暫存檔時,可以考慮這種寫法:

wget -O - http://nodejs.org/dist/v0.10.32/node-v0.10.32-linux-x64.tar.gz | tar zxf -

以及裝完後馬上 clean:

FROM debian:wheezy
RUN apt-get update && apt-get install -y wget && rm -rf /var/lib/apt/lists/*

後面還有一些技巧,不過前面講的空間問題比較重要。

MySQL 5.7 的 InnoDB Buffer Pool Size 可以動態調整

出自「Resizing the InnoDB Buffer Pool Online」這邊,在 manual 上「Resizing the InnoDB Buffer Pool Online」也可以看到說明。

innodb_buffer_pool_size 變得可以動態調整,表示在抓 InnoDB 在記憶體裡的大小時更容易微調,不用花很長的時間去觀察調整... 小功能但應該會很好用?

設定 CloudFront 的 Wildcard SSL (SNI)

不知道為什麼網路上一堆文章寫的超複雜 XD

目前必須使用 CLI 才能上傳 key 與 SSL certificate,所以乖乖的裝上 aws-cli 吧 :p

而通常在買 Wildcard SSL 時會 *.example.com 的時候會簽成 example.com + *.example.com,這時候用 example.com 當名字掛進去:

aws iam upload-server-certificate --server-certificate-name example.com --certificate-body file://server.crt --private-key file://server.key --certificate-chain file://intermediate.crt --path /cloudfront/

一樣可以確認:

aws iam get-server-certificate --server-certificate-name example.com

會改到的幾個部份用粗體標出來了。

上傳完成後就可以到 Web Console 上的 CloudFront 部份設定了。

主要是參考「Building a CDN over SSL with CloudFront and SNI」這篇文章的說明,再加上一些亂試後去翻文件確認的結果 :o

XSScrapy:自動化 XSS 攻擊

也是不知道在哪邊看到的,反正容易安裝就裝起來玩玩看:「XSScrapy: fast, thorough XSS vulnerability spider」。XSScrapy 是一套自動化攻擊軟體,是目前這類測試軟體裡用起來最簡單的版本。

直接 clone 下來就可以執行了,如果有遇到 dependency 的問題,可以透過 pip 安裝:

pip install -r requirements.txt

執行的方法就這樣:

./xsscrapy.py -u http://example.com

上面這個方法是在訪客模式下慢慢跑,你也可以給他一組帳號密碼讓他填 form,他會試著登入後不斷打下去:

./xsscrapy.py -u http://example.com/login_page -l loginname -p pa$$word

也可以用 HTTP Basic Authentication:

./xsscrapy.py -u http://example.com/login_page -l loginname -p pa$$word --basic

然後發現的問題會寫到 XSS-vulnerable.txt 裡面:

XSS vulnerabilities are reported in XSS-vulnerable.txt

用法就這樣而已... XD

由 RSA Key 產生 CSR 的方法 (OpenSSL)

從「OpenSSL CSR with Alternative Names one-line」這篇看到的方法,一行解決,可以寫到 Makefile 之類的地方處理?

給了兩個範例:

openssl req -new -key endpoint.com.key -sha256 -nodes -subj '/C=US/ST=New York/L=New York/O=End Point/OU=Hosting Team/CN=www.endpoint.com/emailAddress=administrative-not-existent-address@our-awesome-domain.com/subjectAltName=DNS.1=endpoint.com' > www.endpoint.com.csr

以及:

openssl req -new -key endpoint.com.key -sha256 -nodes -subj '/C=US/ST=New York/L=New York/O=End Point/OU=Hosting Team/CN=www.endpoint.com/emailAddress=administrative-not-existent-address@our-awesome-domain.com/subjectAltName=DNS.1=endpoint.com,DNS.2=usually-not-convered-domain.endpoint.com,DNS.3=multiple-domains-crt.endpoint.com' > www.endpoint.com.csr

記錄起來,以後應該還用的到 :p