Dockerfile

本文深入解析Dockerfile的构建原理与指令用法,包括基础语法、常见指令及其实战应用,如自定义CentOS镜像和构建Tomcat镜像。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

构建步骤:

  1. 编写一个dockerfile文件
  2. docker build 构建成为一个镜像
  3. docker run运行镜像
  4. docker push 发布镜像(DockerHub、阿里云镜像仓库 私有/共有)

查看官方是怎么做的:

在这里插入图片描述

在这里插入图片描述

可以看到官方镜像都是基础包,很多功能没有,我们通常会自己搭建自己的镜像

1、dockerfile基础知识

  1. 每个指令都必须是大写字母

  2. 按照从上到下顺序执行

  3. *#*表示注释

  4. 每一个指令都会创建体检一个新的镜像层,并提交

在这里插入图片描述

2、dockerfile指令

FROM          # 基础镜像 比如centos
MAINTAINER    # 镜像是谁写的 姓名+邮箱
RUN           # 镜像构建时需要运行的命令
ADD           # 添加,比如添加一个tomcat压缩包
WORKDIR       # 镜像的工作目录
VOLUME        # 挂载的目录
EXPOSE        # 指定暴露端口,跟-p一个道理
RUN           # 最终要运行的

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

ONBUILD       # 当构建一个被继承Dockerfile 这个时候运行ONBUILD指定,触发指令
COPY          # 将文件拷贝到镜像中
ENV           # 构建的时候设置环境变量

在这里插入图片描述

3、构建自己的centos

官方的dockerfile

在这里插入图片描述

编写dockerfile

# 
[root@localhost dockerfile]# cat mydockerfile-centos 
FROM centos
MAINTAINER liang<xx@163.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

[root@localhost dockerfile]# 

构建镜像

docker build -f mydockerfile-centos -t mycentos:1.0 .

在这里插入图片描述

测试运行

[root@localhost dockerfile]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.0                 e608cc40dc5e        4 minutes ago       295MB
liang/centos        1.0                 b48afcb6e4d5        3 days ago          215MB
tomcat02            1.0                 a5fc1e2c406a        4 days ago          652MB
mysql               5.7                 d589ea3123e0        7 days ago          448MB
redis               latest              41de2cc0b30e        10 days ago         104MB
tomcat              latest              d5eef28cf41d        10 days ago         647MB
nginx               latest              4bb46517cac3        4 weeks ago         133MB
centos              latest              0d120b6ccaa8        4 weeks ago         215MB
[root@localhost dockerfile]# docker run -it mycentos:1.0

[root@0f1eeda36db7 local]# pwd
/usr/local   #工作目录

[root@0f1eeda36db7 local]# ifconfig
eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 172.17.0.8  netmask 255.255.0.0  broadcast 172.17.255.255
        ether 02:42:ac:11:00:08  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@0f1eeda36db7 local]#

查看镜像构建的历史记录

[root@localhost dockerfile]# docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
mycentos            1.0                 e608cc40dc5e        9 minutes ago       295MB
liang/centos        1.0                 b48afcb6e4d5        3 days ago          215MB
tomcat02            1.0                 a5fc1e2c406a        4 days ago          652MB
mysql               5.7                 d589ea3123e0        7 days ago          448MB
redis               latest              41de2cc0b30e        10 days ago         104MB
tomcat              latest              d5eef28cf41d        10 days ago         647MB
nginx               latest              4bb46517cac3        4 weeks ago         133MB
centos              latest              0d120b6ccaa8        4 weeks ago         215MB
[root@localhost dockerfile]# docker image history e608cc40dc5e
IMAGE               CREATED             CREATED BY                                      SIZE                COMMENT
e608cc40dc5e        9 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "/bin…   0B                  
a87d0e9aacba        9 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
56c3a14fb55a        9 minutes ago       /bin/sh -c #(nop)  CMD ["/bin/sh" "-c" "echo…   0B                  
11d311a0cc27        9 minutes ago       /bin/sh -c #(nop)  EXPOSE 80                    0B                  
ad4cd221134f        9 minutes ago       /bin/sh -c yum -y install net-tools             22.8MB              
ec6f401f40f9        9 minutes ago       /bin/sh -c yum -y install vim                   57.2MB              
c19fca11ba61        9 minutes ago       /bin/sh -c #(nop) WORKDIR /usr/local            0B                  
a8df36d8b1e3        9 minutes ago       /bin/sh -c #(nop)  ENV MYPATH=/usr/local        0B                  
a628f4b86f12        9 minutes ago       /bin/sh -c #(nop)  MAINTAINER liang<xx@163.c…   0B                  
0d120b6ccaa8        4 weeks ago         /bin/sh -c #(nop)  CMD ["/bin/bash"]            0B                  
<missing>           4 weeks ago         /bin/sh -c #(nop)  LABEL org.label-schema.sc…   0B                  
<missing>           4 weeks ago         /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d…   215MB               
[root@localhost dockerfile]# 

CMD与ENTRYPOINT 的区别

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

测试CMD

# 编写dockerfile
[root@localhost dockerfile]# vim dockerfile-cmd-test
FROM centos
CMD ["ls","-a"]

# 构建
[root@localhost dockerfile]# docker build -f dockerfile-cmd-test -t cmdtest:1.0 .

# 执行
[root@localhost dockerfile]# docker run 52ab6ffa0c59
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var
[root@localhost dockerfile]# 
# 想追加一个命令 -l ls -al
[root@localhost dockerfile]# docker run 52ab6ffa0c59 -l
docker: Error response from daemon: OCI runtime create failed: container_linux.go:349: starting container process caused "exec: \"-l\": executable file not found in $PATH": unknown.
ERRO[0000] error waiting for container: context canceled 

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

测试ENTRYPOINT

# 编写dockerfile
[root@localhost dockerfile]# vim dockerfle-entrypoint-test
FROM centos
ENTRYPOINT ["ls", "-a"]

# 构建
docker build -f dockerfle-entrypoint-test -t entrypoint-test .

# 执行
[root@localhost dockerfile]# docker run 51a3c8ca8862
.
..
.dockerenv
bin
dev
etc
home
lib
lib64
lost+found
media
mnt
opt
proc
root
run
sbin
srv
sys
tmp
usr
var

# 添加命令  实际变成了 ls -al
[root@localhost dockerfile]# docker run 51a3c8ca8862 -l
total 0
drwxr-xr-x.   1 root root   6 Sep 12 09:37 .
drwxr-xr-x.   1 root root   6 Sep 12 09:37 ..
-rwxr-xr-x.   1 root root   0 Sep 12 09:37 .dockerenv
lrwxrwxrwx.   1 root root   7 May 11  2019 bin -> usr/bin
drwxr-xr-x.   5 root root 340 Sep 12 09:37 dev
drwxr-xr-x.   1 root root  66 Sep 12 09:37 etc
drwxr-xr-x.   2 root root   6 May 11  2019 home
lrwxrwxrwx.   1 root root   7 May 11  2019 lib -> usr/lib
lrwxrwxrwx.   1 root root   9 May 11  2019 lib64 -> usr/lib64
drwx------.   2 root root   6 Aug  9 21:40 lost+found
drwxr-xr-x.   2 root root   6 May 11  2019 media
drwxr-xr-x.   2 root root   6 May 11  2019 mnt
drwxr-xr-x.   2 root root   6 May 11  2019 opt
dr-xr-xr-x. 240 root root   0 Sep 12 09:37 proc
dr-xr-x---.   2 root root 162 Aug  9 21:40 root
drwxr-xr-x.  11 root root 163 Aug  9 21:40 run
lrwxrwxrwx.   1 root root   8 May 11  2019 sbin -> usr/sbin
drwxr-xr-x.   2 root root   6 May 11  2019 srv
dr-xr-xr-x.  13 root root   0 Sep  5 13:37 sys
drwxrwxrwt.   7 root root 145 Aug  9 21:40 tmp
drwxr-xr-x.  12 root root 144 Aug  9 21:40 usr
drwxr-xr-x.  20 root root 262 Aug  9 21:40 var
[root@localhost dockerfile]#

4、实战:Tomcat镜像

  1. 准备tomcat压缩包, jdk压缩包
  2. 编写Dockerfile文件

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值