朱 烨
- 
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使用实践
- 尽量遵循官方最佳实践
- 本地编译镜像
- 慎用profile/rc等
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.2Docker使用实践
- 尽量遵循官方最佳实践
- 本地编译镜像
- 慎用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实践
- 587