Alpine Linux Repository本地鏡像製做 v2

0. 前言

[技術源於藝術, 藝術源於生活]前端

  1. 這是我第一次發佈程序相關的技術文章, 10年前發表過不少關於3dsmax和maya的技術文章linux

  2. 有人無故轉載個人文章, 因此這裏留一個個人聯繫方式, 歡迎討論   郵箱: kekuer@gmail.com       qq: 5513219nginx

1. 背景

在個人文章中已經屢次提到alpine, 輕量, 全面, 最好的docker系統鏡像, 我目前已經普遍使用到生產環境, 主要好處是在下降自docker registry的磁盤暫用(目前我使用的是aws s3), 而且下降本地鏡像構建push到online的registry的速度, 減小了部署所花費的沒必要要時間消耗.docker

2. 準備

2.1. rsync的使用

在alpine中rsync是有apk安裝包, 只須要apk --update add rsync 便可安裝 (在alpine 3.3中提供的是3.1.1版本的rsync)apache

2.2. alpine的官方源地址

alpine的官方wiki中提供了一篇製做鏡像的文章, 我也是參考該文章完成本地鏡像製做 How to setup a Alpine Linux mirror 在該文章中能夠找到alpine源的同步地址: rsync://rsync.alpinelinux.org/alpine/緩存

2.3. 瞭解alpine源目錄結構

經過查看alpine現有官方源 能夠了解alpine源目錄結構, 方便在同步的時候排除不使用的資源, 好比: v2.x的早期版本, 減小同步時間和磁盤消耗.bash

2.4. 使用lighttpd驅動http

在alpine中lighttpd是有apk安裝包, 只須要apk --update add lighttpd 便可安裝 官方在這裏選擇了lighttpd, 我認爲主要由於其配置簡單; 按照之前的項目實施, lighttpd主要應用在文件下載服務器上, 所以也算對味. 根據本身的經驗, 可使用nginx或者apache來驅動, 該文章再也不贅述.服務器

2.5. 使用supervisor驅動2個應用在同一個docker container

在alpine中supervisor是有apk安裝包, 只須要apk --update add supervisor 便可安裝 爲何會有它? 文章後面會有介紹ide

3. 實施

3.1. 使用rsync同步alpine官方提供的源

3.1.1. 啓動參數

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.1.2. exclude文件配置

具體的不須要同步的文件匹配符, 能夠根據你本身的需求來指定, 我只關心>=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

3.2. lighttpd驅動http

lighttpd 配置也比較簡單, 分爲啓動參數和配置參數(lighttpd.conf), 我這裏只對咱們須要使用的幾個參數作介紹:

3.2.1. 啓動參數
a) -f (filename of the config-file) 指定配置文件
b) -D (don't go to background (default: go to background)) 保持在前端運行, 主要用於後期構建docker鏡像用
3.2.2. 配置文件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

3.3. supervisor啓動多任務

須要思考一個問題: 作成1個鏡像(包含rsync和lighttpd)仍是2個鏡像(分開, 而後使用docker-compose啓動)?

我選擇的是作一個鏡像, 由於畢竟這個不屬於生產環境的應用, 由於我習慣在本地打包鏡像而後push到生產環境, 而後再run, 因此我選擇生成1個鏡像. 生成一個鏡像的話, 咱們須要keepalive這2個進程, 最容易想到的就是supervisor

3.3.1. 啓動參數

a) -n (run in the foreground) 保持在前端運行, 主要用於docker鏡像, (也能夠在配置文件配置)

b) -c (configuration file) 指定配置文件

3.3.2. 配置文件supervisord.conf
[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

3.4. 製做docker鏡像

3.4.1. Dockerfile
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 這句根據本身狀況添加, 我是由於我以前已經有一個本地鏡像

3.4.2. 運行container
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

4. 結語

涉及的知識點仍是比較多, 每一個應用均可以寫一本書, 咱們這裏只是選擇了要用的部分, 具體的使用你們能夠多學習一下相關知識

相關文章
相關標籤/搜索