您现在的位置是:首页 >技术杂谈 >DockerFile网站首页技术杂谈
DockerFile
简介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
风语者!平时喜欢研究各种技术,目前在从事后端开发工作,热爱生活、热爱工作。