1、Dockerfile的编写结构
基本构建如下:
基础镜像信息
镜像操作指令
容器启动时执行指令
2、FROM
作用:指定基础镜像,用于继承其他镜像使用的
[root@Docker1 ~]# vim Dockerfile #文件名,必须是Dockerfile
FROM scratch #不指定任何镜像为基础 scratch(注意需要从0开始进行编辑)
FROM centos #指定基础镜像为 centos (在以有的镜像的基础上进行编辑)
#同时意味着接下来所写的指令将作为镜像的第一层开始
————————————————————————————————————————————
语法格式: 在三种写法中<tag>和<digest> 是可选项,如果没有选择,那么默认值为latest
FROM <image>
FROM <image>:<tag>
FROM <image>:<digest>
3、RUN
作用: 功能为运行指定的命令
语法格式:
RUN <command> #第一种,直接跟shell命令
在linux操作系统上默认 /bin/sh -c
在windows操作系统上默认 cmd /S /C
RUN ["executable", "param1", "param2"] #第二种,类似于函数调用,可将executable理解成为可执行文件,后面就是两个参数
案例:
RUN source $HOME/.bashrc; echo $HOME
RUN ["/bin/bash", "-c", "echo hello"]
注意:多行命令不要写多个RUN,原因是Dockerfile中每一个指令都会建立一层多少个RUN就构建了多少层镜像,会造成镜像的臃肿、多层,不仅仅增加了构件部署的时间,还容易出错,RUN书写时的换行符是\
1、案例FROM与RUN
[root@Docker1 ~]# docker load -i centos7.4.tar.gz #导入镜像
606d67d8e1b8: Loading layer 204.7MB/204.7MB
Loaded image: centos:7.4
[root@Docker1 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos 7.4 3253d84c6425 2 years ago 197MB
[root@Docker1 ~]# vim Dockerfile
FROM centos:7.4 #第一行必须是 FROM 指令
MAINTAINER ALEX-DUAN 123456@qq.com #指定作者是谁
LABEL naem="centos base image" \ #给镜像指定标签
build-date="2022-02-28"
RUN yum -y install net-tools #安装一个软件
保存
[root@Docker1 ~]# docker build -t c7:v1 .
Sending build context to Docker daemon 204.8MB
Step 1/4 : FROM centos:7.4
---> 3253d84c6425
Step 2/4 : MAINTAINER ALEX-DUAN 123456@qq.com
---> Running in bcca70415028
Removing intermediate container bcca70415028
---> b457c8024fb3
Step 3/4 : LABEL naem="centos base image" build-date="2022-02-28"
---> Running in 774902692adf
Removing intermediate container 774902692adf
---> 668d541cc8a3
Step 4/4 : RUN yum -y install net-tools
---> Running in b0b74285cb01
..................
..........
.....
Complete!
Removing intermediate container b0b74285cb01
---> 04d750860e57
Successfully built 04d750860e57
Successfully tagged c7:v1
[root@Docker1 ~]# docker images #查看
REPOSITORY TAG IMAGE ID CREATED SIZE
c7 v1 04d750860e57 2 minutes ago 354MB
centos 7.4 3253d84c6425 2 years ago 197MB
#可以看到我们这是安装了一个ifcong命令就比基础镜像多150MB左右
#构建容器时要轻量级构建(也就是越小越好),在容器中没必要安装多余的软件去占用资源,造成资源浪费
4、CMD
作用:为容器启动时要运行的命令
三种语法格式:
CMD ["executable","param1","param2"]
CMD ["param1","param2"]
CMD command param1 param2
————————————————————————————————————————————————————————
第一种和第二种其实都是可执行文件加上参数的形式
举个栗子
CMD [ "sh", "-c", "echo $HOME"]
CMD [ "echo", "$HOME" ]
第三种,就是shell这种执行方式和写法
注意:这里边包括参数的一定要用双引号,就是",不能是单引号。千万不能写成单引号,原因是参数传递后,docker解析的是一个JSON array
2、案例CMD
[root@Docker1 ~]# vim Dockerfile
FROM centos:7.4
MAINTAINER ALEX-DUAN 123456@qq.com
LABEL naem="centos base image" \
build-date="2022-02-28"
RUN yum -y install httpd
CMD ["httpd","-D","FOREGROUND"]
保存
[root@Docker1 ~]# docker build -t httpd:v1 .
Sending build context to Docker daemon 204.8MB
Step 1/5 : FROM centos:7.4
---> 3253d84c6425
Step 2/5 : MAINTAINER ALEX-DUAN 123456@qq.com
--