Dockerfile构建过程详解 原创

目录

Dockerfile介绍

Dockerfile构建过程

基础知识

DockerFile的指令

实战测试

CMD 和 ENTRYPOINT 区别


Dockerfile介绍

docker是用来构建docker镜像的文件!命令参数脚本!

构建步骤:

1、编写一个dockerfile文件

2、docker build构建成为一个镜像

3、docker run 运行镜像                                                                                                                     

4、docker push 发布镜像(DockerHub、阿里云镜像仓库)


Dockerfile构建过程

基础知识


1、每个保留关键字(指令)都是必须是大写字母

2、执行从上到下顺序执行

3、# 表示注释

4、每一个指令都会创建提交一个新的镜像层,并提交!

dockerfile是面向开发的,以后要发布项目,做镜像,就需要编写dockerfile文件

Docker 镜像逐渐成为企业交付的标准,必须要掌握!

步骤:开发,部署,运维    缺一不可

DockerFile:构建文件,定义了一切步骤,源代码

DockerImages:通过DockerFile构建生成的镜像,最终发布和运行的产品

Docker容器:容器就是镜像运行起来提供服务的


DockerFile的指令

FROM                  #  基础镜像,一切从这里开始构建

MAINTAINER       #  镜像是谁写的,姓名+邮箱

RUN                     #  镜像构建的时候需要运行的命令

ADD                     #  步骤:tomcat镜像,这个tomcat压缩包!添加目录

WORKDIR            #  镜像的工作目录

VOLUME              #   挂载的目录

EXPOST               #   保留端口配置

CMD                  #  指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT          #   指定这个容器启动的时候要运行的命令,可以追加命令

ONBUILD               #   当构建一个被继承Dockerfile 这个时候就会运行  ONBUILD  的命令。触发指令

COPY                    #  类似ADD,将文件拷贝到镜像中

ENY                       #  构建的时候设置环境变量!

实战测试

Docker Hub中99%镜像都是从这个基础镜过来的 FROM scratch,然后配置需要的软件和配置来进行的构建

创建一个自己的centos

1、编写dockerfile的文件

[root@wq dockerfile]# vim mydockerfile-centos
[root@wq dockerfile]#
[root@wq dockerfile]# cat mydockerfile-centos

FROM centos:7
MAINTAINER wq<123456@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim net-tools

EXPOSE 80

CMD echo $MYPATH
CMD echo "----end----"
CMD /bin/bash



2、通过这个文件构建镜像

#命令docker build -f dockerfile文件路径 -t 镜像名:[tag]
#官方命令是Dockerfile,使用这个命名,build的时候就会自动寻找这个文件,就不需要 -f 了

#别忘了最后的点,表示当前目录

[root@wq dockerfile]# docker build -f mydockerfile-centos -t mycentos:0.1 .



3、测试运行

[root@wq dockerfile]# docker images |grep centos
mycentos              0.1       6627b0adacef   54 seconds ago   501MB

[root@wq dockerfile]# docker run -it mycentos:0.1
[root@775d3babc008 local]# pwd        #设置的工作目录,因此进入容器直接到了这个目录
/usr/local

对比:之前的原生的centos

增加之后的镜像

列出本地镜像变更历史

这样平时拿到一个镜像,就知道它是怎么做的了


CMD 和 ENTRYPOINT 区别

CMD                  #  指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代

ENTRYPOINT      #   指定这个容器启动的时候要运行的命令,可以追加命令

测试CMD

#编写dockerfile文件
[root@wq dockerfile]# cat dockerfile-cmd-test
FROM centos:7
CMD ["ls","-a"]

#构建镜像
[root@wq dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
[+] Building 15.3s (5/5) FINISHED                                                                    docker:default
 => [internal] load build definition from dockerfile-cmd-test                                                  0.0s
 => => transferring dockerfile: 76B                                                                            0.0s
 => [internal] load .dockerignore                                                                              0.0s
 => => transferring context: 2B                                                                                0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                   15.2s
 => CACHED [1/1] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd6184  0.0s
 => exporting to image                                                                                         0.0s
 => => exporting layers                                                                                        0.0s
 => => writing image sha256:c757e3a723ae82c9a6b3b7581f54ee6d140d3cd1f29acb9a4bcfe32ed77f8684                   0.0s
 => => naming to docker.io/library/cmdtest                                                                     0.0s

[root@wq dockerfile]# docker images |grep cmdtest
cmdtest               latest    c757e3a723ae   2 years ago      204MB

#run运行  发现ls -a命令生效
[root@wq dockerfile]# docker run c757e3a723ae
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

#想追加一个命令 -l     ls -al
[root@wq dockerfile]# docker run c757e3a723ae -l
docker: Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: exec: "-l": executable file not found in $PATH: unknown.

#cmd的情况下 -l 替换了 CMD ["ls","-a"] 命令,-l 不是命令所以报错!

测试ENTRYPOINT

[root@wq dockerfile]# cat dockerfile-cmd-entrypoint
FROM centos:7
ENTRYPOINT ["ls","-a"]

[root@wq dockerfile]# docker build -f dockerfile-cmd-entrypoint -t entrypoint-test .
[+] Building 15.3s (5/5) FINISHED                                                                    docker:default
 => [internal] load build definition from dockerfile-cmd-entrypoint                                            0.0s
 => => transferring dockerfile: 89B                                                                            0.0s
 => [internal] load .dockerignore                                                                              0.0s
 => => transferring context: 2B                                                                                0.0s
 => [internal] load metadata for docker.io/library/centos:7                                                   15.2s
 => CACHED [1/1] FROM docker.io/library/centos:7@sha256:9d4bcbbb213dfd745b58be38b13b996ebb5ac315fe75711bd6184  0.0s
 => exporting to image                                                                                         0.0s
 => => exporting layers                                                                                        0.0s
 => => writing image sha256:5184c7d459a0111136914d90d94e7121f7fce3c2746b17b74fc2f1e808a37da8                   0.0s
 => => naming to docker.io/library/entrypoint-test                                                             0.0s

[root@wq dockerfile]# docker images |grep entrypoint-test
entrypoint-test       latest    5184c7d459a0   2 years ago      204MB

[root@wq dockerfile]# docker run 5184c7d459a0
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@wq dockerfile]# docker run 5184c7d459a0 -l
total 64
drwxr-xr-x   1 root root  4096 Mar  3 12:06 .
drwxr-xr-x   1 root root  4096 Mar  3 12:06 ..
-rwxr-xr-x   1 root root     0 Mar  3 12:06 .dockerenv
-rw-r--r--   1 root root 12114 Nov 13  2020 anaconda-post.log
lrwxrwxrwx   1 root root     7 Nov 13  2020 bin -> usr/bin
drwxr-xr-x   5 root root   340 Mar  3 12:06 dev
drwxr-xr-x   1 root root  4096 Mar  3 12:06 etc
drwxr-xr-x   2 root root  4096 Apr 11  2018 home
lrwxrwxrwx   1 root root     7 Nov 13  2020 lib -> usr/lib
lrwxrwxrwx   1 root root     9 Nov 13  2020 lib64 -> usr/lib64
drwxr-xr-x   2 root root  4096 Apr 11  2018 media
drwxr-xr-x   2 root root  4096 Apr 11  2018 mnt
drwxr-xr-x   2 root root  4096 Apr 11  2018 opt
dr-xr-xr-x 155 root root     0 Mar  3 12:06 proc
dr-xr-x---   2 root root  4096 Nov 13  2020 root
drwxr-xr-x  11 root root  4096 Nov 13  2020 run
lrwxrwxrwx   1 root root     8 Nov 13  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root  4096 Apr 11  2018 srv
dr-xr-xr-x  13 root root     0 Feb 27 06:47 sys
drwxrwxrwt   7 root root  4096 Nov 13  2020 tmp
drwxr-xr-x  13 root root  4096 Nov 13  2020 usr
drwxr-xr-x  18 root root  4096 Nov 13  2020 var
posted @   SKY慕雪  阅读(0)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
点击右上角即可分享
微信分享提示