副标
Dockerize your Vue Application
dockerfile Vue example
docker Vue example
Vue应用docker容器化打包

docker忽略文件

.dockerignore

node_modules

www.conf

server {
    listen 80;
    #listen [::]:80;
    listen 443 ssl http2;
    #listen [::]:443 ssl http2;

    server_name h5.iamle.com web-app-h5;

    ssl_certificate      /etc/nginx/ssl/star.iamle.com.crt;
    ssl_certificate_key  /etc/nginx/ssl/star.iamle.com.key;
    #ssl_session_cache    shared:SSL:10m;
    ssl_session_timeout  10m;
    ssl_protocols        TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers          HIGH:!aNULL:!MD5;
    ssl_prefer_server_ciphers   on;

    root /var/www/html;
    index index.html;

    location / {
        try_files $uri $uri/ /index.html;
    }

    location /api {
        proxy_pass http://${API_HOST_BASE};
    }

    error_page 500 502 503 504 /50x.html;
    location = /50x.html {
        root html;
    }
}

Dockerfile

# 构建阶段 vue build stage
FROM node:10.16.0-alpine  AS build-stage-node

## 配置 apk包加速镜像为阿里
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

## 安装 一些基础包
RUN apk update \
  && apk upgrade \
  && apk add git \
  && apk add bash \
  #&& apk add nghttp2-dev \
  && apk add ca-certificates \
  && apk add wget \
  #&& apk add curl \
  #&& apk add tcpdump \
  && apk add iputils \
  && apk add iproute2 \
  && apk add libc6-compat \
  && apk add -U tzdata \
  && rm -rf /var/cache/apk/*

# ## 设置 操作系统时区
# RUN rm -rf /etc/localtime \
#   && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 设置 工作目录
ENV MY_HOME=/app
RUN mkdir -p $MY_HOME
WORKDIR $MY_HOME

## 安装 全局依赖
# RUN npm install -g express

# 安装 项目依赖
COPY package.json ./
RUN npm config set registry https://registry.npm.taobao.org \
  && npm set sass_binary_site=https://npm.taobao.org/mirrors/node-sass/ \
  && npm install

# 复制vue项目文件
COPY . .

# 构建
RUN npm run build

RUN ls -lsah /app

# 打包应用
# 生产阶段 nginx
# 使用nginx镜像运行构建物
FROM nginx:stable-alpine
COPY --from=build-stage-node /app/dist /var/www/html
RUN ls -lsha /var/www/html
COPY ./www.conf /etc/nginx/conf.d/
RUN rm /etc/nginx/conf.d/default.conf
EXPOSE 80
CMD ["nginx","-g","daemon off;"]

副标
Dockerize your Golang Application
dockerfile Golang example
docker golang example
Go应用docker容器化打包

Dockerfile

基础镜像使用aline
使用docker的多阶段构建

Dockerfile

# 构建阶段 build stage
FROM golang:stretch AS build-env
ADD . /go/src
WORKDIR /go/src

ENV GO111MODULE=on
ENV APP_NAME="goappname"
RUN CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -mod=vendor -o ${APP_NAME}
RUN pwd && ls -lsa

# 构建物打包阶段 final stage
FROM alpine:latest

## 配置 apk包加速镜像为阿里
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

## 安装 一些基础包
RUN apk update \
    && apk upgrade \
    #&& apk add s6 \
    && apk add bash \
    #&& apk add nghttp2-dev \
    && apk add ca-certificates \
    && apk add wget \
    #&& apk add curl \
    #&& apk add tcpdump \
    && apk add iputils \
    && apk add iproute2 \
    && apk add libc6-compat \
    && apk add -U tzdata \
    && rm -rf /var/cache/apk/*

## 设置 操作系统时区
RUN rm -rf /etc/localtime \
 && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

## 打包 应用
ENV APP_NAME="goappname"
ENV APP_ROOT="/data/apps/"${APP_NAME}
RUN mkdir -p $APP_ROOT
WORKDIR $APP_ROOT

## 从构建阶段复制构建物
COPY --from=build-env /go/src/${APP_NAME}  $APP_ROOT/

## 增加 配置文件、其他依赖文件
COPY config/config.toml.tpl $APP_ROOT/config/
RUN  ls -lsah && pwd && mv ./config/config.toml.tpl ./config/config.toml && ls -lsah  $APP_ROOT/config && cat config/config.toml

## 配置 对外端口
EXPOSE 10000

# 设置启动时预期的命令参数, 可以被 docker run 的参数覆盖掉.
CMD $APP_ROOT/$APP_NAME

docker-compose.yml

version: "3.1"
services:
  goappname:
    build: ./
    image: registry.cn-shanghai.aliyuncs.com/goappname/goappname
    container_name: goappname
    deploy:
      restart_policy:
        condition: on-failure
    ports:
      - "0.0.0.0:10000:10000"
    volumes:
      - "/data/apps/goappname/config/:/data/apps/goappname/goappname/config/"

副标
Dockerize your Python Application
dockerfile python example
dockerfile python flask example

flask框架为例

Dockerfile

FROM alpine:latest

# 打标签
LABEL version="1.0" \
    description="alpine:latest" \
    maintainer="wwek<licoolgo@gmail.com>"

# 配置apk包加速镜像为阿里
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 安装一些基础包
RUN apk update \
    && apk upgrade \
    && apk add s6 \
    && apk add bash \
    # && apk add nghttp2-dev \
    && apk add ca-certificates \
    && apk add wget \
    # && apk add curl \
    # && apk add tcpdump \
    # && apk add bash-completion \
    && apk add iputils \
    && apk add iproute2 \
    && apk add libc6-compat \
    && apk add -U tzdata \
    && rm -rf /var/cache/apk/*

# 设置 操作系统时区
RUN rm -rf /etc/localtime \
 && ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

# 设置时区变量
ENV TIME_ZONE Asia/Shanghai

# 安装 python3、升级pip、setuptools
RUN apk add --no-cache python3 \
    #&& apk add --no-cache python3-dev \
    && python3 -m ensurepip \
    && rm -r /usr/lib/python*/ensurepip \
    && pip3 install --default-timeout=100 --no-cache-dir --upgrade pip \
    && pip3 install --default-timeout=100 --no-cache-dir --upgrade setuptools \
    && if [ ! -e /usr/bin/pip ]; then ln -s pip3 /usr/bin/pip ; fi \
    && if [[ ! -e /usr/bin/python ]]; then ln -sf /usr/bin/python3 /usr/bin/python; fi \
    && rm -rf /var/cache/apk/* \
    && rm -rf ~/.cache/pip

# 设置 语言支持
ENV LANG=C.UTF-8

# 配置 应用工作目录
WORKDIR /data/apps/appdir

# 增加 项目文件
ADD appmain.py ./
ADD 你的py文件2.py ./
ADD 目录1 ./
ADD requirements.txt ./

# 安装 项目依赖包
RUN pip install -r requirements.txt

# 配置 对外端口
EXPOSE 11000

# 设置启动时预期的命令参数, 可以被 docker run 的参数覆盖掉.
CMD ["python", "appmain.py"]

1. CoreDNS 是什么

img
CoreDNS官网
CoreDNS开源

CoreDNS是Golang编写的一个插件式DNS服务器,是Kubernetes 1.13 后所内置的默认DNS服务器
采用的开源协议为Apache License Version 2
CoreDNS也是CNCF孵化项目,目前已经从CNCF毕业。
CoreDNS 的目标是成为 Cloud Native(云原生)环境下的 DNS 服务器和服务发现解决方案。
你被爬虫啦,原文去https://www.iamle.com看
官方口号
CoreDNS: DNS and Service Discovery
DNS和服务发现

2. CoreDNS功能特性

2.1 插件化(Plugins)

CoreDNS插件链。 每个插件都执行DNS功能,例如Kubernetes服务发现,Prometheus指标或重写查询。
还有非常多的其他插件,插件是CoreDNS核心理念就是插件化

简单(Simplicity)

努力把配置文件变得简单
采用了Caddy中的DSL配置方案,即 Corefile 形式的配置文件
一个最简单的配置文件可以为:

.{}

2.2 服务发现 (Service Discovery)

核心域名系统通过Kubernetes插件与Kubernetes集成,或者通过etcd插件直接与etcd集成。
还有redis插件等

快速和弹性 ( Fast and Flexible)

我们的目标是使CoreDNS快速高效。 它的插件也很灵活。 您可以只使用所需的插件编译CoreDNS。

3. 配置一个内网自定义的服务化域名

假设需要在内网实现
sms.service A记录 10.6.6.2
search.service A记录 10.6.6.3
你被爬虫啦,原文去https://www.iamle.com看
我们为CoreDNS手动增加解析记录
那么Corefile配置文件为
/etc/coredns/Corefile

.:53 {
  # 绑定interface ip
  bind 127.0.0.1
  # 先走本机的hosts
  # https://coredns.io/plugins/hosts/
  hosts {
    # 自定义sms.service search.service 的解析
    # 因为解析的域名少我们这里直接用hosts插件即可完成需求
    # 如果有大量自定义域名解析那么建议用file插件使用 符合RFC 1035规范的DNS解析配置文件
    10.6.6.2 sms.service
    10.6.6.3 search.service
    # ttl
    ttl 60
    # 重载hosts配置
    reload 1m
    # 继续执行
    fallthrough
  }
  # file enables serving zone data from an RFC 1035-style master file.
  # https://coredns.io/plugins/file/
  # file service.signed service
  # 最后所有的都转发到系统配置的上游dns服务器去解析
  forward . /etc/resolv.conf
  # 缓存时间ttl
  cache 120
  # 自动加载配置文件的间隔时间
  reload 6s
  # 输出日志
  log
  # 输出错误
  errors
}

运行CoreDNS

coredns -conf ./Corefile

dig测试CoreDNS的自定义dns解析

dig @127.0.0.1  sms.service

; <<>> DiG 9.10.6 <<>> @127.0.0.1 sms.service
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 18343
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;sms.service.           IN  A

;; ANSWER SECTION:
sms.service.        120 IN  A   10.6.6.2

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed May 01 22:23:51 CST 2019
;; MSG SIZE  rcvd: 67

可以看到 sms.service 的A记录已经为10.6.6.2

更多配置探索参考CoreDNS官方手册

4. 部署

这里可以找到基于k8s,基于systemd的部署文件参考
CoreDNS部署参考

安装

wget https://github.com/coredns/coredns/releases/download/v1.5.0/coredns_1.5.0_linux_amd64.tgz
tar zxf coredns_1.5.0_linux_amd64.tgz -C /usr/bin/

增加运行账户

useradd coredns -s /sbin/nologin

systemd的coredns配置文件
/usr/lib/systemd/system/coredns.service

[Unit]
Description=CoreDNS DNS server
Documentation=https://coredns.io
After=network.target

[Service]
PermissionsStartOnly=true
LimitNOFILE=1048576
LimitNPROC=512
CapabilityBoundingSet=CAP_NET_BIND_SERVICE
AmbientCapabilities=CAP_NET_BIND_SERVICE
NoNewPrivileges=true
User=coredns
WorkingDirectory=~
ExecStart=/usr/bin/coredns -conf=/etc/coredns/Corefile
ExecReload=/bin/kill -SIGUSR1 $MAINPID
Restart=on-failure

[Install]
WantedBy=multi-user.target
systemctl enable coredns
systemctl start coredns
systemctl status coredns

实际上CoreDNS编译出来的是一个单二进制文件
二进制文件+配置文件就能跑了,部署起来非常简单

5. 参考

CoreDNS 使用与架构分析

前言

不管是PHP各种框架的日志
还是java的 Java Stack Traces
他们都是多行日志模式
这个时候如果使用
filebeat + elasticsearch + kibana 做日志的采集,存储,展示那么就需要用到
filebeat的 multiline 配置
一词日志是多行记录,其实这种多行的日志会有日志分段的分隔符
写出对于的分隔符正则即可解决filebeat采集一次日志记录为多行的情况

配置示例

例如我们有日志文件

/var/www/a.iamle.com/runtime/log/201904/01.log
/var/www/b.iamle.com/Application/Runtime/Logs/201904/02.log
/var/www/c.iamle.com/runtime/log/201905/03.log
/var/www/d.iamle.com/Application/Runtime/Logs/201906/04.log

分析日志后得出某一次日志通过什么标识作为分隔符

# 标识方式1 63个"-"作为分割符 正则为 ^\-{63}
# ...
---------------------------------------------------------------
2019-04-08T13:58:19+08:00 192.168.0.1 GET a.iamle.com/v1/1?type_id=1
[运行时间:0.582681s] [吞吐率:1.72req/s] [内存消耗:3,387.72kb] [文件加载:80]
[ err ] [ LANG ] /var/releases/balabala/20181227-101450/fw/lang/zh-cn.php
[ err ] [ ROUTE ] array (
  'rule' => 'v1',
  'route' => 'index/v1/1',
---------------------------------------------------------------
2019-04-08T13:58:19+08:00 192.168.0.1 GET b.iamle.com/v1/1?type_id=1
[运行时间:0.582681s] [吞吐率:1.72req/s] [内存消耗:3,387.72kb] [文件加载:80]
[ err ] [ LANG ] /var/releases/balabala/20181227-101450/fw/lang/zh-cn.php
[ err ] [ ROUTE ] array (
  'rule' => 'v1',
  'route' => 'index/v1/1',
---------------------------------------------------------------
# ...

# 标识方式2 "[ 2019 作为分隔符 正则为 ^\[\s{1}\d{4}
# ...

[ 2019-04-09T13:58:19+08:00 ] 192.168.0.1 GET a.iamle.com/v2
[运行时间:0.681s] [吞吐率:1.72req/s] [内存消耗:3,387.72kb] [文件加载:82]
[ err ] [ LANG ] /var/releases/balabala/20191227-101450/fw/lang/zh-cn.php
[ err ] [ ROUTE ] array (
  'rule' => 'v2',
  'route' => 'index/v2',

[ 2019-04-09T13:58:19+08:00 ] 192.168.0.1 GET b.iamle.com/v2/1
[运行时间:0.681s] [吞吐率:1.72req/s] [内存消耗:3,387.72kb] [文件加载:81]
[ err ] [ LANG ] /var/releases/balabala/20191227-101450/fw/lang/zh-cn.php
[ err ] [ ROUTE ] array (
  'rule' => 'v2',
  'route' => 'index/v2',
# ...

filebeat中配置文件
/etc/filebeat/filebeat.yml

# ...
- type: log
  enabled: true
  paths:
    - /var/www/*.iamle.com/runtime/log/*/*.log
    - /var/www/*.iamle.com/Application/Runtime/Logs/*/*.log
  # 正则需要支持2种不同的分隔符
  multiline.pattern: '^(\-{63}|\[\s{1}\d{4})'
  multiline.negate: true
  multiline.match: after

# ...
# 检查filebeat是否配置正确
 filebeat test config
# 重启filebeat
 systemctl restart filebeat

写正则的时候推荐用正则可视化工具检查正则
例如本文的正则

扩展

这种非自己能定义的日志,思路是寻找多行日志分段规律写出对于的正则即可
那么自己打日志的情况下,不太推荐这种多行日志了,采用结构化的json日志,一行一条是比较推荐的方式
这样在后期的处理分析中将会便利太多太多

参考

Filebeat Reference [7.0] » Configuring Filebeat » Manage multiline messages

1. 前言

云端开发环境 云端开发环境安装 搭建云ide 远程调试开发
一直想建立一个云端开发环境
有以下尝试,以及目前用的最终方案
仅供参考

2. 常见云端IDE环境

2.1 SSH+VIM

此乃一苇渡江,vim高手首选方案
但是对于vim只停留在基础的配置文件修改水平,习惯了vscode/Jetbrains全家桶后就不太适应这种需要较高学习和配置曲线的方案了
有人说你可以用一些预制vim配置,实际用起来你还是需要去熟悉和调整的,要花大把时间的

2.2 AWS Cloud9

Cloud9官网
可以用AWS的云端服务,也可以私有部署
如果为了环境干净可以自己打docker镜像
哪有本地IDE工具功能强大啊
img

2.3 CodingIDE(Cloud Studio)

Cloud Studio官网
Cloud Studio – 开启云端开发模式WebIDE
可用云端服务,目前已经卖给腾讯云了,也可以私有部署(暂不清楚开源版还在更新没),功能上弱于AWS Cloud9
哪有本地IDE工具功能强大啊
img

2.4 code-server

code-server官网
这货是vscode的服务端运行版本
使用基本和本地vscode保持一致,功能上强于 Cloud9和CodingIDE
当然自己也可以打docker镜像使用,不过打docker镜像有个弊端,就是开发环境变更问题
虽然开发环境几乎不会这么变,但是终归还是会有变动的,如果用docker的方式,每次变更都去同步修改Dockfile打镜像还是烦的
img

2.5 Linux Desktop + VNC + noVNC

选一个自己喜欢的Linux桌面发行版,装VNC server,再装一个noVNC让VNC在web浏览器中可以访问
Linux Desktop 我选的 Kali,他基于debian定制的, 主打安全并集成了较多安全方面的工具
图形化选的Xfce
和本地开发完全一致,想用什么IDE用什么IDE
img

3. 结论

对vim非常熟悉那么随便一个vps/vm虚拟机就开干
有条件开虚拟机的建议开vm虚拟机用Linux桌面版本
不能自己开虚拟机但是有vps/vm虚拟机用的可以装 code-server 用
喜欢让系统干干净净的处女座也不怕麻烦可以把code-server、Cloud9等打docker镜像用

没有最好,只有最适合,满足自己需求即可
个人最终选的方案5

4. 扩展

另外一个知识点,docker中是可以用桌面版的,这个大多数人都不知道
例如实验楼这个网站中的实验环境其实就是docker中运行的Linux桌面
搜索关键字“docker linux desktop”获取跟多的信息
要用docker中的Linux桌面版,可以采用VNC + noVNC的方式