什么是dockerfile
Dockerfile 是一个文本文件,它包含了所有用于组合Docker镜像所需的指令和参数。这些指令和参数基于Docker镜像的层的概念,并定义了如何从一个基础镜像开始,通过添加、修改文件、安装软件包、配置环境变量和设置启动命令等操作,最终构建出一个新的Docker镜像
需要执行一条简单的docker build
命令,Docker就会根据Dockerfile中的指令自动完成镜像的构建
Dockerfile的指令
代码语言:javascript复制1、构建指令:构建镜像,指定操作不会运行在image的容器中执行
2、设置指令:设置镜像的属性,指定操作会在image的容器中执行
Dockerfile的基本结构包括:
基础镜像(FROM) | 指定构建新镜像所使用的基础镜像,在Dockerfile中第一条指令必须是FROM指令 |
---|---|
设置工作目录(WORKDIR) | 指定后续指令的工作目录。 |
复制文件(COPY/ADD) | 将文件或目录复制到镜像中。ADD指令还可以自动解压压缩文件,但出于安全考虑,一般推荐使用COPY指令。 |
安装软件包(RUN) | 在镜像中运行命令,如安装软件包。RUN指令常用于安装依赖、编译程序等。 |
配置环境变量(ENV) | 设置环境变量,供镜像中运行的程序使用。 |
暴露端口(EXPOSE) | 声明镜像中运行的应用将使用容器的哪个端口。不过,这并不会让端口自动在宿主机上监听,而是需要在运行容器时通过-p或-P参数来指定 |
容器启动时要运行的命令(CMD) | Dockerfile中可以包含多个CMD指令,但只有最后一个生效。CMD指令可以被docker run命令行中的参数覆盖 |
配置容器启动时运行的可执行文件(ENTRYPOINT) | 与CMD不同,CMD的指令会被当作参数传递给ENTRYPOINT |
声明容器运行时监听的端口(EXPOSE) | 只是声明,并不会自动使端口对外提供服务 |
LABEL | 为镜像添加元数据 |
ENV | 设置环境变量 |
VOLUME | 创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等 |
USER | 指定运行容器时的用户名或UID |
HEALTHCHECK | 用于指定一个检查容器健康状态的命令 |
SHELL | 允许覆盖用于命令的shell形式 |
举例:
dockerfile 文件
具体操作步骤
代码语言:javascript复制1、编写DockerFile文件
2、Docker build命令构建镜像
3、docker run 依据镜像运行容器实例
介绍DockerFile、镜像、容器的关系
代码语言:javascript复制1、Dockerfile是构建Docker镜像的基础,Docker通过读取Dockerfile中的指令,执行相应的操作(如添加文件、安装软件包、配置环境变量等),最终生成一个镜像
2、Docker镜像是Docker容器的基础,docker build时会产生一个Docker镜像,当运行 Docker镜像时会真正开始提供服务
3、Docker容器,依据镜像运行(docker run)容器提供服务
实操,部署CVE项目
CVE-2023-26469
CVE-2023-26469:在 Jorani 1.0.0 中启用远程代码执行的严重漏洞
下载 Jorani 1.0.0
下载地址:https://github.com/bbalet/jorani/releases
解压,这里有docker-compose.yml文件,可以不用Docker build命令构建镜像,通过DockerCompose自动化部署。
docker部署环境
要求有php7以及mysql5.6的基础镜像环境
docker拉取mysql基础镜像
在dockerhub上找
代码语言:javascript复制dockerhub地址:https://hub.docker.com/
代码语言:javascript复制docker pull mysql:5.6.34
数据库版本为5.6.34,版本切换在docker-compose.yml文件中
代码语言:javascript复制1)第一种方法,直接vi docker-compose.yml
2)第二种方法,用xftp将sql文件导出在window桌面,改好后,在用xftp直接传上去,覆盖之前的
docker拉取php基础镜像环境
查看dockerfile文件
代码语言:javascript复制docker pull php:7.4-apache
上传源码
新建目录,将 Jorani源码通过xftp上传到新建的目录中
代码语言:javascript复制mkdir Jorani
解压压缩包
代码语言:javascript复制unzip jorani-1.0.0.zip
查看Docker-compose.yml文件
运行
在jorani目录中运行
代码语言:javascript复制docker-compose up
提示数据库报错
数据导入时,执行SQL失败。因为定义了函数存在语法错误,可能是数据库版本问题。现在找不到以前的5.0版本数据库了。所以花了时间解决语法问题。主要是字符串转INT这个函数,CAST('' AS INT)改成CAST('' AS SIGNED)
修改sql 文件
代码语言:javascript复制1)第一种方法,直接vim改sql文件
2)第二种方法,用xftp将sql文件导出在window桌面,改好后,在用xftp直接传上去,覆盖之前的
运行
代码语言:javascript复制docker-compose up 交互式启动
docker-compose up -d 后台运行方式启动
用docker-compose up交互式启动,日志没有问题,页面能正常访问
这里是80端口,所以页面直接ip访问
因为我们已经调试过了,没问题,要正式部署,部署之前需要将开启的容器要删掉。而down 可以删除销毁容器。
代码语言:javascript复制docker-compose down
docker ps -a 查看容器
部署
代码语言:javascript复制docker-compose up -d 后台运行方式启动
docker镜像迁移
docker save -o 就是将镜像保存为你指定的文件名格式的文件。如:docker save -o mysql5.zip mysql:5 将镜像保存为mysql5.zip
docker load -i 就是将导出的镜像,装载回去 如:docker load -i mysql5.zip
这整个过程,叫docker镜像迁移。从一台机器迁移到另外一台,同时保证可基础镜像一致性
如果需要将jorani进行迁移,需要将源码 、php环境、MySQL环境全部迁移