实战文档
序

博主语录:一句好话讲了一个知识点,但是记不住更多,没有废话。
经典语录:不要去寻找生活中你想要的,而是去感受生活中发生的。
Dockerfile的基础知识在上一篇文章中已经详细介绍过了。如果不清楚,同学们可以点击门户再复习一遍。
门户:【云原生| Docker】深入Dockerfile_Lansonli的博客——CSDN博客
以下是十个实战经典的例子。经过反复练习,就可以玩Dockerfile了
运行实例命令
#修改dockerfile文件vim docterfile # Build容器查看执行过程docker Build-no-cache-t demo:test-f docker file。#传入构建参数docker build-no-cache-build-arg param = " 11 22 33 " msg = " aabbcc "-t demo:test-f docker file 2。#转到容器控制台docker exec -it mydemo1 /bin/sh。
第一个例子,这是我的第一个Dockerfile文件。
#这是我的第一个Dockerfile文件
来自阿尔卑斯山
#标记图像。
LABEL maintainer="lanson @ dd "
abc=def
aaa=bbb cccc=ddd
#运行指令,安装软件,修改文件,默认为id=0,即root,这个基本系统的根用户。
#代表在镜像构建过程中运行的命令。
运行echo 11111
# mirror startup如果运行一个很长的命令,容器会启动已执行的命令。
## 1.准备一个sh文件,让镜像启动并运行sh文件。
## 2,直接在CMD位置写。
CMD睡眠10;回声成功
第二个例子,ARG指令和ENV指令的简单使用#您不能引用多个。
来自阿尔卑斯山
LABEL maintainer="llanson @ dd"
abc=def
aaa=bbb cccc=ddd
#指定构建参数[在构建时]
ARG aaa=aaaa
#指定环境变量[为RUN和CMD指定环境变量]
ENV parm=11111
# shell * formbash -c“回声11111”
运行echo $parm
# exec表单。默认情况下,$parm无法获取ENV。
运行["echo "," $aaa"]
#错误的语法RUN ["echo ",' $parm']
#错误的语法RUN ["echo ",$parm]
#语法错误。未发现
#RUN ["echo ",' ${aaa}']
#RUN ["echo ",${parm}]
#是可以启动容器的所有命令。有什么区别吗
#CMD睡眠1;echo $ parmecho $ aaa
#是可以启动容器的所有命令。有什么区别吗
入口点睡眠1;echo $ parm
第三个例子,ARG指令可以在任何地方定义。#可以在任何地方定义,并且可以在将来作为一个值使用,
#用-build-argversion = 3.13更改;以我们介绍的为准。
参数版本=3.13.4
# 3.13
来自阿尔卑斯山:版本
LABEL maintainer="lanson" a=b
c=dd
#构建期和运行期都可以生效;但是它只能在运行时修改。
#如何修改:编译时修改和运行时修改。
# ENV的值在构造期间不能更改。
# Runtime:docker run-e app = atguigu可以修改。
ENV app=itdachang
# #在测试构建期间有效
运行echo $应用程序
运行echo $param
#定义后剩下的步骤才能生效:取$ param的值;
#它可以在构建时更改,docker构建
# ARG不能像ENV一样并排写。
ARG param=123456
ARG msg="hello docker "
#我们将在构建期间运行的指令
运行echo 11111
运行echo $param
运行echo $msg
#我们将在运行时运行的指令
#
# CMD和ENTRYPOINT是指定运行时的指令。
CMD ["/bin/sh ","-c "," echo 1111echo $ paramecho app_${app}"]
第四个例子,坑的ENV-该值在构造时已经确定。# env的坑
来自阿尔卑斯山
# ARG msg=hello
# # ENV肯定可以引用ARG
# ENV name=${msg}
#运行echo ${name}
#运行echo ${msg}
# ENV只能在运行时更改。
ENV msg1=hello
环境消息2 = $消息1
#该值已在上述构建期间确定;ENV持久性问题。
运行echo ${ msg 1 }
运行echo ${ msg 2 }
# msg1=msg2没问题;如果我的运行时修改了msg1=66666的值,请求msg 1;Msg2输出什么
#结果输出:6666 hello值不算参考?马鞭马鞭原因:
构建# Docker时,env环境的信息会被固化,直接在镜像配置中写死,msg1=hello,msg2=hello。
# -e实际上只能修改当前的env本身
#为什么所有的值都可以在运行时用ENV定义?ENV必须存在于某个地方。
CMD ["/bin/sh ","-c "," echo $ { msg 1 };echo $ { msg 2 };"]
第五个例子,简单使用添加和复制指令#添加和复制说明
来自阿尔卑斯山
#将上下文Context指定的内容添加到图像中。如果是压缩包,会自动解压缩,
#将当前内容复制到这个alpine小系统中
#如果是远程文件,自动下载;
#如果是压缩包,会自动解压;
添加https://download.redis.io/releases/redis-6.2.1.tar.gz/目的地/
#本地linux系统的内容文件被添加到[主机映像]
# docker build-t demo:test-f docker file[。:上下文的文件路径]:。表示上下文环境;表示Dockerfile所在的当前目录。
#自动解压
#压缩包位置:/root/dockerfiles
ADD *.tar.gz /app/
#运行ls -l
#相当于为当前容器打开一个用户,以后的命令可以用这个用户运行。
#不要自动解压缩和下载
#复制nginx
#使用容器的用户:
#运行“useradd”
COPY-chown = redis:redis * . tar . gz/redis/
# RUN指令和下一条指令之间没有上下文;
#运行光盘/目的地
#目前,它仍然是枚举的根目录。
#运行ls -l
运行cd /dest ls -l
运行cd /app ls -l
运行cd /redis ls -l
#将上下文Context指定的内容复制到镜像中
#复制
第六个例子:复制的文件可以改变用户。#复制文件可以改变用户
来自阿尔卑斯山
#开放用户
#运行adduser -u lanson -g lanson
#以后的所有命令都将使用lanson:lanson执行。可能没有执行权。
#容器中的根目录不是linux主机的真正根目录,但是它可以改变这个映像的所有权。

用户1000:1000
#将复制的文件所有权授予用户。
COPY - chown=lanson:lanson *。txt /a.txt
运行ls -l /
#不是根不能写
运行echo 2222 >> a.txt
第七个例子,WORKDIR的应用# WORKDIR的应用
来自阿尔卑斯山
运行密码和最小二乘密码
#指定以下所有命令运行的基目录。
工作目录/应用程序
#您可以指定用于输入容器的默认目录
工作方向abc
# #比如我们的nginx镜子可以做成这样
#WORKDIR /usr/share/nginx/html
#/app/ABC可以嵌套多个工作目录
运行密码和最小二乘密码
#复制到当前目录
复制*。txt。/
运行密码和最小二乘密码
CMD平Baidu.com
# Nginx镜像工作目录应用程序
来自nginx
工作目录/usr/share/nginx/html
#其余都是nginx原来的默认。
例8:量和使用EXPOSE需要注意的坑来自阿尔卑斯山
运行mkdir /hello mkdir /app
运行echo 1111 > /hello/a.txt
运行echo 222 > /app/b.txt
#挂载容器的指定文件夹,如果它不存在,则创建它。
# VOLUME被指定,即使启动容器没有指定-v参数,我们也会自动挂载匿名卷。
#容器中的/hello,/app文件夹,请在使用映像启动容器时自动将其挂载到主机上。
当装入# VOLUME时,容器更改在最终提交时不会生效。
# -v使用卷和-v安装的目录。但是
#所有的改变也生效了
# 1),但是当docker commit提交当前容器的所有更改都是镜像时,它将被丢弃。
# 2)、VOLUME ["/hello ","/app"]容器以后会自动挂载,Dockerfile中对VOLUME的所有修改都不会生效。
# 3),挂载的唯一一点就是方便在外面修改,或者直接把东西带到外面。
#所以这写在最后
# JAVA日志应该挂在/app/log之外
#卷["/log"]
音量[ "/hello ","/app" ]
#由卷指定的挂载目录
#这两句没生效
运行echo 6666 >> /hello/a.txt
运行echo 8888 >> /app/b.txt
运行cd /hello echo 88888 >>a.txt
#暴露,这只是一种说法;给程序员看看。码头工人也能看到
# docker -d -P
曝光8080
曝光999
CMD平Baidu.com
示例9: CMD,入口点容器启动指令来自阿尔卑斯山
#入口点:入口
#入口点[ "ping" ]
#命令
#最终用法:CMD向ENTRYPOINT提供参数。
#CMD可以修改。
# CMD ping Baidu.com
# ENTRYPOINT+CMD =容器的完整启动命令
#这是开始命令。
#入口点ping+cmd Baidu.com =错误
#多个命令只在上一次生效
# CMD ping Baidu.com
# ["echo "," ${param}"]不是bash -c的方式,无法获得环境可变性[]
# echo $param = ["/bin/sh ","-c ","任何长命令都写在这里echo ${param}"]
# ENTRYPOINT或CMD是唯一的入口,只能写一个,最后一个生效。
#入口点平atguigu.com
#运行,CMD,入口点
# []: ["/bin/sh ","-c"] = shell
#外壳:
来自阿尔卑斯山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被传递,cmd1指定的所有参数都将被覆盖,
#如果是用户定义的参数,必须完成。
CMD [ "5 "," baidu.com" ]
#exec的编写方式和ENTRYPOINT一样;;未来是集装箱启动的唯一入口,
入口点[ "ping ","-c" ]
第十个例子,多阶段施工来自阿尔卑斯山
安装maven
运行mvn干净包
复制xx.jar /app.jar
入口点[ "java ","-jar "," app.jar" ]
#SpringBoot应用程序java -jar xxx.jar
# jre环境;你可以自己打包。
#一个镜像是分几个大阶段构建的,最后的构建结果是最后一个阶段的结果。
#多阶段施工
#从阿尔卑斯山开始建造
# xxxxxx
#来自jre
#复制自=内部版本xxx xxx
# ENTRYPOINT [“可执行文件”]
来自maven:3 . 6 . 1-JDK-8-alpine AS build app
工作目录/应用程序
复制pom.xml。
复制src。
运行mvn清理包-Dmaven.test.skip=true
app下有目标
运行密码和最小二乘密码
运行cp /app/target/*。jar /app.jar
运行ls -l
# # #在上面的第一阶段之后,我们得到了一个app.jar
#只有一个JRE
来自openjdk:8-jre-alpine
#来自openjdk:8u282-slim
运行ln-SF/usr/share/zoneinfo/Asia/Shanghai/etc/local time echo ' Asia/Shanghai ' >/etc/time zone
LABEL maintainer="lanson "
#从上一阶段复制一些东西
复制自=buildapp /app.jar /app.jar
# docker run-e JAVA _ OPTS = "-xmx 512m-xms 33-"-e PARAMS = "-spring . profiles = dev-server . port = 8080 "-jar/app/app . jar
#启动java的命令
ENV JAVA_OPTS= " "
ENV PARAMS= " "
ENTRYPOINT [ "sh ","-c "," Java-DJ ava . security . EGD = file:/dev/。/urandom $ JAVA _ OPTS-jar/app . jar $ PARAMS "]

大数据需要拥抱云原生吗?为什么云土著这么火?_兰松立的博客-CSDN博客_云原生大数据
【云原生| Docker】《带你走进Docker的世界》轻松学习原理|架构|安装|加速_兰松利的博客——CSDN博客
【云原生| Docker】轻松学习Docker命令_兰松利的博客-CSDN博客
【云原生| Docker】网络与存储原理_兰松利的博客-CSDN博客


