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

浏览器访问

dockerfile文件mysql Dockerfile文件构建镜像的命令_dockerfile文件mysql