【云原生 | Docker篇】实战Dockerfile(五)(下)

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
简介: 【云原生 | Docker篇】实战Dockerfile(五)(下)

第五例、ADD与COPY指令简单使用



# ADD与COPY指令


FROM alpine


#把上下文Context指定的内容添加到镜像中,如果是压缩包,自动解压,


# 把当前内容复制到这个 alpine小系统里面


# 如果是远程文件,自动下载;


# 如果是压缩包,自动解压;


ADD https://download.redis.io/releases/redis-6.2.1.tar.gz  /dest/


#本地linux系统的内容文件添加进去  【宿主机   镜像内】


# docker build -t demo:test  -f Dockerfile 【.:上下文的文件路径】    : .代表上下文环境;代表Dockerfile所在的当前目录


#自动解压


# 压缩包位置:/root/dockerfiles


ADD *.tar.gz   /app/
# RUN ls -l


# 相当于给当前容器开一个用户,以后的命令可以用这个用户运行


# 不自动解压和下载


# COPY nginx


# 以容器的用户:


# RUN  "useradd "
COPY  --chown=redis:redis   *.tar.gz  /redis/


# RUN指令上下并没有上下文关系;


# RUN cd /dest


# 当前还是列举的根目录


# RUN ls -l
RUN cd /dest && ls -l
RUN cd /app && ls -l
RUN cd /redis && ls -l


#把上下文Context指定的内容复制到镜像中


# COPY


第六例、COPY的文件可以改变用户



# COPY的文件可以改变用户


FROM alpine


# 开用户


#RUN adduser -u lanson -g lanson


# 以后的所有命令会用 lanson:lanson 来执行。有可能没有执行权限


# 容器中的ROOT虽然不是linux宿主机的真实root,但是可以改掉这个镜像的所有


USER 1000:1000


# 把复制来的文件给用户所有权


COPY --chown=lanson:lanson   *.txt   /a.txt
RUN ls -l /


#不是root不能写


RUN  echo 2222 >> a.txt


第七例、 WORKDIR的应用

# WORKDIR的应用


FROM alpine
RUN pwd && ls -l


# 为以下所有的命令运行指定了基础目录


WORKDIR /app


# 可以为进入容器指定一个默认目录


WORKDIR abc


##比如我们的nginx镜像可以做成这样


#WORKDIR /usr/share/nginx/html


# /app/abc  多个WORKDIR可以嵌套


RUN pwd && ls -l


#复制到当前目录下


COPY *.txt   ./
RUN  pwd && ls -l
CMD ping baidu.com


# Nginx镜像WORKDIR应用


FROM nginx
WORKDIR /usr/share/nginx/html




#剩下都是原来 nginx 默认的


第八例、VOLUME需要注意的坑与EXPOSE使用



FROM alpine
RUN mkdir /hello && mkdir /app
RUN echo 1111 > /hello/a.txt
RUN echo 222 > /app/b.txt
#挂载 容器的指定文件夹,如果不存在就创建。
#指定了 VOLUME ,即使启动容器没有指定 -v 参数,我们也会自动进行匿名卷挂载
# 容器内的 /hello ,/app 文件夹,请你在使用镜像启动容器的时候,自动给宿主机上挂载
# VOLUME挂载出去的东西,容器改变也不会最终commit的时候生效
# -v 使用 VOLUME和-v挂载出去的目录(外面变,容器里面变)。但是
# 所有改变也生效了


# 1)、但是 docker commit 提交当前容器的所有变化为镜像的时候,就会丢弃


# 2)、VOLUME [ "/hello","/app" ] 容器以后自动挂载,在Dockerfile中对VOLUME的所有修改都不生效


# 3)、挂载只有一点就是方便在外面修改,或者把外面的东西直接拿过来


# 所以这个写在最后
# JAVA 日志都要挂外面 /app/log
# VOLUME ["/log"]
VOLUME [ "/hello","/app" ]


# VOLUME 指定的挂载目录
# 这两句话没有生效
RUN echo 6666 >> /hello/a.txt
RUN echo 8888 >> /app/b.txt
RUN cd /hello && echo 88888 >>a.txt


#暴露 ,这个只是一个声明;给程序员看。docker也能看到
# docker -d -P(随机分配端口,)
EXPOSE 8080
EXPOSE 999
CMD ping baidu.com


第九例、CMD、ENTRYPOINT容器启动指令



FROM alpine
# ENTRYPOINT: 入口(真正的门)
# ENTRYPOINT [ "ping" ]
# 命令(进门的时候带口令)
# 最终的用法: CMD是给ENTRYPOINT提供参数的
#CMD可以被修改
# CMD ping baidu.com
# ENTRYPOINT + CMD = 容器的完整启动命令
# 这是启动命令
# ENTRYPOINT ping + CMD baidu.com = 错误
#多个CMD只有最后一次生效
# CMD ping baidu.com
# ["echo","${param}"] 不是bash -c的方式,取不出环境变量性  【】
# echo $param     = ["/bin/sh","-c","多长的命令都写在这里  echo ${param}"]
# ENTRYPOINT或者CMD作为唯一入口,只能写一个,最后一个生效
# ENTRYPOINT ping atguigu.com
# RUN,CMD,ENTRYPOINT
# []:  ["/bin/sh","-c"] = shell
# shell:
FROM alpine
ENV url=baidu.com
#CMD ["ping","baidu.com"]
# CMD ["useradd","-u","1000","-g","2000"]
# CMD ["ping","${url}"]  取不出变量
# CMD ping ${url}
# 官方都是建议使用 []方式
# CMD ["/bin/sh","-c","ping ${url}"]
# ENTRYPOINT ping baidu.com + CMD怎么写都没用,容器启动都是以ENTRYPOINT的完整命令为准
# java -jar xxxx.jar --spring.profile=dev --server.port=8888


# 这两个合在一起不能是错误的命令
#官方推荐的写法,,变化的写CMD,而CMD是提供参数给ENTRYPOINT
# docker run imageName  cmd1  一旦传递了cmd1,CMD指定的所有参数都会被覆盖,
# 自定义参数的情况下一定要传完
CMD [ "5","baidu.com" ]
#exec的写法 不变的写 ENTRYPOINT;未来他是容器启动的唯一入口,
ENTRYPOINT [ "ping","-c" ]


第十例、 多阶段构建



FROM alpine
RUN  安装maven
RUN mvn clean package
COPY  xx.jar /app.jar
ENTRYPOINT [ "java","-jar","app.jar" ]


#SpringBoot应用 java -jar xxx.jar
# jre环境;可以自己打包
# 一个镜像分为多个大的阶段进行构建,最终的构建结果是最后一个阶段的结果


# 多阶段构建
# FROM alpine AS build
# xxxxxx


# FROM  jre
# COPY  --from=build xxx  xxx
# ENTRYPOINT [ "executable" ]
FROM  maven:3.6.1-jdk-8-alpine AS buildapp
WORKDIR /app
COPY pom.xml .
COPY src .
RUN mvn clean package -Dmaven.test.skip=true
# /app 下面有 target
RUN pwd && ls -l
RUN cp /app/target/*.jar  /app.jar
RUN ls -l
### 以上第一阶段结束,我们得到了一个 app.jar


## 只要一个JRE
FROM openjdk:8-jre-alpine
#FROM openjdk:8u282-slim
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone
LABEL maintainer="lanson"
# 把上一个阶段的东西复制过来
COPY --from=buildapp /app.jar  /app.jar
# docker run -e JAVA_OPTS="-Xmx512m -Xms33 -" -e PARAMS="--spring.profiles=dev --server.port=8080" -jar /app/app.jar
# 启动java的命令
ENV JAVA_OPTS=""
ENV PARAMS=""
ENTRYPOINT [ "sh", "-c", "java -Djava.security.egd=file:/dev/./urandom $JAVA_OPTS -jar /app.jar $PARAMS" ]


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2天前
|
NoSQL Java Linux
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
《docker高级篇(大厂进阶):2.DockerFile解析》包括:是什么、DockerFile构建过程解析、DockerFile常用保留字指令、案例、小总结
121 75
|
3天前
|
存储 Kubernetes 开发者
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
Docker 是一种开源的应用容器引擎,允许开发者将应用程序及其依赖打包成可移植的镜像,并在任何支持 Docker 的平台上运行。其核心概念包括镜像、容器和仓库。镜像是只读的文件系统,容器是镜像的运行实例,仓库用于存储和分发镜像。Kubernetes(k8s)则是容器集群管理系统,提供自动化部署、扩展和维护等功能,支持服务发现、负载均衡、自动伸缩等特性。两者结合使用,可以实现高效的容器化应用管理和运维。Docker 主要用于单主机上的容器管理,而 Kubernetes 则专注于跨多主机的容器编排与调度。尽管 k8s 逐渐减少了对 Docker 作为容器运行时的支持,但 Doc
27 5
容器化时代的领航者:Docker 和 Kubernetes 云原生时代的黄金搭档
|
9天前
|
关系型数据库 应用服务中间件 PHP
实战~如何组织一个多容器项目docker-compose
本文介绍了如何使用Docker搭建Nginx、PHP和MySQL的环境。首先启动Nginx容器并查看IP地址,接着启动Alpine容器并安装curl测试连通性。通过`--link`方式或`docker-compose`配置文件实现服务间的通信。最后展示了Nginx配置文件和PHP代码示例,验证了各服务的正常运行。
29 3
实战~如何组织一个多容器项目docker-compose
|
25天前
|
数据库 Docker 容器
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。
Docker在现代软件开发中扮演着重要角色,通过Dockerfile自动化构建Docker镜像,实现高效、可重复的构建过程。Dockerfile定义了构建镜像所需的所有指令,包括基础镜像选择、软件安装、文件复制等,极大提高了开发和部署的灵活性与一致性。掌握Dockerfile的编写,对于提升软件开发效率和环境管理具有重要意义。
48 9
|
25天前
|
存储 缓存 监控
Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
本文介绍了Docker容器性能调优的关键技巧,涵盖CPU、内存、网络及磁盘I/O的优化策略,结合实战案例,旨在帮助读者有效提升Docker容器的性能与稳定性。
64 7
|
27天前
|
Kubernetes Linux 开发者
深入探索容器化技术——Docker 的实战应用
深入探索容器化技术——Docker 的实战应用
74 0
|
28天前
|
存储 Cloud Native 开发者
深入探索容器化技术——Docker的实战应用
深入探索容器化技术——Docker的实战应用
38 0
|
28天前
|
存储 安全 Docker
Docker 的实战应用与优化策略
Docker 的实战应用与优化策略
36 0
|
22天前
|
运维 Cloud Native 持续交付
深入理解云原生架构及其在现代企业中的应用
随着数字化转型的浪潮席卷全球,企业正面临着前所未有的挑战与机遇。云计算技术的迅猛发展,特别是云原生架构的兴起,正在重塑企业的IT基础设施和软件开发模式。本文将深入探讨云原生的核心概念、关键技术以及如何在企业中实施云原生策略,以实现更高效的资源利用和更快的市场响应速度。通过分析云原生架构的优势和面临的挑战,我们将揭示它如何助力企业在激烈的市场竞争中保持领先地位。
|
20天前
|
Kubernetes Cloud Native 微服务
探索云原生技术:容器化与微服务架构的融合之旅
本文将带领读者深入了解云原生技术的核心概念,特别是容器化和微服务架构如何相辅相成,共同构建现代软件系统。我们将通过实际代码示例,探讨如何在云平台上部署和管理微服务,以及如何使用容器编排工具来自动化这一过程。文章旨在为开发者和技术决策者提供实用的指导,帮助他们在云原生时代中更好地设计、部署和维护应用。