您现在的位置是:首页 >技术杂谈 >DockerFile网站首页技术杂谈

DockerFile

郝1. 2023-04-27 22:30:02
简介DockerFile

什么是 Dockerfile?

Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明。

DockerFile的一些规则

  • 每条保留字指令都必须为大写字母且后面要跟随至少一个参数
  • 指令顺序执行,遵循从上到下原则
  • #表示注释
  • 每条指令都会创建一个新的镜像层,并对镜像进行提交

docker执行DockerFile的大致流程

  • docker从基础镜像运行一个容器
  • 顺序执行一条指令对容器做出修改
  • 执行类似docker commit的操作提交一个新的镜像层
  • docker基于刚才提交的镜像运行一个新的容器
  • 执行DockerFile中下一条指令直到文件中的所有指令都执行完成

DockerFile指令

  • FROM:指定基础镜像
  • MAINTAINER:镜像维护者姓名及邮箱地址
  • RUN:容器构建时需要运行的命令
  • EXPOSE:当前容器对外暴露的端口号
  • WORKDIR:指定在创建容器后,终端默认登录进来的工作目录
  • ENV:用来在构建镜像过程中设置环境变量
  • ADD:将宿主机目录下的文件拷贝进镜像,ADD命令会自动处理URL和解压tar压缩包
  • COPY:拷贝文件、目录到镜像中。具体是将从构建上下文目录中<src原路径>的文件或目录复制到新一层镜像的<目标路径>位置 ,有两种写法:COPY src dest 或者 COPY ["src", "dest"]
  • VOLUME:容器数据卷,用于数据保存和持久化工作
  • CMD:指定一个容器启动时要运行的命令
    • 注意DockerFile中可以有多个CMD指令,但只有最后一个在启动时生效,CMD会被 docker run 之后的命令或参数覆盖
    • CMD指令的格式和RUN相似,也是两种格式:
      • shell格式:CMD <命令>
      • exec格式:CMD ["可执行文件", "参数1", "参数2" ...]
      • 参数列表格式:CMD ["参数1", "参数2", ...],在指定了ENTRYPOINT 指令后,用CMD指定具体的参数。
  • ENTRYPOINT:指定一个容器启动时要运行的命令,与CMD一样都是在指定容器启动程序及参数(下面通过实例2将他们的区别)。
  • ONBUILD:当构建一个被继承的DockerFile时运行命令, 父镜像在被子镜像继承后,父镜像的ONBUILD被触发。

DockerFile实例

实例1:DockerFile基于centos7.9.2009创建Nginx

[root@localhost ~]# mkdir nginx
[root@localhost ~]# cd nginx/
[root@localhost nginx]# vim DockerFile
FROM centos:7.9.2009

MAINTAINER lyh 17633164083@163.com

RUN yum -y update && 
    yum -y install epel-release && 
    yum -y install nginx

COPY nginx.conf /etc/nginx/nginx.conf

EXPOSE 80

CMD ["nginx", "-g", "daemon off;"]

[root@localhost nginx]# docker build -f DockerFile -t nginx:last .                                           
[root@localhost nginx]# docker images                                                                          
REPOSITORY   TAG        IMAGE ID       CREATED          SIZE
nginx        last       acf5952902af   10 seconds ago   616MB
php          8.1-fpm    74e8931119ae   11 days ago      450MB
httpd        2.4.57     dc1a95e13784   2 weeks ago      145MB
mysql        8.0.32     412b8cc72e4a   2 weeks ago      531MB
nginx        1.23.3     ac232364af84   4 weeks ago      142MB
centos       7.9.2009   eeb6ee3f44bd   19 months ago    204MB
[root@localhost nginx]# docker run -itd -p 80:80 nginx:last 
992da27efb8dc2cebdd3fe767355b9944a994a9eb4a6a45114d1238520c59807
[root@localhost nginx]# docker ps
CONTAINER ID   IMAGE        COMMAND                   CREATED         STATUS        PORTS                               NAMES
992da27efb8d   nginx:last   "nginx -g 'daemon of…"   2 seconds ago   Up 1 second   0.0.0.0:80->80/tcp, :::80->80/tcp   reverent_antonelli

 

风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。