什么是dockerfile?
Dockerfile是一个包含用于组合映像的命令的文本文档。可以使用在命令行中调用任何命令。Docker通过读取Dockerfile中的指令自动生成映像。
docker build命令用于从Dockerfile构建映像。可以在docker build命令中使用-f标志指向文件系统中任何位置的Dockerfile。
例:
docker build -f /path/to/a/Dockerfile
Dockerfile的基本结构
Dockerfile 一般分为四部分:基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令,’#’ 为 Dockerfile 中的注释。
Dockerfile文件说明
Docker以从上到下的顺序运行Dockerfile的指令。为了指定基本映像,第一条指令必须是FROM。一个声明以#字符开头则被视为注释。可以在Docker文件中使用RUN,CMD,FROM,EXPOSE,ENV等指令。
在这里列出了一些常用的指令。
FROM:指定基础镜像,必须为第一个命令
MAINTAINER: 维护者信息
RUN:构建镜像时执行的命令
ADD:将本地文件添加到容器中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
COPY:功能类似ADD,但是是不会自动解压文件,也不能访问网络资源
CMD:构建容器后调用,也就是在容器启动时才进行调用。
ENTRYPOINT:配置容器,使其可执行化。配合CMD可省去"application",只使用参数。
LABEL:用于为镜像添加元数据
ENV:设置环境变量
EXPOSE:指定于外界交互的端口
VOLUME:用于指定持久化目录
WORKDIR:工作目录,类似于cd命令
USER:指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建都将使用该用户。镜像构建完成后,通过docker run运行容器时,可以通过-u参数来覆盖所指定的用户。
ARG:用于指定传递给构建运行时的变量
ONBUILD:用于设置镜像触发器
最后用一张图解释常用指令的意义^-^
微服务治理的手段
节点管理
第一种:注册中心主动剔除有问题的服务提供者
根据心跳机制决定哪些服务提供者有效,由注册中心主动撤除有问题的服务提供者的ip,更新服务消费者端的服务提供者ip列表
第二种:服务消费者维护服务提供者列表
服务消费者在维护更新下来的的服务提供者ip列表,在调用的过程中,对有问题的服务提供者ip进行剔除
负载均衡
第一种:随机算法
第二种:权重优先级算法
第三种:最小活跃调用算法
第四种:一致性hash算法
如果所有服务提供者的机器配置和新旧差不多,优先选用第一种或者第四种
如果所有服务提供者的机器配置和新旧差很远,优先选用第二种或者第三种
服务路由
在服务消费端的可用服务提供端ip列表中选择调用哪个ip,除了由负载均衡算法决定,还需要由服务路由规则决定
原因一:业务灰度发布
原因二:多机房就近访问
路由规则配置方法:
方法一:静态配置
方法二:动态配置
服务容错
服务消费者发现调用失败后手段
手段一:Failover,发现调用失败后,设置重试次数,如果超过重试次数后对可用服务列表的下一个可用服务ip进行调用,如此类推。适合服务调用时幂等的场景,读操作场景。
手段二:Failback,发现调用失败后,根据返回失败的信息来决定是否重试,如果生效了就不需要再重试,如果不生效就再重新调用。适合服务调用时非幂等的场景。
手段三:Failsafe,发现调用失败后,等待一个时间间隔后再重试。适合服务调用时幂等的场景。
手段四:Failfast,发现调用失败后,不重试,直接返回失败结果,通常适合于非核心业务,适合服务调用时非幂等的场景。
Dockerfile 使用经验
Dockerfile 示例
构建Nginx运行环境
# 指定基础镜像
FROM sameersbn/ubuntu:14.04.20161014
# 维护者信息
MAINTAINER sameer@damagehead.com
# 设置环境
ENV RTMP_VERSION=1.1.10 \
NPS_VERSION=1.11.33.4 \
LIBAV_VERSION=11.8 \
NGINX_VERSION=1.10.1 \
NGINX_USER=www-data \
NGINX_SITECONF_DIR=/etc/nginx/sites-enabled \
NGINX_LOG_DIR=/var/log/nginx \
NGINX_TEMP_DIR=/var/lib/nginx \
NGINX_SETUP_DIR=/var/cache/nginx
# 设置构建时变量,镜像建立完成后就失效
ARG BUILD_LIBAV=false
ARG WITH_DEBUG=false
ARG WITH_PAGESPEED=true
ARG WITH_RTMP=true
# 复制本地文件到容器目录中
COPY setup/ ${NGINX_SETUP_DIR}/
RUN bash ${NGINX_SETUP_DIR}/install.sh
# 复制本地配置文件到容器目录中
COPY nginx.conf /etc/nginx/nginx.conf
COPY entrypoint.sh /sbin/entrypoint.sh
# 运行指令
RUN chmod 755 /sbin/entrypoint.sh
# 允许指定的端口
EXPOSE 80/tcp 443/tcp 1935/tcp
# 指定网站目录挂载点
VOLUME ["${NGINX_SITECONF_DIR}"]
ENTRYPOINT ["/sbin/entrypoint.sh"]
CMD ["/usr/sbin/nginx"]
构建tomcat 环境
Dockerfile文件
# 指定基于的基础镜像
FROM ubuntu:13.10
# 维护者信息
MAINTAINER zhangjiayang "zhangjiayang@sczq.com.cn"
# 镜像的指令操作
# 获取APT更新的资源列表
RUN echo "deb http://archive.ubuntu.com/ubuntu precise main universe"> /etc/apt/sources.list
# 更新软件
RUN apt-get update
# Install curl
RUN apt-get -y install curl
# Install JDK 7
RUN cd /tmp && curl -L 'http://download.oracle.com/otn-pub/java/jdk/7u65-b17/jdk-7u65-linux-x64.tar.gz' -H 'Cookie: oraclelicense=accept-securebackup-cookie; gpw_e24=Dockerfile' | tar -xz
RUN mkdir -p /usr/lib/jvm
RUN mv /tmp/jdk1.7.0_65/ /usr/lib/jvm/java-7-oracle/
# Set Oracle JDK 7 as default Java
RUN update-alternatives --install /usr/bin/java java /usr/lib/jvm/java-7-oracle/bin/java 300
RUN update-alternatives --install /usr/bin/javac javac /usr/lib/jvm/java-7-oracle/bin/javac 300
# 设置系统环境
ENV JAVA_HOME /usr/lib/jvm/java-7-oracle/
# Install tomcat7
RUN cd /tmp && curl -L 'http://archive.apache.org/dist/tomcat/tomcat-7/v7.0.8/bin/apache-tomcat-7.0.8.tar.gz' | tar -xz
RUN mv /tmp/apache-tomcat-7.0.8/ /opt/tomcat7/
ENV CATALINA_HOME /opt/tomcat7
ENV PATH $PATH:$CATALINA_HOME/bin
# 复件tomcat7.sh到容器中的目录
ADD tomcat7.sh /etc/init.d/tomcat7
RUN chmod 755 /etc/init.d/tomcat7
# Expose ports. 指定暴露的端口
EXPOSE 8080
# Define default command.
ENTRYPOINT service tomcat7 start && tail -f /opt/tomcat7/logs/catalina.out
tomcat7.sh
命令文件
export JAVA_HOME=/usr/lib/jvm/java-7-oracle/
export TOMCAT_HOME=/opt/tomcat7
case $1 in
start)
sh $TOMCAT_HOME/bin/startup.sh
;;
stop)
sh $TOMCAT_HOME/bin/shutdown.sh
;;
restart)
sh $TOMCAT_HOME/bin/shutdown.sh
sh $TOMCAT_HOME/bin/startup.sh
;;
esac
exit 0
原则与建议
- 容器轻量化。从镜像中产生的容器应该尽量轻量化,能在足够短的时间内停止、销毁、重新生成并替换原来的容器。
- 使用
.gitignore
。在大部分情况下,Dockerfile 会和构建所需的文件放在同一个目录中,为了提高构建的性能,应该使用 .gitignore
来过滤掉不需要的文件和目录。 - 为了减少镜像的大小,减少依赖,仅安装需要的软件包。
- 一个容器只做一件事。解耦复杂的应用,分成多个容器,而不是所有东西都放在一个容器内运行。如一个 Python Web 应用,可能需要 Server、DB、Cache、MQ、Log 等几个容器。一个更加极端的说法:One process per container。
- 减少镜像的图层。不要多个 Label、ENV 等标签。
- 对续行的参数按照字母表排序,特别是使用
apt-get install -y
安装包的时候。 - 使用构建缓存。如果不想使用缓存,可以在构建的时候使用参数
--no-cache=true
来强制重新生成中间镜像。
------------------- 消息中间件Rabbitmq ----------------------------------
消息中间件Rabbitmq(01)
消息中间件Rabbitmq(02)
消息中间件Rabbitmq(03)
消息中间件Rabbitmq(04)
消息中间件Rabbitmq(05)
消息中间件Rabbitmq(06)
消息中间件Rabbitmq(07)
------------------- ---------- 云计算 -------------------------------------
云计算(1)——docker的前世今生
云计算(2)—— 体系结构
云计算(3)—— 容器应用
云计算(4)—— LAMP