0
点赞
收藏
分享

微信扫一扫

云计算(5)—— Dockerfile

zhoulujun 2022-11-08 阅读 93

什么是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:用于设置镜像触发器

最后用一张图解释常用指令的意义^-^

云计算(5)—— Dockerfile_tomcat


微服务治理的手段

节点管理

第一种:注册中心主动剔除有问题的服务提供者
根据心跳机制决定哪些服务提供者有效,由注册中心主动撤除有问题的服务提供者的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



云计算(5)—— Dockerfile_nginx_02

举报

相关推荐

0 条评论