Docker 刘昕 ( 唐容 )
刘昕 ( 唐容 ) 阿里巴巴技术专家 目前负责工程效能团队的产品开发工作, 主要包含阿里云持续交付平台 (CRP) 及云 Code 平台 曾负责淘宝日常测试环境, 集团源码管理, 编译系统等基础设施的建设, 以及阿里云云计算等部门的配置管理工作 2
1. 传统 CD 过程中遇到的问题 2. 变革软件交付方式的技术 : Docker 3. 应用 Docker 化交付的过程 3
4
Solution Code Commit Delivery Production Continuous Integration (CI)/ Continuous Delivery (CD) Build Unit Test Deploy and Full Test 5
CD Pipeline 逻辑在一起 应用和环境在一起 代码在一起 功能在一起 系统在一起 6
CD 本地环境 artifactory repo 公有云环境 Config Code Config Tests Test Env Dev Commit to Get / Pull Code Distributed Builds Run Tests Staging Env Prod Env tgz war zip rpm Send Report + + 7
CD 编译环境维护困难 依赖环境维护困难 切换环境调试困难 运行包的版本维护困难 统一环境标准, 环境回溯, 难上加难 8
Code Developer 交付的只有 Code, 以及 Code 的依赖 而 Keep Site Running 需要除了 Code 之外的运行环境, 以及运行环境之间的依 赖 9
Docker 10
没有集装箱, 不可能有全球化 经济学家 变革软件交付方式的技术 :Docker An open platform for distributed applications for developers and sysadmins 11
coding building running Code src/main src/test pom.xml readme.md.gitignore environment define Ubuntu 14.04 CentOS 7 environment dependencies tomcat Jre environment describe PATH configs package.war src.jar dependencies.jars running Images container container 12
Docker : Build Once Run EveryWhere 1 描述环境的能力提供了描述运行栈, 并且自定义 Build 过程的能力 Code 中的描述文件就是 Dockerfile 2 分层文件系统 Image 可以像 Git 一样进行管理, 并且每一层都是只读的, 对环境的每个操作都会被记录, 并且可回溯 3 Docker Registry 提供了管理 Image 存储系统, 可以存储, 传递, 并且对 Image 进行版本管理 4 屏蔽 Host OS 差异解决了环境差异, 保证在任何环境下的运行都是一致的 ( 只要满足运行 docker 的 linux 内核 ) 13
Docker FROM buildpack-deps:jessie-curl RUN apt-get update && apt-get install -y unzip ENV CATALINA_HOME /usr/local/tomcat ADD package.war $CATALINA_HOME/webapp/ EXPOSE 8080 CMD ["catalina.sh", "run"] local docker registry Build Remote Docker Registry push Ship pull Run 14
Docker 15
BBC News Before: 10 种 CI 环境,26000 Jobs,500Dev 任务需要等待, 无法并行 The BBC Challenge 8,500 employees 60+ minute-long tests 150 global servers After Slash job time from 1 hour to 10 minutes: 60% Language Flexibility: Job Eliminate Multi-Day Sideloading Process: CI Empower Developers: Standardization: 16
Step 1: Docker Docker Toolkit ECS driver for Docker Machine AWS, GCE, etc. Docker Docker Machine docker-machine create \ driver aliyunecs mytest \ eval "$(docker-machine env mytest)" docker run -d nginx 17
Step 2: Dockerfile Java linux openjdk 7 && Java Home Tomcat 7 && target.war JVM Web Server 8080 tomcat FROM buildpack-deps:jessie-curl RUN apt-get update && apt-get install -y unzip \ openjdk-7-jre-headless= $JAVA_DEBIAN_VERSION \ && rm -rf /var/lib/apt/lists/* ENV LANG C.UTF-8 ENV JAVA_VERSION 7u91 ENV JAVA_DEBIAN_VERSION 7u91-2.6.3-1~deb8u1 ENV CATALINA_HOME /usr/local/tomcat ENV PATH $CATALINA_HOME/bin:$PATH RUN mkdir -p "$CATALINA_HOME" WORKDIR $CATALINA_HOMEENV TOMCAT_VERSION 7.0.68 ENV TOMCAT_TGZ_URL \ https://xxxx/apache-tomcat-$tomcat_version.tar.gz RUN set -x \ && curl -fsl "$TOMCAT_TGZ_URL" -o tomcat.tar.gz \ && curl -fsl "$TOMCAT_TGZ_URL.asc" -o tomcat.tar.gz.asc \ && gpg --batch --verify tomcat.tar.gz.asc tomcat.tar.gz \ && tar -xvf tomcat.tar.gz --strip-components=1 \ && rm bin/*.bat \ && rm tomcat.tar.gz* EXPOSE 8080 CMD ["catalina.sh", "run"] 18
Think 如果有一个安装好 Java 的环境? 如果有一个安装好 Java 和 Tomcat 的环境? 如果是微服务, 对环境只依赖 Java/Node 基础环境, 是不是所有应用都可以共用 1 个环境? 19
Step 3: Docker /UT 用 docker 作为编译 /UT 环境的好处 : 自定义, 可扩展, 可复制的编译环境 Application -v Point build app 和 build docker image 分开进行 - 分层概念导致源码泄露的可能 - 镜像最小化原则 Docker file 不要放到代码根目录下 - 避免大量文件传给 docker deamon 通过运行容器直接运行测试脚本 Build container Binary Docker Image maven npm make ADD/COPY Docker Build 20
Step 4: Docker-Compose 21
Step 4: Docker / routing App App App OSSFS OSSFS OSSFS 声明观念 : I need 负载均衡 (haproxy,nginx) I need 数据库 (mysql) I need 文件存储 ( 通过 -v, ossfs) I need 缓存服务 (redis,kv-store) Database
Put it All together Docker Reg pull docker image Dev Code Config Tests Docker file Commit to pull image push image hook pull code CI Service UT & Build Use Docker image & compse TO CD Service Send Build/UT Report Send Deploy/Run Report 23
Docker 研发 : 更清楚, 更灵活的掌控自己的软件运行环境 运维 : 再也不用为应用软件依赖栈的变更碎片化自己的时间 资源 : 每人每项目每环境 DevOps : 24
Docker Let s Think out together Stateless Web REST API CI/CD Stateful Long-Life Short-Life 25
Thanks 26