Dockerfile及相关知识拓展

目录

编写dockerfile文件

docker打包MVN依赖

华为云相关

Rancher

编写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.一键部署容器化应用到任意资源池中的任意集群环境。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值