朱   烨

  • ThoughtWorks高级咨询师
    • DevOps实践
    • 云平台自动化
  • 10多年运维行业工作经验
  • 曾就职亿唐网、土豆网
  • CCIE R&S #16866
  • AWS解决方案架构师

基于容器化的DevOps实践



本地环境篇

关于DevOps

  • 是一种团队合作的理念
  • 不是一个具体的角色
    • 会开发的运维
    • 会运维的开发
  • 一个有共同目标团队
    • 了解对方的痛点
    • 共同找出解决方案

我理解的DevOps

  • 团队的痛点
  • 我们做过的尝试
  • 我们的实践
  • Demo
  • 需要注意的点
  • 实践回顾

讲什么?

  • 安全
  • 线上部署
  • 高可用
  • 日志
  • 监控
  • 报警

不讲什么?

  • 团队的痛点

  • 我们做过的尝试

  • 我们的实践
  • Demo
  • 需要注意的点
  • 实践回顾

新的团队成员搞不定环境

  • 理解错误
  • 不熟悉
  • 不会

部署维护成本高

  • 脚本管理混乱
    • 保存位置
    • 命名不一致
  • 多种(个)配置文件

线上不灵线下灵

  • 环境不一致
  • 软件版本不一致
  • 配置文件有错误
  • 自己编译软件
  • Windows vs Linux

结果?

开发、测试、运维三国演义

  • 团队的痛点

  • 我们做过的尝试

  • 我们的实践
  • Demo
  • 需要注意的点
  • 实践回顾

指导文档

  • 文档更新不及时
  • 对部分人员来讲还是很难

虚拟机

  • 虚拟机文件过大
  • 难以快速迭代
  • 业务模块集中化

容器化

  • 团队的痛点

  • 我们做过的尝试

  • 我们的实践

  • Demo
  • 需要注意的点
  • 实践回顾
version: '2'
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    ports:
      - "80:80"
    env_file:
      - ./config/env/local
    links:
      - db:db.local.chatops.in
    volumes:
      - "./app/src:/app/src"
    depends_on:
      - db

....

  db:
    image: "mysql:5.5.53"
    privileged: true
    ports:
      - "3306:3306"
    env_file:
      - ./config/env/local

Docker Compose

├── auto
│   ├── authenticate
│   ├── build
│   ├── down
│   ├── functions
│   ├── recreate
│   ├── release
│   ├── restart
│   ├── start
│   ├── stop
│   └── up
├── config
│   └── env
│       └── local
├── docker-compose.yaml

`auto/XXX` 模式

 `auto/XXX` 模式思想

  • 简洁
    • 功能尽可能单一
    • 可组合
  • 无类型后缀
  • 不要包含CI平台相关脚本

`auto/XXX` 模式意义

  • 鼓励CI逻辑脚本化
  • 脚本做版本管理
  • 统一的保存位置
  • 方便查看可用的操作
  • 团队的痛点

  • 我们做过的尝试

  • 我们的实践

  • Demo

  • 需要注意的点
  • 实践回顾
https://github.com/phoenix-zhu/devops-practice
  • 团队的痛点

  • 我们做过的尝试

  • 我们的实践

  • Demo

  • 需要注意的点

  • 实践回顾

Docker使用实践

version: '2'
services:
  app:
    build:
      context: ./app
      dockerfile: Dockerfile
    ports:
      - "80:80"
    env_file:
      - ./config/env/local
    links:
      - db:db.local.chatops.in
    volumes:
      - "./app/src:/app/src"
    depends_on:
      - db
      - migration

...

  db:
    image: "mysql:5.5.53"
    privileged: true
    ports:
      - "3306:3306"
    env_file:
      - ./config/env/local
version: '2'
services:
  app:
    image: "devopssession/ip2citydemo"
    ports:
      - "80:80"
    env_file:
      - ./config/env/local
    links:
      - db:db.local.chatops.in
    volumes:
      - "./app/src:/app/src"
    depends_on:
      - db
      - migration

...

  db:
    image: "mysql:5.5.53"
    privileged: true
    ports:
      - "3306:3306"
    env_file:
      - ./config/env/local

Docker使用实践


RUN mkdir -p "${RBENV_ROOT}/plugins/ruby_build" \
 && wget -q -O - https://github.com/sstephenson/rbenv/archive/master.tar.gz | \
    tar -xzf - --strip-components=1 -C "${RBENV_ROOT}" \
 && wget -q -O - https://github.com/sstephenson/ruby-build/archive/master.tar.gz | \
    tar -xzf - --strip-components=1 -C "${RBENV_ROOT}/plugins/ruby_build" \
 && ln -snf "${RBENV_ROOT}/bin/rbenv" /usr/local/bin/rbenv \
 && echo -e 'export RBENV_ROOT=/usr/local/rbenv \n \
    eval "$(/usr/local/bin/rbenv init -)"' > /etc/profile.d/rbenv.sh \
 && RBENV_ROOT=${RBENV_ROOT} /usr/local/bin/rbenv install 2.2.2 \
 && rm -f /tmp/ruby-build.*.log \
 && rbenv global 2.2.2

Docker使用实践

  • 尽量遵循官方最佳实践
  • 本地编译镜像
  • 慎用profile/rc等
  • Latest陷阱
    • 最后一次编译版本
    • 不是最新的版本
  • 加入依赖服务检查
#!/bin/bash 

echo "Trying to connect to ${DB_HOST} ..."
while ! mysql -h${DB_HOST} -u${DB_USER} -p${DB_PASSWORD} -e "show databases;" 1>/dev/null
do
  echo "Failed to connect to ${DB_HOST}, trying again in 3 seconds..."
  sleep 3
done
echo "Database connection successful. Continuing..."

exec $@
...

  migration:
    build:
      context: ./migration
      dockerfile: Dockerfile
    env_file:
      - ./config/env/local
    links:
      - db:db.local.chatops.in
    volumes:
      - "./migration:/app"
    depends_on:
      - db

...

Docker使用实践

  • 尽量遵循官方最佳实践
  • 本地编译镜像
  • 慎用profile/rc等
  • Latest陷阱
    • 最后一次编译版本
    • 不是最新的版本
  • 加入依赖服务检查
  • 干净的安装依赖
    • 必要的时候使用Volume
FROM python:2.7-slim
MAINTAINER "DevOps Meetup" <devops@meetup.org>

WORKDIR /app

RUN pip install awscli --upgrade

COPY requirements.txt .
COPY lambda lambda

RUN pip install -r requirements.txt -t lambda

VOLUME /app/lambda

COPY . /app/

CMD ["/app/auto/deploy"]

Docker使用实践

  • 尽量遵循官方最佳实践
  • 本地编译镜像
  • 慎用profile/rc等
  • Latest陷阱
    • 最后一次编译版本
    • 不是最新的版本
  • 加入依赖服务检查
  • 干净的安装依赖
    • 必要的时候使用Volume
  • 使用Workdir而非cd

其他

  • 无状态/无特点
    • 可复制
    • 可丢弃
  • 配置-环境变量化
  • 12因子
  • 团队的痛点

  • 我们做过的尝试

  • 我们的实践

  • Demo

  • 需要注意的点

  • 实践回顾

新的团队成员搞不定环境

  • 一条命令搞定
  • 理解错误
  • 不熟悉
  • 不会

vs

部署维护成本高

  • `auto/XXX`模式
  • 统一使用环境变量
    • 集中保存

vs

  • 脚本管理混乱
    • 保存位置
    • 命名不一致
  • 多种(个)配置文件

线上不灵线下灵

  • 环境不一致
  • 软件版本不一致
  • 配置文件有错误
  • 自己编译软件
  • Windows vs Linux
  • 同一个Dockerfile
  • 版本化
  • 标准化的流程
  • 平台无关

vs

谢   谢!

基于容器化的DevOps实践

By phoenix_zhu

基于容器化的DevOps实践

  • 444