dockerfile镜像构建命令
文章目录
- dockerfile镜像构建命令
- 1:FROM
- 2:MAINTAINER
- 3:RUN
- 4:ADD
- 5:COPY
- 6:ENTRYPOINT
- 7:ENV
- 8:EXPOSE
- 9:WORKDIR
- 10:USER
- 11:LABEL
- 12:VOLUME
- 实例
1:FROM
FROM : Dockerfile中第一条指令必须是FROM指令,表示从哪个基础镜像开始构建镜像
FROM centos:7 //基于centos7基础镜像构建新的镜像
FROM scratch //表示不以任何镜像为基础
2:MAINTAINER
MAINTAINER : 镜像维护者个人信息,维护者的姓名和邮箱
MAINTAINER xuanning@gamil.com //维护者姓名和邮箱
3:RUN
RUN : 构建镜像时需要执行的命令,有两种命令执行方式
shell形式执行
格式:
RUN <command> //RUN后边直接跟shell命令,linux操作系统上默认shell为/bin/sh -c
exec形式执行
格式:
RUN ["executable", "param1", "param2"] //执行可执行文件,executable为可执行文件,param为选项或参数;exec形式可以指定使用其他终端
两种形式对比:
RUN echo "hzz"
RUN ["/bin/bash", "-c", "echo hello"]
dockerfile每一条命令为一层,多条命令最好用最少的RUN命令执行,镜像的层数高了造成镜像的臃肿,不仅仅增加了构件部署的时间,还容易出错
4:ADD
ADD :将本地文件添加到构建的镜像中,tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget
ADD <src>... <dest>
ADD ["<src>",... "<dest>"] //用于支持包含空格的路径
示例:
ADD test /tmp/ //添加"test"文件到镜像的"/tmp"目录
ADD hom* /mydir/ //添加所有以"hom"开头的文件到镜像的"/mydir"目录
5:COPY
CMD : 指定镜像启动为容器后默认执行的命令,每个 Dockerfile 只能有一条 CMD 命令;如果指定了多条命令,只有最后一条会被执行,如果用户启动容器时候指定了运行的命令,则会覆盖掉 CMD 指定的命令
格式:
CMD ["executable","param1","param2"] //执行可执行文件,此方式优先
CMD command param1 param2 //执行shell内部命令
CMD ["param1","param2"] //设置了ENTRYPOINT,则为ENTRYPOINT添加参数
示例:
CMD ["echo","This is a test"]
CMD echo "This is a test"
6:ENTRYPOINT
ENTRYPOINT : 类似于 CMD 指令,但其不会被创建容器时指定的命令覆盖,如果创建容器时指定了命令那么这些命令会被当作参数送给 ENTRYPOINT 指令指定的程序;CMD 和ENTRYPOINT 同在时 CMD 的内容会被当作参数传递给 ENTRYPOINT 指定的命令。
格式:
ENTRYPOINT ["executable", "param1", "param2"] //执行可执行文件, 此方式优先
ENTRYPOINT command param1 param2 //shell内部命令
7:ENV
ENV :设置环境变量。此环境变量为镜像启动为容器之后容器中的环境变量
格式:
ENV <key> <value> //<key>之后的所有内容均会被视为其<value>的组成部分,因此,一次只能设置一个变量
ENV <key>=<value> ... //可以设置多个变量,每个变量为一个"<key>=<value>"的键值对,如果<key>中包含空格,可以使用\来进行转义,也可以通过""来进行标示
示例:
ENV myName xuanning
ENV myName="xuanning" myAge="20"
ENV HTTPD_MPM="event"
8:EXPOSE
EXPOSE :指定镜像启动为容器后开放的端口
格式:
EXPOSE <port> [<port>...]
示例:
EXPOSE 80 443
EXPOSE 8080
EXPOSE 11211/tcp 11211/udp
注:EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。
9:WORKDIR
WORKDIR :工作目录,类似于cd命令
格式:
WORKDIR /path/to/workdir
示例:
WORKDIR /hzz //这时工作目录为/hzz
注:通过WORKDIR设置工作目录后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT、ADD、COPY等命令都会在该目录下执行。
10:USER
USER :指定运行容器时的用户名或 UID,后续的 RUN 也会使用指定用户。使用USER指定用户时,可以使用用户名、UID或GID,或是两者的组合。当服务不需要管理员权限时,可以通过该命令指定运行用户。并且可以在之前创建所需要的用户
格式:
USER user
USER user:group
USER uid
USER uid:gid
示例:
USER www
注:使用USER指定用户后,Dockerfile中其后的命令RUN、CMD、ENTRYPOINT都将使用该用户。
11:LABEL
LABEL指令用于让用户为镜像指定各种元数据(键值对的格式),格式如下。
LABEL multi.label1="value1"
12:VOLUME
VOLUME指令用于在镜像中创建一个挂载点目录。Volume有两种类型:绑定挂载卷和docker管理的卷。在Dockerfile中只支持Docker管理的卷,也就是说只能指定容器内的路径,不能指定宿主机的路径,格式如下。
格式:
VOLUME ["/path/to/dir"]
示例:
VOLUME ["/data"]
VOLUME ["/var/www","/var/log/apache2","/etc/apache2"]
实例
1、基于基础镜像centos:7
2、维护者信息
3、添加Centos-7仓库
4、添加epel-7仓库
5、安装nginx软件包
6、暴露指定端口80
7、构建镜像,镜像名称为nginx:v1
8、运行容器,容器名称为自己名字的全拼,映射端口88:80
9、进入容器,删除默认网页,写入新的默认网页
10、通过浏览器,能够正常访问nginx
[root@server1 ~]# mkdir vv
[root@server1 ~]# cd vv
[root@server1 vv]# ls
Centos-7.repo Dockerfile epel-7.repo
[root@server1 vv]# vim Dockerfile
[root@server1 vv]# cat Dockerfile
FROM centos:7
MAINTAINER xuanning@gamil.com
ADD Centos-7.repo /etc/yum.repos.d/
COPY epel-7.repo /etc/yum.repos.d/
RUN yum -y install nginx
EXPOSE 80
CMD ["/usr/sbin/nginx","-g","daemon off;"]
[root@server1 vv]# docker build -t nginx:v1 .
Sending build context to Docker daemon 6.656kB
Step 1/7 : FROM centos:7
---> eeb6ee3f44bd
Step 2/7 : MAINTAINER xuanning@gamil.com
---> Running in 9298fb7f02d8
Removing intermediate container 9298fb7f02d8
......................
Step 6/7 : EXPOSE 80
---> Running in 16b68cb5e24e
Removing intermediate container 16b68cb5e24e
---> ece6f09d85ea
Step 7/7 :CMD ["/usr/sbin/nginx","-g","daemon off;"]
---> Running in 95c18f5b967d
Removing intermediate container 95c18f5b967d
---> 1a93b23c0e25
Successfully built 1a93b23c0e25
Successfully tagged nginx:v1
[root@server1 vv]# docker run -dit --name cvcv -p 88:80 nginx:v1
add17290c971ab13adca90a1afa0e8d44e10d501fd35042d20d3103f2f53bb4b
[root@server1 vv]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
add17290c971 nginx:v1 "/usr/sbin/nginx -g …" 2 seconds ago Up 1 second 0.0.0.0:88->80/tcp, :::88->80/tcp cvcv
[root@server1 vv]# docker exec -it cvcv /bin/bash
[root@add17290c971 /]# cd /usr/share/nginx/
[root@add17290c971 nginx]# ls
html modules
[root@add17290c971 nginx]# cd html/
[root@add17290c971 html]# ls
404.html 50x.html en-US icons img index.html nginx-logo.png poweredby.png
[root@add17290c971 html]# rm -rf index.html
[root@add17290c971 html]# echo lihao > index.html
[root@add17290c971 html]# ls
404.html 50x.html en-US icons img index.html nginx-logo.png poweredby.png
[root@add17290c971 html]#exit
[root@server1 vv]# systemctl stop firewalld.service
浏览器访问