目录
编写dockerfile文件
相关元素介绍
1. 基础镜像 FROM adoptopenjdk/openjdk8-openj9:alpine-slim
相比FROM openjdk:8u181-jre-slim-stretch
openJ9JVM 通过将HotSpot更换为OpenJ9,内存占用能降低至少60%,而启动时间也能快40%以上。
2.LABER:镜像描述信息
3.COPY 从宿主机复制文件或目录到新建的镜像文件
4.ADD 类似于COPY指令,ADD支持tar文件和URL路径,如果是压缩文件,会被解压,如果是URL下载的tar文件 不会被解压。
5.WORKDIR:用于为Dockerfile中所有的RUN,CMD,ENTRYPOINT,COPY,ADD指定设定工作目录。
5.1WORKDIR /mnt ,如果目录不存在会自动创建,包括他的父目录
5.2一个Dockerfiler中WORKDIR可以出现多次,其路径也可以为相对路径,相对路径是基于前一个WORKDIR路径
6.VOLUME:数据卷,用于在image中创建挂载点目录,以挂载Docker host上的卷或者其他容器上的卷。(支付相关的服务都用到了/usr/local/java目录下的证书),可以考虑用卷的形式挂载。
如果挂载点目录下有文件存在,docker run 命令会在卷挂载完成之后将所有文件复制到容器中。且容器内的数据变化会同步到宿主机。支付相关的证书文件应该不需要双向同步,也可以使用复制文件的方式将目录复制到镜像中。
7.EXPOSE
为容器打开指定的监听端口以实现与外部通信
EXPOSE
1.:端口号 2.
:协议类型,默认为TCP协议 EXPOSE 8080/tcp 8081/udp
2.不会直接对外暴露这里的端口,只有在run的时候加上-P才会将EXPOSE的端口暴露出去。
8.ENV:用于为镜像定义所需的环境变量,可以被Dockerfile文件中其他命令调用(ENV,ADD,COPY,RUN,CMD)
举例 ENV DOC_DIR=/mnt/doc COPY index.html ${DOC_DIR:-/mnt/doc} #-:如果DOC_DIR不存在则使用-后面的默认值 #+:如果DOC_DIR存在则使用+后面的值
9.RUN: docker build 镜像构建的时候需要执行的shell命令默认"/bin/sh -c"运行
1.docker build过程中需要执行的命令。
2. RUN是在镜像构建完成之后运行结束
3.RUN 执行的命令只能基于基础镜像的命令,执行之前先要确定基础镜像是否有该命令
4.可以有多个RUN 命令
举例:RUN mkdir -p /blade/gateway
10. CMD:启动容器指定默认要运行的程序或命令,默认"/bin/sh -c"运行
1.docker run过程中需要执行的命令
2.CMD运行结束后容器就将终止
3.CMD指定的命令将可以被docker run最后面的命令覆盖
4.一个Dockerfile写多个CMD只有最后一个CMD会生效
CMD ["--spring.profiles.active=test"]
11.ENTRYPOINT:类似CMD指令的功能,用于为容器指定默认运行程序或命令。
1.与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数覆盖,这些命令行参数会被当做参数传递给ENTRYPOINT指定的程序。
CMD和ENTRYPOINT同时存在Dockerfile中
CMD的值会当做参数传递给ENTRYPOINT
实现使用shell子进程启动httpd
简单的Dockerfile例子
FROM adoptopenjdk/openjdk8-openj9:alpine-slim
LABEL xxx
#验证码字体包
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/g' /etc/apk/repositories
RUN set -xe && apk --no-cache add ttf-dejavu fontconfig
RUN mkdir -p /blade/auth
WORKDIR /blade/auth
EXPOSE 8100
ADD ./target/blade-auth.jar ./app.jar
ENTRYPOINT ["java", "-Djava.security.egd=file:/dev/./urandom", "-jar", "app.jar"]
CMD ["--spring.profiles.active=test"]
例子2
# base images: 基础镜像
FROM centos-basic:v1.0
# maintainer: 维护者信息
MAINTAINER andya
# env config: 环境变量设置
ENV JAVA_HOME /usr/local/jdk1.8.0_170
ENV PATH $JAVA_HOME/bin:$PATH
# volume:匿名数据卷
VOLUME /nfs
# copy: 拷贝目录或文件(不解压tar包)
COPY --chown=userA:groupA demo.tar demo01.tar
# add:拷贝目录或文件(自动解压tar包)
ADD config /config
ADD sql /sql
ADD micro-service01-1.0.jar /app.jar
# run: 执行命令,修改目录权限
RUN chmod -R 777 /sql
# run: 执行命令,修改文件的访问时间和修改时间为当前时间,而不会修改文件的内容
RUN bash -c 'touch /app.jar'
# expose:暴露端口
EXPOSE 8001
# workdir: 类似于cd进入工作目录
WROKDIR /
# entrypoint:设定容器启动时第一个运行的命令及参数
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","/app.jar"]
docker打包MVN依赖
2.pom文件添加dockerfile-maven-plugin插件
<plugin>
<groupId>com.spotify</groupId>
<artifactId>dockerfile-maven-plugin</artifactId>
<configuration>
<username>${docker.username}</username>
<password>${docker.password}</password>
<repository>${docker.registry.url}/${docker.namespace}/${project.artifactId}</repository>
<tag>${project.version}</tag>
<useMavenSettingsForAuth>true</useMavenSettingsForAuth>
<buildArgs>
<JAR_FILE>target/${project.build.finalName}.jar</JAR_FILE>
</buildArgs>
<skip>false</skip>
</configuration>
</plugin>
华为云相关
1.ELB配置避坑。
ELB是弹性负载均衡,当我们的后端服务器没有外部访问能力的时候,需要通过配置ELB转发,将我们的请求转发到后端服务器。配置ELB的监听器的时候,到最后有个配置健康检查的地方,这个地方一定不要填端口,如果填了端口(肯定要与后端服务器端口相同),后期想要更换后端服务器端口的时候,这个建行检查端口也要跟着改。
Rancher
容器可以看做是轻量化的虚拟机,也可以看做是微服务的基础等等,但容器本身其实最关键的是跳出操作系统而独立运行。
好比容器是标准化的海运集装箱,OS就是货轮,集装箱的内容可以由用户自定义,可以通过标准化手段自由组装到各个不同的货轮上。在云环境中,OS就是不同的云计算平台。
容器的好处:1.可以跨平台,从而让程序员可以享受到研发生产环境一致性的遍历,也就是DevOps。在没有容器之前,尝尝一个应用做好了在笔记本上可以运转起来,在数据中心就运转不起来,因为操作系统版本不同,库版本不对;或者有的时候生产环境出现了问题,在笔记本的开发环境中复制不出来。有了容器之后,这些问题就大大减少了---这也就是为什么容器有大量市场需求的原因。2.容器在虚拟机里面可以大幅度提升资源利用率。因为一旦把应用容器化,虚拟机资源就可以通过部署多个容器而得到充分利用,而不是每一个应用去申请一个虚拟机,造成资源的浪费。
虽然容器市场前景广阔,但目前容器也有开源产业的通病,需要自己DIY。实际上,容器在生产环境部署运行仍然十分困难,因为容器工具和技术栈的数量繁多,来自于不同的供应商,而Rancher抓住的商业机会就是简化容器的部署。
Rancher
Rancher是一套容器管理平台,他可以帮助组织在生产环境中轻松快捷的部署和管理容器。Rancher可以轻松地管理各种环境的Kubernetes,满足IT需求并未DevOps团队提供支持。
Kubernetes不仅已经成为容器编排标准,他也正在迅速成为各类云和虚拟化厂商提供的标准基础架构。Rancher用户可以选择使用Rancher Kubernetes Engine创建Kubernetes集群,也可以使用GKE,AKS和EKS等云Kubernetes服务。Rancher用户还可以导入和管理现有的Kubernetes集群。
Rancher支持各类集中式身份验证系统来管理Kubernets集群。例如,大型企业的员工可以使用其公司Active Directory凭证访问GKE中的Kubernetes集群。IT管理员可以在用户,组,项目,集群和云中设置访问控制和安全策略。IT管理员可以在单个页面对所有Kubernetes集群的健康状况和容量进行监控。
Rancher为DevOps工程师提供了一个直观的用户界面来管理他们的服务容器,用户不需要深入了解Kubernetes概念就可以开始使用Rancher。Rancher包含应用商店,支持一键式部署Helm和Compose模板。Rancher通过各种云,本地生态系统产品认证,其中包括安全工具,监控系统,容器仓库以及存储和网络驱动程序。
五大应用场景:
据了解 目前容器在国内的典型应用场景可以归纳为5大类:
1.混合云及复杂数据中心
2.多环境,多资源池的DevOps流水线;
3.基于Rancher的轻量级PaaS;
4.IT综合资产管理平台
5.一键部署容器化应用到任意资源池中的任意集群环境。