Dockerfile

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 ~]# 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值