使用 Caddy 制作前端 Docker 镜像

简介 今年夏天又开始新的创业项目,忙得没日没夜,好久没写博客了。 但是也许 Docker 越来越火,知乎的专栏每天都有新的人关注,不抽空写点太对不起大家。 之前写过 API 镜像,今天来说说前端镜像。 本文适用于任何一个需要编译的前端框架,我们利用 Docker 的两段构建,用一个 Dockerfile 一气呵成的产出不含源码的生产镜像。 镜像内用了 Caddy 当作服务器,又经过了半年的发展,虽然版本还没到1,但 Caddy 已经足够强大和健壮了。 Caddyfile 为了能让项目在 Caddy 镜像中被访问,我们在项目根目录建一个叫 Caddyfile 的文件,供后续镜像内启动服务时使用。 0.0.0.0:80 root /www gzip log stdout errors stdout 解释一下,我们未来会把编译好的项目放在容器的 /www 目录。 服务器在容器的80端口。启用gzip,并且将日志输出在stdout–这是 Docker 的推荐做法。 Dockerfile 然后就开始我们的二段构建了: # build FROM node:8 as builder ADD . /src WORKDIR /src RUN npm i && npm run build # product FROM abiosoft/caddy COPY --from=builder /src/dist /www COPY Caddyfile /etc/Caddyfile 我们首先使用 node 的官方镜像对项目进行编译,工作目录为 /src ,编译结果为 /src/dist 。 然后我们再将 dist 文件夹复制为 caddy 镜像的 /www 目录。 最后我们将我们的 Caddyfile 覆盖镜像原版的。 ...

2017年10月15日 · 1 分钟 · Hyacinthus

使用 caddy 作为微服务的 API gateway

背景 大家都知道,Docker这些年让IT界产生了深刻的变革, 从开发到测试到运维,处处都有它的身影。 它同时也和微服务架构相互促进,并肩前行。 在最新版的 Docker(CE 17.03) 里,随着 swarm mode 的成熟, 在较简单的场景里已经可以不再需要专门的基础设施管理, 服务编排,服务发现,健康检查,负载均衡等等。 但是API gateway还是需要一个的。或许再加上一个日志收集, 你的微服务架构就五脏俱全了。 我们知道Nginx Plus是可以很好的胜任 API gateway 的工作的, 但它是商业软件。Nginx我们不说认证啊限流啊统计啊之类的功能, 单就请求转发这一点最基本的就出了问题。 我们知道Docker是用DNS的方式,均衡同一名称的服务请求到不同的node, 但是Nginx为了速度,在反向代理的时候会有一个不可取消的 DNS Cache, 这样我们Docker在根据容器的扩展或收缩动态的更新DNS,可Nginx却不为所动, 坚持把请求往固定的IP上发,不说均衡,这个IP甚至可能已经失效了呢。 有一个配置文件上的小Hack可以实现Nginx每次去查询DNS,我本来准备写一篇文章来着, 现在看来不用了,我们找到了更优雅的API gateway, Caddy 。 我上篇文章也写了一个它的简介。 接下来的所有代码,都在这个demo中, 你可以clone下来玩,也能在此基础上做自己的实验。 应用 我们先用golang写一个最简单的HTTP API,你可以用你会的任何语言写出来, 它为GET请求返回 Hello World 加自己的 hostname . package main import ( "io" "log" "net/http" "os" ) // HelloServer the web server func HelloServer(w http.ResponseWriter, req *http.Request) { hostname, _ := os.Hostname() log.Println(hostname) io.WriteString(w, "Hello, world! I am "+hostname+" :)\n") } func main() { http.HandleFunc("/", HelloServer) log.Fatal(http.ListenAndServe(":12345", nil)) } Docker 化 我们需要把上面的应用做成一个docker镜像,暴露端口12345。 接着才有可能使用Docker Swarm启动成集群。 本来做镜像特别简单,但我为了让大家直接拉镜像测试时快一点,用了两步构建, 先编译出应用,然后添加到比较小的alpine镜像中。大家可以不必在意这些细节。 我们还是先来看看最终的docker-compose.yml编排文件吧。 ...

2017年3月16日 · 1 分钟 · Hyacinthus

新兴的web服务器caddy

caddy 是一个像 Apache, nginx, 或 lighttpd 的web服务器。 你要问nginx已经很好了,为什么要用caddy呢? 我觉得caddy最大的特点是用起来简单, 然后呢,它还有下面这些开箱即用的特性: HTTP/2 全自动支持HTTP/2协议,无需任何配置。 Auto HTTPS Caddy 使用 Let’s Encrypt 让你的站点全自动变成全站HTTPS,无需任何配置。当然你想使用自己的证书也是可以的。 Multi-core 因为caddy是golang写的,所以当然可以合理使用多核啦。 IPv6 完全支持IPv6环境. WebSockets Caddy 对WebSockets有很好的支持. Markdown 自动把md转成 HTML ,当然,我后续要给大家介绍更强大的hugo来干这个事情. Logging Caddy 对log格式的定义很容易,更好的满足你日志收集的需求。 Easy Deployment 得益于go的特性,caddy只是一个小小的二进制文件,没有依赖,很好部署。 那么在什么场景下适合尝试使用caddy呢,我推荐从以下场景开始: 作为静态页面的webserver 转发 fastcgi 请求到 php-fpm 服务,比如替换apache或nginx作为wordpress的server 反向代理,管理多个站点 微服务的 API gateway ,我会专门写一篇文章。 有些在nginx上难以开发的需求,为caddy写插件太方便了。 入门 安装caddy 下载 caddy 把caddy放到系统的PATH中,让其可以直接执行。比如Linux中一般习惯放到 /usr/local/bin 简单测试 找一个做测试的临时目录,生成一个测试主页。echo "hello world">index.html 执行 caddy 在另一个终端 curl localhost:2015 或在浏览器访问 (http://localhost:2015) Caddyfile caddy的一个特色就是配置简单,nginx的配置文件群已经越看越晕了。我们来试试: 在当前目录创建这样一个叫Caddyfile的文件: localhost:2020 gzip 这次,我们改变了端口,并且启用了gzip自动压缩数据。运行caddy,去你指定的地址看看吧。 ...

2017年3月12日 · 1 分钟 · Hyacinthus

switch to hugo

我从04年开始写博客 最开始是在 blogger,我是 google fans 嘛。 自己买了域名绑定上去,后来被墙了,又研究了反向代理。 感谢gfw让我第一时间就接触了nginx,远在它流行之前。 后来 GAE 刚出来,很为 google 的云计算平台激动。 我找了个叫microlog的部署在GAE的博客。 刚好还是用我爱的python写的,没事了学习一番。有什么问题也能小改一下。 GAE也让我第一时间就接触了PAAS的云服务,可惜这么多年过去了,IAAS和SAAS都很普及了, PAAS依然不温不火,我估计很多人是担心PAAS 大家也可以看到,这个项目在2011年就不维护了。 那个时候可能用这个博客的人引起了某些注意,开始有大量的广告留言。 我于是转到了著名的wordpress,这个技术博客也是那时候另开的。 很多朋友都自己写一个博客程序,作为练手。 我没有那样做,有时间的话,我还有更多有意义的程序去写。 wordpress其实挺好的,一直在维护,功能完善,生态丰富。 想要写作,是足够了。 我们很有必要把写程序和写博客分清楚。 很多人写出来一个博客程序,却再也不在上边记日志了。 用wordpress的日子里,搬过好几次地方。 最开始是在国内的一个虚拟主机 后来在v2ex被安利了linode,于是买了一个linode 我并没有在大家都去digital ocean的时候再转投 用了四五年后,linode虽然厚道,经常免费升级配置。 可是依然顶不住墙的威力,越来越慢,有时还会被波及需要换IP。 于是又重新在国内备案,转回了国内。 用wordpress后有一段时间微博很火。 我想把博客同步发在微博上。 开始自己写了个微博的第三方应用。 后来顶不住接口经常变,用了多说。 再后来我就不上微博了,直到多说开始有很多垃圾广告过滤不掉, 也弃用了多说。 再后来,我回西安,变得很忙。 很惭愧,没怎么分享技术。 这时开始流行静态博客。 Jekyll , Hexo ,等。 我研究了一阵子,但并没有折腾。 我想有那时间我还不如多写两篇blog– 虽然其实并没有写。 最近,我反思了自己,觉得自己有时瞎忙。 我会督促自己,抽出来一些时间, 整理自己正在研究的知识,分享出来。 现在我要分享更成体系一点的东西。 而不是原来少是解决一些奇怪的工具问题。 进入golang的世界之后,我发现了很多宝藏。 在发现caddy之后,我看到了nginx被革命的先兆。 把自己的 webserver 换到 caddy 自动 http2 ,自动 https ,好酷。 然后又折腾了很久 wordpress 全站 https 化。 ...

2017年3月9日 · 1 分钟 · Hyacinthus