Docker进阶篇之DockerFile,教你用DockerFile构建镜像

一、DockerFile介绍

Dockerfile 是用来构建 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指令

下图为DockerFile部分指令:

在这里插入图片描述

指令介绍:

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

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

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

ADD          # 步骤,如tomcat镜像,add用来添加tomcat压缩包

WORKDIR     # 镜像的工作目录

VOLUME       # 挂载的目录

EXPOSE       # 暴露端口配置

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

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

ONBUILD      # 当构建的一个镜像被另一个镜像继承时,会运行ONBUILD指令,触发指令

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

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

四、实战测试

Docker Hub 中99%的镜像都是从 FROM scratch 开始的,然后配置需要的软件和配置来进行构建。

创建一个自己的 centos

# 1.编写dockerfile文件
[root@wyc dockerfile]# vim mydockerfile-centos 
[root@wyc dockerfile]# cat mydockerfile-centos 
FROM centos:7
MAINTAINER wyc<837279588@qq.com>

ENV MYPATH /usr/local
WORKDIR $MYPATH

RUN yum -y install vim
RUN yum -y install net-tools

EXPOSE 80

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

# 2.通过这个文件构建镜像
# 命令 docker build -f dockerfile文件路径 -t 镜像名:[tag] .
[root@wyc dockerfile]# docker build -f mydockerfile-centos -t mycentos:1.1 .

在这里插入图片描述

# 3.测试运行
[root@wyc dockerfile]# docker run -it mycentos:1.1

创建过程可能会出现的问题:

在这里插入图片描述

如遇以上报错,将 FROM centos 改成 FROM centos:7 即可!

我们可以通过 docker history 镜像id 列出本地进行的变更历史,入下图:

在这里插入图片描述

4.1 对比原生CentOS

原生CentOS:

在这里插入图片描述

我们自己创建的CentOS:

在这里插入图片描述

五、CMD 和 ENTRYPOINT 的区别

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

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

5.1 测试CMD

1、编写dockerfile文件

[root@wyc dockerfile]# vim dockerfile-cmd-test
[root@wyc dockerfile]# cat dockerfile-cmd-test 
FROM centos:7
CMD ["ls","-a"]

2、构建镜像

[root@wyc dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest .
Sending build context to Docker daemon  3.072kB
Step 1/2 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/2 : CMD ["ls","-a"]
 ---> Running in fd77af3e32dc
Removing intermediate container fd77af3e32dc
 ---> bf5078099acc
Successfully built bf5078099acc
Successfully tagged cmdtest:latest

3、运行镜像,发现 ls -a 命令生效

[root@wyc dockerfile]# docker run bf5078099acc
.
..
.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@wyc dockerfile]# docker run bf5078099acc -l
docker: Error response from daemon: 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.
ERRO[0000] error waiting for container: context canceled 

cmd的情况:-l 替换了 CMD [“ls”,“-a”] 命令,,-l 不是命令所以报错。

使用 docker run bf5078099acc ls -al 则能正常运行,但非常繁琐。

5.2 测试ENTRYPOINT

1、编写dockerfile文件

[root@wyc dockerfile]# vim dockerfile-entrypoint-test
[root@wyc dockerfile]# cat dockerfile-entrypoint-test 
FROM centos:7
ENTRYPOINT ["ls","-a"]

2、构建镜像

[root@wyc dockerfile]# docker build -f dockerfile-entrypoint-test -t enrtypointtest .
Sending build context to Docker daemon  4.096kB
Step 1/2 : FROM centos:7
 ---> eeb6ee3f44bd
Step 2/2 : ENTRYPOINT ["ls","-a"]
 ---> Running in 15f8bfa40759
Removing intermediate container 15f8bfa40759
 ---> 419abf4b7e1e
Successfully built 419abf4b7e1e
Successfully tagged enrtypointtest:latest

3、运行镜像,发现 ls -a 命令生效

[root@wyc dockerfile]# docker run 419abf4b7e1e
.
..
.dockerenv
anaconda-post.log
bin
dev
etc
home
lib
lib64
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

此时追加 -l 命令,发现可以运行。

追加的命令,是直接拼接在 ENTRYPOINT 命令的后面。

[root@wyc dockerfile]# docker run 419abf4b7e1e -l
total 12
drwxr-xr-x.   1 root root     6 Nov 21 08:26 .
drwxr-xr-x.   1 root root     6 Nov 21 08:26 ..
-rwxr-xr-x.   1 root root     0 Nov 21 08:26 .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 Nov 21 08:26 dev
drwxr-xr-x.   1 root root    66 Nov 21 08:26 etc
drwxr-xr-x.   2 root root     6 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     6 Apr 11  2018 media
drwxr-xr-x.   2 root root     6 Apr 11  2018 mnt
drwxr-xr-x.   2 root root     6 Apr 11  2018 opt
dr-xr-xr-x. 227 root root     0 Nov 21 08:26 proc
dr-xr-x---.   2 root root   114 Nov 13  2020 root
drwxr-xr-x.  11 root root   148 Nov 13  2020 run
lrwxrwxrwx.   1 root root     8 Nov 13  2020 sbin -> usr/sbin
drwxr-xr-x.   2 root root     6 Apr 11  2018 srv
dr-xr-xr-x.  13 root root     0 Nov 21 05:38 sys
drwxrwxrwt.   7 root root   132 Nov 13  2020 tmp
drwxr-xr-x.  13 root root   155 Nov 13  2020 usr
drwxr-xr-x.  18 root root   238 Nov 13  2020 var

Dockerfile 中很多命令都是十分相似的,我们需要了解它们的区别,最好的学习方式就是对比它们然后测试效果。

参考源:【狂神说Java】Docker最新超详细版教程通俗易懂

猜你喜欢

转载自blog.csdn.net/wyc837279588/article/details/127969594
今日推荐