docker学习笔记⼋、Dockerfile实战教程
⼀、初识
1、Docker 简介:
镜像的定制实际上就是定制每⼀层所添加的配置、⽂件。那么如果我们可以把每⼀层修改、安装、构建、操作的命令都写⼊⼀个脚本,⽤这个脚本来构建、定制镜像,那么之前提及的⽆法重复的问题、镜像构建透明性的问题、体积的问题就都会解决。这个脚本就是Dockerfile。
Dockerfile描述了组装镜像的步骤,其中每⼀条命令都是单独执⾏的,除了FROM指令外,其他每⼀条指令都在上⼀条指定所⽣成的镜像基础上执⾏,执⾏完会⽣成⼀个新的镜像层,新的镜像层覆盖在原来的镜像层之上,从⽽形成了新的镜像。Dockerfile所⽣成的最终镜像就是在基础叠加镜像上⼀层层的镜像层组成的。
在Dockerfile中,指令不区分⼤⼩写,但是为了与参数区分,推荐⼤写。Docker会顺序执⾏Dockerfile中的指令,第⼀条必须是FROM指令,它⽤于指定构建镜像的基础镜像。在Dockerfile中,以#开头的⾏是注释。
2、FROM指令和RUN指令
FROM指定基础镜像;
格式:FROM <image>或 FROM <image>:<tag>。
FROM指令的功能是为后⾯的指令提供基础镜像,因此⼀个有效的Dockerfile必须以FROM指令作为第⼀条⾮注解指令。若FROM指令中tag参数为空,则tag默认为latest;若参数image或tag指定镜像不存在,则返回错误。
RUN执⾏命令;
格式:RUN <command>(shell格式)或RUN [“executable”, “param1“, “param2”](exec格式,⾮常推荐)。
RUN指令是⽤来执⾏命令⾏命令的。RUN指令会在前⼀条命令创建出的镜像的基础上创建⼀个容器,并在容器中运⾏命令。在命令结束运⾏后提交新容器为新镜像,新镜像被Dockerfile的下⼀条指令使⽤
3、Dockerfile构建⼀个镜像
步骤:
⾸先创建⼀个空⽂件夹:mkdir newdir;
然后进⼊该⽂件夹:cd newdir;
在该⽂件夹下创建⼀个名为Dockerfile的⽂件,根据实际需求补全Dockerfile的内容;
使⽤Dockerfile构建⼀个镜像:docker build -t testimage .(注意这个⼩数点)其中-t指定新镜像的镜像名。
构建第⼆次参考案例2
例⼦1:
#先创建⼀个新的空⽂件夹
#mkdir newdir
#进⼊这个新⽂件夹中
#cd newdir
#创建⼀个Dockerfile⽂件
#touch Dockerfile
#补全Dockerfile的内容(为了⽅便展⽰,这⾥⽤的是echo向Dockerfile中输⼊内容)
#echo "FROM ubuntu:latest" > Dockerfile
#echo "RUN mkdir /dir1" >> Dockerfile
#使⽤该Dockerfile构建⼀个名为testimage的镜像
#docker build -t testimage . //这个点注意有空格
Dockerfile 的内容为下
FROM ubuntu:latest
RUN mkdir /dir1
Docker指令是从上到下⼀层⼀层执⾏的,所以在使⽤这个Dockerfile构建镜像时,⾸先执⾏FROM ubuntu:latest这条指令。
FROM ubuntu:latest指定ubuntu:latest作为基础镜像,也就是将ubuntu:latest镜像的所有镜像层放置在testimage镜像的最下⾯。
然后执⾏RUN mkdir dir1指令,前⾯我们说过,执⾏RUN指令时,会在之前指令创建出的镜像的基础上创建⼀个临时容器,在这⾥的容器Id为c5117d908931,并在容器中运⾏命令。在命令结束运⾏后提交新容器为新镜像,并删除临时创建的容器c5117d908931。
在Dockerfile的所有指令执⾏完后,新镜像就构建完成了!
注意事项,谨慎使⽤RUN
4、修改前的Dokcerfile⽂件
修改Dockerfile 构建第⼆层镜像
FROM debian:jessie
RUN buildDeps='gcc libc6-dev make' \
&& apt-get update \
&& apt-get install -y $buildDeps \
&& wget -O "dis.io/releases/redis-3.2." \
&& mkdir -p /usr/src/redis \
&& tar -xzf -C /usr/src/redis --strip-component
s=1 \
&& make -C /usr/src/redis \
&& make -C /usr/src/redis install \
&& rm -rf /var/lib/apt/lists/* \
&& rm \
&& rm -r /usr/src/redis \
&& apt-get purge -y --auto-remove $buildDeps
在Dockerfile的编写过程中⼀定要牢记⼀点:镜像的每⼀层构建完就不会再发⽣改变,后⼀层上的任何改变只发⽣在⾃⼰这⼀层。删除前⼀层⽂件的操作,实际不是真的删除前⼀层的⽂件,⽽是仅在当前层标记为该⽂件已删除。在最终容器运⾏的时候,虽然不会看到这个⽂件,但是实际上该⽂件会⼀直
跟随镜像。
例⼦2
#创建⼀个空⽂件夹,并进⼊其中
mkdir newdir1
cd newdir1
#创建⼀个Dockerfile⽂件
touch Dockerfile
#假设我的Dockerfile⽂件为
#FROM ubuntu
#RUN mkdir dir1
#可以这么写:
# echo 'FROM ubuntu' > Dockerfile
# echo 'RUN mkdir dir1'>> Dockerfile
#输⼊Dockerfile⽂件内容
#********** Begin *********#
#以busybox为基础镜像
echo 'FROM busybox'> Dockerfile
#在基础镜像的基础上,创建⼀个⽂件
echo 'RUN '>> Dockerfile
#********** End **********#
#使⽤Dockerfile创建⼀个新镜像,镜像名为busybox:v1
docker build -t busybox:v1 . //注意这个点有空格
⼆、docker build、COPY和ADD
1、docker buid 命令详解
Dockerfile创建完成后,可以使⽤docker build命令根据Dockerfile构建⼀个镜像。在上⼀关中,我们在Dockerfile所在的⽂件夹下执⾏docker build -t myimage .这条命令,然后镜像就被构建了ubuntu使用入门教程
#docker build [OPTIONS] 上下⽂路径|URL
docker build: ⽤Dockerfile构建镜像的命令关键词;
[OPTIONS]: 命令选项,常⽤的指令包括-t指定镜像的名字,-f显⽰指定Dockerfile,如果不使⽤-f,则默认将上下⽂路径下的名为Dockerfile的⽂件认为是构建镜像的“Dockerfile”;
上下⽂路径|URL: 指定构建镜像的上下⽂的路径,构建镜像的过程中,可以且只可以引⽤上下⽂中的任何⽂件
2、COPY指令和ADD指令
1)COPY复制⽂件;
格式:COPY <;源路径> <⽬标路径>;
COPY 指令将从构建上下⽂⽬录中 <;源路径> 的⽂件或⽬录复制到新的⼀层的镜像内的 <⽬标路径> 位置。<;源路径>所指定的源必须在上下⽂中,即必须是上下⽂根⽬录的相对路径!<⽬标路径> 可以是容器内的绝对路径,也可以是相对于⼯作⽬录的相对路径(⼯作⽬录可以⽤WORKDIR指令来指定,后⾯介绍)。⽬标路径不需要事先创建,如果⽬录不存在会在复制⽂件前先⾏创建⽬录。
2)ADD更⾼级的⽂件复制;
格式:ADD <;源路径> <⽬标路径>;
ADD与COPY指令在功能上⼗分相似,但是在COPY的基础上增加了⼀些功能。⽐如,源路径可以是⼀个指向⼀个⽹络⽂件的URL,这种情况下,Docker引擎会试图下载这个URL指向的⽂件到<⽬标路径>去。
此外,当<;源路径>为⼀个tar压缩⽂件时,该压缩⽂件在被复制到容器中时会被解压提取。但是使⽤COPY指令只会将tar压缩⽂件拷贝到<⽬标路径>中
例⼦:

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。