朱 烨
-
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.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