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
  • 26
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
DockerfileDocker Compose是Docker生态系统中两个非常重要的工具,它们可以帮助我们更方便地构建、管理和部署Docker容器Dockerfile是一个文本文件,其中包含了一系列的指令,用于描述如何构建一个Docker镜像。通过Dockerfile,我们可以定义容器的基础镜像、安装软件、配置环境变量、暴露端口等操作。使用Dockerfile可以实现容器的自动化构建,避免手动操作的繁琐和出错。 Docker Compose是一个用于定义和运行多个Docker容器的工具。通过一个YAML文件,我们可以定义多个服务(service),每个服务可以包含一个或多个容器。在Docker Compose中,我们可以定义容器的镜像、端口映射、环境变量、数据卷等信息。使用Docker Compose可以方便地管理多个容器之间的依赖关系和通信。 下面是一个简单的Dockerfile示例: ``` FROM ubuntu:latest RUN apt-get update && apt-get install -y nginx COPY index.html /var/www/html/ EXPOSE 80 CMD ["nginx", "-g", "daemon off;"] ``` 这个Dockerfile定义了一个基于Ubuntu最新版的Nginx镜像。首先通过apt-get安装了Nginx,然后将本地的index.html文件复制到容器中的/var/www/html/目录下。最后暴露了容器的80端口,并启动了Nginx服务。 下面是一个简单的Docker Compose示例: ``` version: '3' services: web: build: . ports: - "80:80" db: image: mysql:5.7 environment: MYSQL_ROOT_PASSWORD: example ``` 这个Docker Compose文件定义了两个服务:web和db。web服务使用当前目录下的Dockerfile进行构建,并将容器的80端口映射到主机的80端口。db服务使用MySQL 5.7镜像,并设置了MYSQL_ROOT_PASSWORD环境变量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SKY慕雪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值