Dockerfile简介
Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本文件
地址: https://docs.docker.com/engine/reference/builder/
构建docker镜像三部曲:
1.编写Dockerfile文件
2.docker build 命令构建镜像
3.docker run 依靠镜像运行容器实例
DockerFile构建过程解析
Dockerfile基础知识
1每条保留指令都必须大写,且字母后面要跟随至少一个参数;
2指令按照从上到下,顺序执行;
3#表示注释
4每条指令都会创建一个新的镜像层,并对镜像进行提交。
Docker执行Dockerfile的大致流程
1docker从基础镜像运行一个容器
2执行一条指令并对容器做出修改
3执行类似docker commit的操作提交一个新的镜像层
4docker再基于刚提交的镜像运行一个新容器
5执行dockerfile中的下一条指令直到所有指令都指令完毕。
DockerFile常用保留字指令
FROM
基础镜像,当前镜像是来源于哪个镜像。 类似于java中的extends
MAITAINER
镜像维护者的姓名和邮箱地址
RUN
容器构建时需要运行的命令
shell格式
RUN <命令行命令>
#<命令行命令>等同于,在终端操作的 shell 命令
RUN yum -y install vim
exec格式
RUN [“可执行文件”,“参数1”,“参数2”]
例如 :
RUN [”./test.php”,“dev”,“offline”] 等价于 RUN ./test.php dev offline
RUN是在docker bulid时运行
EXPOSE
当前容器对外暴露的端口
WORKDIR
指定在创建容器后,终端默认登录进来的工作目录
ENV
用来在构建镜像过程中设置环境变量。 设置后可以在后续的任何RUN指令中使用,也可以在其他指令中直接使用这些环境变量。
ENV MY_PATH /usr/mytest
这个环境变量可以在后续的任何RUN指令中使用,这就如同在命令前面指定了环境变量前缀一样;也可以在其它指今中直接使用这些环境变量,
比如: WORKDIR SMY PATH
ADD
拷贝+解压缩 将宿主机目录下的文件拷贝进镜像并且ADD命令会自动处理url和解压tar压缩包
COPY
宿主机目录和文件拷贝进镜像中。
将从构建上下文目录中<源路径>的文件/目录复制到新的一层的镜像内的<目标路径>位置。
COPY src dest
COPY[“src”,“dest”]
<src源路径>:源文件或者源目录
<dest目标路径>:容器内的指定路径,该路径不用事先建好,路径不存在的话,会自动创建。
VOLUME
容器数据卷,用于数据保存和持久化工作
CMD
指定容器启动后要干的事
CMD 指令的格式和 RUN 相似,也是两种格式:
shell 格式: CMD<命令>
exec 格式: CMD ["可执行文件”,“参数1”,"参数2”…]
参数列表格式: CMD[“参数1”,“参数2”…]。
在指定了 ENTRYPOINT 指令后,用 CMD 指定具体的参数。
指定一个容器启动时要运行的命令 Dockerfile中可以有多个CMD指令,但是只有最后一个生效,CMD会被docker run之后的参数替换。
官网最后一行命令
157 EXPOSE 8080
158 CMD [“catalina.sh”,“run”]
官网Tomcat的dockerfile演示
/bin/bash会将原来的catalina.sh覆盖,相当于在之后加了 CMD [”/bin/bash”,“run”],此时tomcat服务并没有启动
[root@zzyy ~]# docker run -it p 8080:8080 57800e5b1cbf /bin/bash
root@eaedbd079d89 Local]#
CMD和前面RUN命令的区别
CMD是在docker run 时运行。
RUN是在 docker build时运行。
ENTRYPOINT
指定一个容器启动时要运行的命令
类似于CMD 指令,但是ENTRYPOINT不会被docker run后面的命令覆盖而且这些命令行参数会被当作参数送给 ENTRYPOINT 指令指定的程序
优点:在执行docker run的时候可以指定 ENTRYPOINT 运行所需的参数。
注意:如果 Dockerfile 中如果存在多个 ENTRYPOINT 指令,仅最后一个生效。
命令格式和案例说明
ONBUILD
当构建一个被继承的Dockerfile时运行命令,父镜像在被子镜像继承后,父镜像的onbuild被触发。
例子
需求:在centos上装有jdk8,ifconfig,vim
Dockerfile文件
FROM centos
MAINTAINER jl<jiulongyueer@outlook.com>
ENV MYPATH /usr/local
WORKDIR SMYPATH
#020 年 12 月 8 号,CentOS 官方宣布了停止维护 CentOS Linux 的计划,并推出了 CentOS Stream 项目,CentOS Linux 8 作为 RHEL 8 的复刻版本,生命周期缩短,于 2021 年 12 月 31 日停止更新并停止维护(EOL),更多的信息可以查看 CentOS 官方公告。如果需要更新 CentOS,需要将镜像从 mirror.centos.org 更改为 vault.centos.org
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN yum update -y
#安装vim编辑器
RUN yum -y install vim
#安装ifconfig命令查看网络IP
RUN yum -y install net-tools
#安装java8及lib库
#这里相当于加了一个加强版的gcc
RUN yum -y install glibc.i686
RUN mkdir /usr/local/java
#ADD 是相对路径jar,把jdk-8u361-linux-x64.tar.gz添加到容器中,安装包必须要和Dockerfile文件在同一位置
ADD jdk-8u361-linux-x64.tar.gz /usr/local/java/
#配置java环境变量
ENV JAVA_HOME /usr/local/java/jdk1.8.0_361
ENV JRE_HOME $JAVA_HOME/jre
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:$CLASSPATH
ENV PATH $JAVA_HOME/bin:$PATH
EXPOSE 80
CMD echo $MYPATH
CMD echo "success------------ok"
CMD /bin/bash
构建新的docker镜像
docker build -t name:tag . 最后一个点记住
[root@localhost myfile]# docker build -t centos-java8:1.0 .
[+] Building 21.3s (17/17) FINISHED
=> [internal] load build definition from Dockerfile 0.0s
=> => transferring dockerfile: 1.51kB 0.0s
=> [internal] load .dockerignore 0.0s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/centos:latest 0.0s
=> [ 1/12] FROM docker.io/library/centos 0.0s
=> [internal] load build context 3.3s
=> => transferring context: 138.79MB 3.3s
=> CACHED [ 2/12] WORKDIR SMYPATH 0.0s
=> CACHED [ 3/12] RUN cd /etc/yum.repos.d/ 0.0s
=> CACHED [ 4/12] RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-* 0.0s
=> CACHED [ 5/12] RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-* 0.0s
=> CACHED [ 6/12] RUN yum makecache 0.0s
=> CACHED [ 7/12] RUN yum update -y 0.0s
=> CACHED [ 8/12] RUN yum -y install vim 0.0s
=> CACHED [ 9/12] RUN yum -y install net-tools 0.0s
=> CACHED [10/12] RUN yum -y install glibc.i686 0.0s
=> CACHED [11/12] RUN mkdir /usr/local/java 0.0s
=> [12/12] ADD jdk-8u361-linux-x64.tar.gz /usr/local/java/ 10.9s
=> exporting to image 6.3s
=> => exporting layers 6.0s
=> => writing image sha256:4ad89a7848347fb79858b61f93ab9e8ebba29f562b11826e8163311f8e5cedd3 0.1s
=> => naming to docker.io/library/centos-java8:1.0 0.0s
[root@localhost myfile]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos-java8 1.0 4ad89a784834 About a minute ago 1.01GB
192.168.253.128:5000/jlubuntu 1.2 09f66e5eb0c6 12 days ago 115MB
jlubuntu 1.2 09f66e5eb0c6 12 days ago 115MB
jlubuntu 1.2.1 09f66e5eb0c6 12 days ago 115MB
registry latest b8604a3fe854 17 months ago 26.2MB
ubuntu latest ba6acccedd29 18 months ago 72.8MB
hello-world latest feb5d9fea6a5 19 months ago 13.3kB
centos latest 5d0da3dc9764 19 months ago 231MB
redis 6.0.8 16ecd2772934 2 years ago 104MB
redis 6.0.7 41de2cc0b30e 2 years ago 104MB
billygoo/tomcat8-jdk8 latest 30ef4019761d 4 years ago 523MB
[root@localhost myfile]# docker run -it 4ad89a784834 bash
[root@66dd9425c2b8 SMYPATH]# java -version
java version "1.8.0_361"
Java(TM) SE Runtime Environment (build 1.8.0_361-b09)
Java HotSpot(TM) 64-Bit Server VM (build 25.361-b09, mixed mode)
[root@66dd9425c2b8 SMYPATH]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 172.17.0.2 netmask 255.255.0.0 broadcast 172.17.255.255
ether 02:42:ac:11:00:02 txqueuelen 0 (Ethernet)
RX packets 8 bytes 656 (656.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
inet 127.0.0.1 netmask 255.0.0.0
loop txqueuelen 1000 (Local Loopback)
RX packets 0 bytes 0 (0.0 B)
RX errors 0 dropped 0 overruns 0 frame 0
TX packets 0 bytes 0 (0.0 B)
TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0
[root@66dd9425c2b8 SMYPATH]#
虚悬镜像
仓库名、标签都是的镜像,俗称dangling image
[root@localhost ~]# cat Dockerfile
FROM ubuntu
CMD echo 'action is success'
[root@localhost ~]#
[root@localhost ~]# docker build .
[+] Building 0.2s (5/5) FINISHED
=> [internal] load build definition from Dockerfile 0.1s
=> => transferring dockerfile: 138B 0.0s
=> [internal] load .dockerignore 0.1s
=> => transferring context: 2B 0.0s
=> [internal] load metadata for docker.io/library/ubuntu:latest 0.0s
=> [1/1] FROM docker.io/library/ubuntu 0.0s
=> exporting to image 0.0s
=> => exporting layers 0.0s
=> => writing image sha256:e39580f94507868694e52fb093f68d5e7f146199a46c1b0e4cf28c2c05c4bf12
#查看虚悬镜像
[root@localhost ~]# docker image ls -f dangling=true
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> e39580f94507 18 months ago 72.8MB
#虚悬镜像已经失去价值,删除
[root@localhost ~]# docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
deleted: sha256:e39580f94507868694e52fb093f68d5e7f146199a46c1b0e4cf28c2c05c4bf12
Total reclaimed space: 0B
[root@localhost ~]#