Code前端首页关于Code前端联系我们

组织 Docker 的使用:什么是 Dockerfile?常用指令VS构建镜像示例

terry 2年前 (2023-09-28) 阅读数 61 #未命名
作者:大港测试与开发实践
来源:知乎

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 ifconfig

mysql example

下图是官方镜像的MySQL Dockerfile,也使用了上面介绍的命令并将它们有机地结合在一起。例如:在开头添加一个文件>>然后启动bash>>创建用户和用户组>>瞬态环境设置>>设置数据目录>>最后启动mysqld,实现MySQL构建:docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例

3。从 Dockerfile 构建镜像

创建 Dockerfile 后,您可以使用 docker build 命令基于 Dockerfile 创建镜像。常用的 Docker 构建指令包括两个参数:

  • -t 指定镜像的名称
  • -f 显示指定构建镜像的 Dockerfile。如果当前工作目录与Dockerfile在同一目录,则使用 . ,否则需要使用 -f 参数指定 Dockerfile 路径(注意:Dockerfile 名称不固定,可以更改)

基于上面第一个 Dockerfile 提交构建:

# 运行当前目录下的Dockerfile文件,生成一个名为mycentos7的镜像
docker build -t mycentos7 .

如图如下图,运行 build docker 构建镜像命令后,按照顺序执行上面定制的 Dockerfile 中的步骤: docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例

如下图所示,镜像已经成功构建: mycentos7:latestdocker用法整理:Dockerfile是什么?常用指令VS构建镜像示例docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例

看一下镜像列表中,有一个新建的mycentos7镜像: docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例

基于mycentos7镜像创建一个容器:

docker run -it --name mycentos7 mycentos7:latest sh

此时,运行容器并进入镜像shell环境。你会发现Dockerfile中定义的命令已经生效:

  • 指定的docker_install.sh文件已被复制到mycentos镜像的/home/docker_home。文件夹;
  • net-tools已成功预装,“ifconfig”命令可以正常运行;
docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例

4。 Dockerfile 镜像构建原理

https://docs.docker.com/develop/develop-images/dockerfile_best-practices/

每增加一个命令行,镜像就会多一层docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例docker用法整理:Dockerfile是什么?常用指令VS构建镜像示例

版权声明

本文仅代表作者观点,不代表Code前端网立场。
本文系作者Code前端网发表,如需转载,请注明页面地址。

热门