[技術源於藝術, 藝術源於生活]前端
這是我第一次發佈程序相關的技術文章, 10年前發表過不少關於3dsmax和maya的技術文章linux
有人無故轉載個人文章, 因此這裏留一個個人聯繫方式, 歡迎討論 郵箱: kekuer@gmail.com qq: 5513219nginx
在個人文章中已經屢次提到alpine, 輕量, 全面, 最好的docker系統鏡像, 我目前已經普遍使用到生產環境, 主要好處是在下降自docker registry的磁盤暫用(目前我使用的是aws s3), 而且下降本地鏡像構建push到online的registry的速度, 減小了部署所花費的沒必要要時間消耗.docker
在alpine中rsync是有apk安裝包, 只須要apk --update add rsync 便可安裝 (在alpine 3.3中提供的是3.1.1版本的rsync)apache
alpine的官方wiki中提供了一篇製做鏡像的文章, 我也是參考該文章完成本地鏡像製做 How to setup a Alpine Linux mirror 在該文章中能夠找到alpine源的同步地址: rsync://rsync.alpinelinux.org/alpine/緩存
經過查看alpine現有官方源 能夠了解alpine源目錄結構, 方便在同步的時候排除不使用的資源, 好比: v2.x的早期版本, 減小同步時間和磁盤消耗.bash
在alpine中lighttpd是有apk安裝包, 只須要apk --update add lighttpd 便可安裝 官方在這裏選擇了lighttpd, 我認爲主要由於其配置簡單; 按照之前的項目實施, lighttpd主要應用在文件下載服務器上, 所以也算對味. 根據本身的經驗, 可使用nginx或者apache來驅動, 該文章再也不贅述.服務器
在alpine中supervisor是有apk安裝包, 只須要apk --update add supervisor 便可安裝 爲何會有它? 文章後面會有介紹ide
rsync 比較簡單, 經過--help選項能夠查看到全部的選項, rsync官方描述都很清晰, 我這裏只對咱們須要使用的幾個參數作介紹:學習
a) -p (preserve permissions): 保持同步源的文件權限, 也就是原來是文件是0664, 同步過來也是0664
b) -r (recurse into directories): 就是遞歸目錄, 保持全部子目錄內文件同步
c) -u (skip files that are newer on the receiver)
d) -a (archive mode; equals -rlptgoD (no -H,-A,-X))
e) --progress (show progress during transfer) 用來查看同步進度
f) --delete (delete extraneous files from destination dirs) 刪除同步目錄中在源中不存在的文件
g) --timeout (set I/O timeout in seconds) 設置同步中I/O的超時時間(秒)
h) delay-updates (put all updated files into place at transfer's end) 文件同步完成後纔將文件放入同步目錄, 這點比較重要, 防止apk文件有錯
i) --delete-after (receiver deletes after transfer, not during)
j) --hard-links (preserve hard links) 同步硬連接
k) --exclude (exclude files matching PATTERN) 禁止匹配的文件同步
具體的不須要同步的文件匹配符, 能夠根據你本身的需求來指定, 我只關心>=3.3的x86_64版本的apk, 測試時候會使用edge, latest-stable, 全部個人exclude配置文件以下:
v2.*/ v3.0/ v3.1/ v3.2/ armhf/ x86/
綜上: 咱們須要執行的bash命令是:
/usr/bin/rsync \ -prua \ --progress \ --exclude-from /conf/exclude \ --delete \ --timeout=120 \ --delay-updates \ --delete-after \ --hard-links
lighttpd 配置也比較簡單, 分爲啓動參數和配置參數(lighttpd.conf), 我這裏只對咱們須要使用的幾個參數作介紹:
# 申明變量 var.basedir = "/var/www" var.statedir = "/var/lib/lighttpd" # http監聽端口 server.port = 8089 # 加載必要模塊 server.modules = ( "mod_access", "mod_setenv", "mod_accesslog" ) # 包含文件擴展名解析mime類型conf文件 include "/etc/lighttpd/mime-types.conf" # 配置服務器日誌到控制檯, 用於docker收集日誌 server.errorlog = "/dev/stderr" accesslog.filename = "/dev/stdout" # 指定http根路徑, 這裏用到頂部申明的變量 server.document-root = var.basedir + "/alpine" # 指定pid路徑 server.pid-file = "/var/run/lighttpd.pid" # 容許列出文件列表 dir-listing.activate = "enable" # 禁止對隱藏文件列表 dir-listing.hide-dotfiles = "enable" # 禁止訪問如下目錄及文件 (對該項目意義不大, 只是習慣加上好點, 也就用了一個官方默認的參數) url.access-deny = ("~", ".inc") # 強制全部緩存都須要到服務器驗證, 主要避免本地緩存的錯誤(就本身用, 也不用太考慮服務器壓力了), 具體的能夠看下http header中Cache-control部分的介紹 setenv.add-response-header += ("Cache-Control" => "must-revalidate")
綜上: 咱們須要執行的bash命令是:
/usr/sbin/lighttpd -D -f /conf/lighttpd.conf
須要思考一個問題: 作成1個鏡像(包含rsync和lighttpd)仍是2個鏡像(分開, 而後使用docker-compose啓動)?
我選擇的是作一個鏡像, 由於畢竟這個不屬於生產環境的應用, 由於我習慣在本地打包鏡像而後push到生產環境, 而後再run, 因此我選擇生成1個鏡像. 生成一個鏡像的話, 咱們須要keepalive這2個進程, 最容易想到的就是supervisor
a) -n (run in the foreground) 保持在前端運行, 主要用於docker鏡像, (也能夠在配置文件配置)
b) -c (configuration file) 指定配置文件
[supervisord] ; 啓動到前端, 用於docker nodaemon=true ; 設置pid文件路徑 pidfile=/var/run/supervisord.pid ; 配置rsync [program:rsync] ; 配置日誌輸出到控制檯, 用於docker收集日誌 stdout_logfile=/dev/stdout ; 去掉日誌rotation stdout_logfile_maxbytes=0 autorestart=true command=/usr/bin/rsync -prua --progress --exclude-from /conf/exclude --delete --timeout=120 --delay-updates --delete-after --hard-links rsync://rsync.alpinelinux.org/alpine/ /var/www/alpine ; 配置lighttpd [program:lighttpd] ; 配置日誌輸出到控制檯, 用於docker收集日誌 stdout_logfile=/dev/stdout ; 去掉日誌rotation stdout_logfile_maxbytes=0 autorestart=true command=/usr/sbin/lighttpd -D -f /conf/lighttpd.conf
綜上: 咱們須要執行的bash命令是:
/usr/bin/supervisord -c /conf/supervisord.conf
FROM alpine:3.3 MAINTAINER Alpine Mirror Docker Maintainers "kekuer@gmail.com" RUN echo "http://127.0.0.1:8098/main" > /etc/apk/repositories && \ apk --update add rsync lighttpd supervisor ADD conf /conf EXPOSE 8089 ENTRYPOINT ["/usr/bin/supervisord"] CMD ["-c", "/conf/supervisord.conf"]
echo "http://127.0.0.1:8098/main" > /etc/apk/repositories 這句根據本身狀況添加, 我是由於我以前已經有一個本地鏡像
docker run -id --name alpine-mirror -p 8089:8089 funwun.io/alpine-mirror:1.0
根據狀況能夠掛載alpine鏡像目錄, 避免刪除container後失去鏡像 docker run -id -v /alpine:/var/www/alpine --name alpine-mirror -p 8089:8089 funwun.io/alpine-mirror:1.0
涉及的知識點仍是比較多, 每一個應用均可以寫一本書, 咱們這裏只是選擇了要用的部分, 具體的使用你們能夠多學習一下相關知識