dockerfile编写和构建运行

简介: dockerfile编写和构建运行

DockerFile的规则

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

docker执行DockerFile的大致流程

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

DockerFile构建镜像的步骤

  • 编写DockerFile文件
  • docker build
  • docker run

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被触发。

指令 含义
FROM 镜像 指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令
MAINTAINER 名字 说明新镜像的维护人信息
RUN命令 在所基于的镜像上执行命令,并提交到新的镜像中
CMD[“要运行的程序”,“参数1”,“参数2”] 指令启动容器时要运行的命令或脚本,Dockerfile只能有一条CMD指令,如果要指定多条则只能最后一条执行
EXPOSE 端口号 指定新镜像加载到Docker时要开启端口
ENV 环境变量 变量值 设置一个环境变量的值,会被后面的RUN使用
ADD 源文件/目录 目标文件/目录 将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY 源文件/目录 目标文件/目录 将本地主机上得文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME[“目录”] 在容器中创建一个挂载点
USER 用户名/UID 指定运行容器时的用户
WORKDIR路径 为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD命令 指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK 健康检查

FROM centos
MAINTAINER lihongcheng<xxx@163.com>
ENV ETCPATH /etc
WORKDIR $ETCPATH
RUN yum -y install vim
RUN yum -y install net-tools
EXPOSE 5000
CMD echo "-----successful------"
CMD /bin/bash
# build构建镜像
#/path/DataFile 是DataFile文件的路径
docker build -f /path/DataFile -t 镜像名 [:TAG] .
#run 命令来启动运行这个镜像生成的实例容器
docker run -it 镜像名[:TAG]
#查看 docker 镜像的运行历史(仅用于查看是如何运行的)
docker history 镜像名[:TAG]
FROM centos
MAINTAINER lihongcheng<xxx@163.com>
RUN yum -y install curl
CMD ["curl", "-s", "http://ip.cn"]

在运行容器实例后会由CMD命令输出ip地址的信息。

但当使用命令:docker run -it 镜像名[:TAG] -i 来输出详细的报文时却显示错误,这是由于CMD关键字命令会被 docker run 之后的 -i 参数覆盖而并非在命令中添加一个 -i 选项。

FROM centos
MAINTAINER lihongcheng<xxx@163.com>
RUN yum -y install curl
ENTRYPOINT ["curl", "-s", "http://ip.cn"]

将 CMD 关键字换成 ENTRYPOINT 后

使用命令:docker run -it 镜像名[:TAG] -i就可以输出详细信息,因为ENTRYPOINT关键字命令是可以将 docker run 之后 -i 选项加载到它的参数中执行,这就是 CMD 与 ENTRYPOINT 的区别。


# tomcat 安装
# cat tomcat.yaml
FROM centos:8
MAINTAINER xiong
RUN yum install wget
ADD jdk-8u281-linux-x64.rpm /usr/local/
ADD apache-tomcat-8.5.50.tar.gz /usr/local/
RUN cd /usr/local && rpm -ivh jdk-8u281-linux-x64.rpm
RUN mv /usr/local/apache-tomcat-8.5.50.tar.gz /usr/local/tomcat8
EXPOSE 8080
ENTRYPOINT /usr/local/tomcat8/bin/startup.sh && tail -F /usr/local/tomcat8/logs/catalina.out
#构建tomcat
docker build -t="tomcat8:v1" tomcat.yaml


相关文章
|
2月前
|
Ubuntu Shell 应用服务中间件
|
Kubernetes 安全 Java
2021年 最新 多阶段构建dockerfile实现java源码编译打jar包并做成镜像
多阶段构建指在Dockerfile中使用多个FROM语句,每个FROM指令都可以使用不同的基础镜像,并且是一个独立的子构建阶段。使用多阶段构建打包Java应用具有构建安全、构建速度快、镜像文件体积小等优点.
1183 0
2021年 最新 多阶段构建dockerfile实现java源码编译打jar包并做成镜像
|
6天前
|
安全 Java Maven
编写 Dockerfile 最佳实践
编写 Dockerfile 最佳实践
|
7月前
|
JavaScript 前端开发 Go
Docker 入门:如何打包、部署并运行你的应用
Docker 入门:如何打包、部署并运行你的应用
687 0
|
3月前
|
Ubuntu Java 关系型数据库
【Dockerfile】将自己的项目构建成镜像部署运行
【Dockerfile】将自己的项目构建成镜像部署运行
37 0
|
移动开发 前端开发 Java
Docker——使用Dockerfile构建SpringBoot项目(打包 & 部署 & 运行)
Docker——使用Dockerfile构建SpringBoot项目(打包 & 部署 & 运行)
1795 0
Docker——使用Dockerfile构建SpringBoot项目(打包 & 部署 & 运行)
|
10月前
|
缓存 网络协议 Linux
Dockerfile构建镜像过程中的错误记录及解决方法
本文记录了在一次使用Dockefile构建镜像的途中遇到的问题,以及后续的解决方法。
4389 0
|
10月前
|
缓存 NoSQL Java
如何使用 SpringBoot 和 Docker 技术,实现一次构建到处运行的应用程序?
如何使用 SpringBoot 和 Docker 技术,实现一次构建到处运行的应用程序?
87 0
|
12月前
|
缓存 前端开发 Ubuntu
记一次dockerfile打包运行python程序
记一次dockerfile打包运行python程序
241 0
|
存储 关系型数据库 MySQL
Dockerfile命令及实践构建一个网站
dockerfile用于构建docker镜像的,部署一个用于运行你所需的容器环境。相当一个脚本,通过dockerfile自己的指令,来构建软件依赖、文件依赖、存储、 定制docker镜像的方式有两种: 手动修改容器内容,导出新的镜像 基于Dockerfile自行编写指令,基于指令流程创建镜像。
108 0