组织 Docker 的使用:什么是 Dockerfile?常用指令VS构建镜像示例
来源:知乎
1. 什么是Dockerfile?
1。简介
Dockerfile 是一个 文本文件 ,用于创建映像。文本内容包含构建图像所需的说明和指南。 ? Er 2. Dockerfile 常用说明
1.一般指令解读
| 指令 | |
| 开发 | |
| 指定基础镜像 | |
| 管理员 | 信息增加说明,如邮箱维护者名称 稍等,无需 |
| RUN | |
| RUN‽RUN‽RUN‽ 命令(用于创建镜像时运行相关命令) | |
| USER | 基于哪个用户运行容器 |
| ADD | 传输本地文件添加到镜像(支持复制正则表达式,支持复制多种文件类型,比如下载后复制网络文件,ADD http://xxxx/test.tar.gz /test/) |
| COPY | 复制本地文件到镜像(仅支持核心文件和文件夹,建议COPY),最好将要复制的文件放在与Dockerfile同一目录下 |
| WORKDIR切换命令目录,类似于Linux命令 cd WORKDIR /home/jenkins_home/conf 相当于以下命令: WORKDIR /homeWORKDIR jenkins_home/conf | |
| EXPOSE | 指定容器监听的端口。这只是为了说明,实际上不会有效。还是需要使用 docker run - p 参数进行端口映射 |
| CMD | 类似于RUN指令。不同的是CMD是在容器启动时执行相关命令。您可以使用 CMD echo "hello world" 或 ['ECHO','hello world']。我们建议使用最后一个列表,格式为 |
| ENTRY POINT | 输入 ENTRY POINT 参数后,使用 docker run xxxx 启动容器时,不会覆盖 docker start 后的以下参数 |
| ENV | 指定容器启动时的环境变量,格式为KEY=VALUE或KEY VALUE,如ENV VERSION=2.0,后面的说明中可以使用$VERSION替换2.0 |
| 数据栈声明VOLUME | ,用于匿名汇编。假设命令为 VOLUME /usr/local,则容器启动时会在服务器上自动生成默认 docker 路径 /var/lib/docker/volumes/ 下的文件夹。 ,用于挂载/usr/local,常在执行docker run命令时忘记指定-v参数自动保存一些重要数据时使用 |
2.'CMD', 'ENTERPOINT', 'docker run xxx'三者之间的区别和联系
- 如果输入CMD ['ECHO','hello world']同时使用docker run -p 8080:80 xxx,则docker运行后参数会覆盖后面的CMD指令开始了。 ;
- 如果指定了 ENTRYPOINT ['nginx'],同时使用 docker run -p 8080:80 xxx,则 docker run 后的参数会作为参数传入 ENTRYPOINT,并与 ENTRYPOINT 后的参数合并;
- 如果同时输入CMD['ECHO','hello world']和ENTRYPOINT['nginx'],则CMD后面的参数会作为参数传入ENTRYPOINT,并与ENTRYPOINT后面的参数拼接起来;
总结:CMD相对更灵活。用户可以通过运行docker来更改docker文件中的CMD指令,而ENTRYPOINT则更容易。使用 docker launch 命令行参数启动容器时,无法更改 docker 文件中的 ENTRYPOINT 语句;
3.示例Dockerfile
自定义Dockerfile
接下来,我们将创建一个简单的Dockerfile来创建基于centos7镜像的镜像。其中,执行输出信息、创建文件夹、提前向镜像目录添加文件、切换目录等一些简单命令,最后安装工具并执行命令显示网卡:
# 基于centos7镜像
FROM centos:7
# 维护者信息
MAINTAINER "chenjigang"
# 基于root用户运行容器
USER root
# 运行命令
RUN echo "test dockerfile..."
RUN mkdir -p /home/docker_home
# 本地复制文件到镜像内
COPY docker_install.sh /home/docker_home/docker_install.sh
# 切换目录
WORKDIR /home/docker_home
RUN ls -al
RUN yum install -y net-tools
RUN ifconfigmysql example
下图是官方镜像的MySQL Dockerfile,也使用了上面介绍的命令并将它们有机地结合在一起。例如:在开头添加一个文件>>然后启动bash>>创建用户和用户组>>瞬态环境设置>>设置数据目录>>最后启动mysqld,实现MySQL构建:![]()
![]()
3。从 Dockerfile 构建镜像
创建 Dockerfile 后,您可以使用 docker build 命令基于 Dockerfile 创建镜像。常用的 Docker 构建指令包括两个参数:
- -t 指定镜像的名称
- -f 显示指定构建镜像的 Dockerfile。如果当前工作目录与Dockerfile在同一目录,则使用 . ,否则需要使用 -f 参数指定 Dockerfile 路径(注意:Dockerfile 名称不固定,可以更改)
基于上面第一个 Dockerfile 提交构建:
# 运行当前目录下的Dockerfile文件,生成一个名为mycentos7的镜像
docker build -t mycentos7 . 如图如下图,运行 build docker 构建镜像命令后,按照顺序执行上面定制的 Dockerfile 中的步骤: ![]()
![]()
如下图所示,镜像已经成功构建: mycentos7:latest![]()
![]()
看一下镜像列表中,有一个新建的mycentos7镜像: ![]()
![]()
基于mycentos7镜像创建一个容器:
docker run -it --name mycentos7 mycentos7:latest sh此时,运行容器并进入镜像shell环境。你会发现Dockerfile中定义的命令已经生效:
- 指定的docker_install.sh文件已被复制到mycentos镜像的/home/docker_home。文件夹;
- net-tools已成功预装,“ifconfig”命令可以正常运行;
4。 Dockerfile 镜像构建原理
https://docs.docker.com/develop/develop-images/dockerfile_best-practices/
每增加一个命令行,镜像就会多一层![]()
![]()
版权声明
本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。
code前端网