[技术源于艺术, 艺术源于生活]前端
这是我第一次发布程序相关的技术文章, 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
涉及的知识点仍是比较多, 每一个应用均可以写一本书, 咱们这里只是选择了要用的部分, 具体的使用你们能够多学习一下相关知识