基于 traefik v2 的本地开发、部署一致环境方案

图片.png

简介

中小型产品项目,如果能将本地的开发环境与生产的部署环境达成一致的话,会很方便运维、测试,也可以说是小团队和独立开发者很好的解决方案。我的一些中小型项目就没有采用一些常规的运维、测试解决方案,而是利用 traefik + Docker 容器来实现,经过多个项目的实践相信这是另一种很实用的工作方法,现将一些配置的要点总结如下:

准备

  1. 本地安装 docker,参见官方文档找到对应的系统平台
    https://docs.docker.com/install/#supported-platforms
  2. 配置 docker 加速,推荐 daocloud 的加速服务
    https://www.daocloud.io/mirror

开始

一、配置 traefik v2

建立如下目录

.
├── acme.json
├── docker-compose.yml
├── dynamic_conf.toml
├── logs  # 日志会自动生成
│   ├── access.log
│   └── traefik.log
├── ssl
│   ├── caixie.top.crt
│   ├── caixie.top.key
└── traefix.toml

1. 配置 docker-compose.yml 编排文件,内容如下

version: '3'
 
services:
  reverse-proxy:
    image: traefik:v2.0.1
    container_name: "traefik"
    restart: always
    labels:
      - traefik.enable=true
      - traefik.docker.network=traefik
    ports:
      - 80:80
      - 443:443
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - ./traefik.toml:/traefik.toml
      # ./acme.json:/acme.json
      - ./logs:/var/log
      - ./dynamic_conf.toml:/dynamic_conf.toml
      - ./ssl:/data/ssl/
    networks:
      - default
      - traefik
  whoami:
    # A container that exposes an API to show its IP address
    image: containous/whoami
    labels:
      # 声明公开此容器访问
      - "traefik.enable=true"
      # 服务将响应的域
      - "traefik.http.routers.whoami.rule=Host(`whoami.caixie.top`)"
      # 只允许来自预定义的入口点“web”的请求
      - "traefik.http.routers.whoami.entrypoints=web, web-secure"
      - traefik.docker.network=traefik
    networks:
      - default
      - traefik

networks:
  traefik:
    external: true

2 traefik 静态配置, traefik.toml 文件内容如下

## traefik.toml
## Static configuration

[entryPoints]
  [entryPoints.web]
    address = ":80"

  [entryPoints.web-secure]
    address = ":443"

  [entryPoints.traefik]
    address = ":8000"

[providers]
  [providers.docker]
    # 限制服务发现范围
    # 如果设置为 false, 则没有 traefik.enable=true 标签的容器将从生成的路由配置中忽略
    exposedByDefault = false 
    network = "traefik"
  [providers.file]
    filename = "dynamic_conf.toml"
    watch = true

[retry]

[api]
  # dashboard = true
  # insecure = true
  #debug = true
 
[ping]

3 traefik 动态配置, dynamic_conf.toml 内容如下

## Dynamic configuration

[http.routers.api]
  rule = "Host(`d.caixie.top`)"
  entrypoints = ["web-secure"]
  service = "api@internal"
  middlewares = ["myAuth"]
  [http.routers.api.tls]

# 用户:test 密码:test
[http.middlewares.myAuth.basicAuth]
  users = [
    "test:$apr1$H6uskkkW$IgXLP6ewTrSuBkTrqE8wj/"
  ]

[tls]
  [[tls.certificates]]
    certFile = "/data/ssl/caixie.top.crt"
    keyFile = "/data/ssl/caixie.top.key"
[tls.stores]
  [tls.stores.default]
    [tls.stores.default.defaultCertificate]
      certFile = "/data/ssl/caixie.top.crt"
      keyFile = "/data/ssl/caixie.top.key"  

4 启动 treafik 服务

docker-compose up -d

5 进入 Dashboard 管理页面

浏览器打开刚配置的 d.caixie.top 出现类似如下页面就成功配置了:


Traefik Dashboard

二、 应用端配置

1 示例: API 服务端

# Dockerfile 文件
#FROM mhart/alpine-node:12
FROM node:10-alpine
# 设置镜像作者
#MAINTAINER baisheng <baisheng@gmail.com>
# 设置时区
RUN sh -c "echo 'Asia/Shanghai' > /etc/timezone"
# 使用 aliyun 仓库加速
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories

# 以下软件根据实际情况选择是否安装
RUN apk add --no-cache make gcc g++ python git
# Nodejs 服务的淘宝源配置

RUN npm config set registry https://registry.npm.taobao.org && \
    npm config set disturl https://npm.taobao.org/dist && \
    npm config set electron_mirror https://npm.taobao.org/mirrors/electron/ && \
    npm config set sass_binary_site https://npm.taobao.org/mirrors/node-sass/ && \
    npm config set phantomjs_cdnurl https://npm.taobao.org/mirrors/phantomjs/
RUN npm install --global node-gyp

#
WORKDIR /home/node/app

COPY package.json .
COPY package-lock.json /home/node/app
RUN npm ci

COPY . /home/node/app
RUN npm run build

EXPOSE 80

docker-compose 编排文件

# docker-compose.yml
# 根据项目用到的软件情况进行编排配置

version: '3.7'
services:
  redis:
    image: bitnami/redis:latest
    environment:
      - ALLOW_EMPTY_PASSWORD=yes
      - REDIS_DISABLE_COMMANDS=FLUSHDB,FLUSHALL
    ports:
      - 6379:6379
    volumes:
      - redis_data:/bitnami/redis/data
    networks:
      - db-tier
  mongodb:
    image: bitnami/mongodb:latest
    volumes:
      - mongodb_data:/bitnami
    ports:
      - 27017:27017
    networks:
      - db-tier
  # 应用配置
  baisheng.api:
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/app
      - /app/node_modules
    depends_on:
      - mongodb
      - redis
    networks:
      - traefik
      - db-tier
      - default
    command: yarn start:prod
    labels:
      # 声明公开此容器访问
      - "traefik.enable=true"
      - "traefik.http.routers.baisheng-server.entrypoints=web, web-secure"
      - "traefik.http.routers.baisheng-server.tls=true"
      - "traefik.http.routers.baisheng-server.rule=Host(`api.caixie.top`)"
      - "traefik.docker.network=traefik"
volumes:
  redis_data:
    # 大部分情况为本地驱动,除有外部存储的情况,需要单独配置
    # https://docs.docker.com/compose/compose-file/#driver
    driver: local
  mongodb_data:
    driver: local
# 与 traefik v2 基础服务在同一网络
networks:
  db-tier:
  traefik:
    external: true
    name: traefik

2 示例: 应用WEB端

# Dockerfile 文件

FROM baisheng/alpine-node:12
WORKDIR /app
COPY . .
RUN npm install
EXPOSE 3000

3 docker-compose 编排文件

version: '3.7'
services:
  website:
#    image: mhart/alpine-node:12
#    working_dir: /app
    environment:
#      - NODE_ENV=production
       - NODE_ENV=development
    build:
      context: .
      dockerfile: Dockerfile
    volumes:
      - ./:/app
      - /app/node_modules
    networks:
      - traefik
    command: yarn dev
#    command: sh docker-entrypoint.sh
#    ports:
#      - 3001:80
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.baisheng-website.entrypoints=web, web-secure"
#         禁止非安全请求
      - "traefik.http.routers.baisheng-website.tls=true"
      - "traefik.http.routers.baisheng-website.rule=Host(`www.caixie.top`)"
      - "traefik.docker.network=traefik"
networks:
  traefik:
    external: true

4 查看配置是否成功

进入 dashboard 到 http 标签选项卡中查看是否已正确发现你的应用配置,如果出现配置信息,表示应用配置成功:

Dashboard HTTP

重要说明

  • networks 需要在同一网络,网络之间的子应用才能正确通讯
  • 如果 treafik 的服务器发现设置为 exposeByDefault=false,需要由 treafik 管理的应用需要设置 treafik.enable=true
  • 如果应用采用 docker 编排,应用的启动IP设置应为 0.0.0.0 否则无法解析应用域名访问
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,440评论 5 467
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,814评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,427评论 0 330
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,710评论 1 270
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,625评论 5 359
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,014评论 1 275
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,511评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,162评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,311评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,262评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,278评论 1 328
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,989评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,583评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,664评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,904评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,274评论 2 345
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,856评论 2 339

推荐阅读更多精彩内容