云原生书籍

核心提示实战 Dockerfile前言博主语录:一文精讲一个知识点,多了你记不住,一句废话都没有经典语录:别在生活里找你想要的,要去感受生活里发生的东西Dockerfile 基础知识已经在上一篇做了详细介绍,如果还不是很清楚的同学可以点击传送门再复

实战文档

博主语录:一句好话讲了一个知识点,但是记不住更多,没有废话。

经典语录:不要去寻找生活中你想要的,而是去感受生活中发生的。

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 "]

十大案例经典。你一定要看里面的备注,备注写在评论里。如果不太了解Docker,可以回顾一下我之前的文章:

大数据需要拥抱云原生吗?为什么云土著这么火?_兰松立的博客-CSDN博客_云原生大数据

【云原生| Docker】《带你走进Docker的世界》轻松学习原理|架构|安装|加速_兰松利的博客——CSDN博客

【云原生| Docker】轻松学习Docker命令_兰松利的博客-CSDN博客

【云原生| Docker】网络与存储原理_兰松利的博客-CSDN博客

 
友情链接
鄂ICP备19019357号-22