1. Dockerfile 简介

Dockerfile是包含一些Linux命令的、名为Dockerfile的文件。Docker通过读取该文件中的命令来组建镜像。Dockerfile一般分为“基础镜像信息、维护者信息、镜像操作指令和容器启动时执行指令”等四部分(注释符号为“#”)。

# 运行Dockerfile ("."代表当前目录)
docker build -t image_name:tag_name .# 通过-f 指定Dockerfile文件位置
docker build -f /path/Dockerfile .

Docker的images是由一层层的layer组成的,然后通过联合挂载的方式挂载成一个文件系统。如果更改了某一层的信息,那么从这层之后所有的层都需要重新build。

2. 通过Dockerfile 制作镜像

分别使用不同基础镜像(centos、ubuntu)构建指定镜像。

2.1 构建一个包含nginx软件的镜像(centos作为基础镜像)

FROM registry.cn-hangzhou.aliyuncs.com/xwjs/centos7
MAINTAINER kkRUN yum -y update &&\yum install -y pcre pcre-devel zlib openssl openssl-devel &&\yum clean allARG NGINX_VERSION=1.15.0# Nginx
WORKDIR /tmpRUN wget http://nginx.org/download/nginx-${NGINX_VERSION}.tar.gz &&\tar zxf nginx-${NGINX_VERSION}.tar.gz &&\cd /tmp/nginx-${NGINX_VERSION}.tar.gz &&\./configure \--prefix=/usr/local/nginx \--with-http_ssl_module \--with-http_sub_module \--with-http_dav_module \--with-http_flv_module \--with-http_gzip_static_module \--with-http_stub_status_module \--with-debug && \make && \make install# 设置环境变量
ENV PATH /usr/local/nginx/sbin:$PATH# 开放端口
EXPOSE 80 443# 执行命令
ENTRYPOINT ["nginx", "-g", "daemon off;"]

2.2 构建一个包含django软件的镜像ubuntu作为基础镜像

Dockerfile 文件

1: 构建镜像时位置为打包代码的根目录;
2: 镜像末尾需附上服务启动命令CMD**。

FROM ubuntu:18.04
ENV DEBIAN_FRONTEND noninteractive
RUN apt-get update && \apt-get install -y --no-install-recommends apt-utils && \apt-get install -y --no-install-recommends python3.8 python3-pip && \ln -sv /usr/bin/python3.8 /usr/bin/python && \ln -sv /usr/bin/pip3 /usr/bin/pipRUN apt-get install -y curl wget mysql-client inetutils-ping  RUN apt install -y nginx vim procps xinetd telnetd telnet && \apt install -y net-tools lsof strace RUN python3 -m pip install uwsgi DBUtils==1.2 drf-yasg2 dj-rest-auth django-filter django-rest-swagger django djangorestframework pymysql django-import-export django-cors-headersRUN pip3 install MarkupSafe pandas threadpool
# RUN pip3 install --no-cache-dir numpy Cython onnxruntime pymilvus -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com
# RUN pip3 install -U insightface==0.6.2 -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.comRUN rm -rf /tmp/ && \rm -rf /var/lib/apt/lists/*# ---------需要在docker内自动启动程序时使用-----------------
COPY . /fingerprint
WORKDIR /fingerprint
-------- 测试环境变量声明---------
# CMD ["export", "ENV=test"]
ENV ENV=test
-----------END------------------# CMD ["python3", "-m", "http.server", "8080"]  # 调试用,进入后(执行下条命令)手动启动服务
CMD ["python3", "./fingerprint/api/manage.py", "runserver", "0.0.0.0:8099"]

制作镜像

docker build -t fingerprint:1.0 .
docker save fingerprint:1.0 > dkfile.tar.gz

3. 命令详解

3.1 常用命令

3.1.1 RUN: 构建镜像时执行的命令

RUN ["/bin/executable", "param1", "param2"]
# RUN yum install nginx

3.1.2 ENV: 设置环境变量

ENV name=kk
ENV name qwe asd (qwe,asd均为value)

如果想在运行期间使用某些变量,那么ENV是唯一的选择。ENV主要是定义环境变量,在docker run的时候ENV的配置会加载到容易内部,但ARG的参数在内部是没法看到的。

可以通过下面命令更改ENV的默认值:

docker run -e var=yyy

3.1.3 ARG: 用于指定传递给构建运行时的变量

ARG site
ARG build_user=www

ARG主要是定义一个变量,在使用docker build时可以通过参数来设定。

docker build --build-arg <varname>=<value>

因此如果需要在build期间使用某些变量,ARG是最好的选择。

3.1.4 CMD: 构建容器后调用

即在容器启动时才进行调用。

CMD 用于指定在容器启动时所要执行的命令,而RUN用于指定镜像构建时所要执行的指令。

CMD ["executable", "param1", "param2"] (执行可执行文件,优先)
CMD ["param1", "param2"] (设置了ENTRYPOINT,则直接调用ENTRYPOINT添加参数)
CMD command param1 param2 (执行shell内部命令)
eg:
CMD echo "This is a test." | wc -
CMD ["/usr/bin/wc", "--help"]

3.1.5 ENTRYPOINT: 配置容器,使其可执行

配合CMD可省去“application”,只使用参数。

ENTRYPOINT ["executable", "param1", "param2"] (可执行文件,优先)
ENTRYPOINT command param1 param2 (shell内部命令)
eg:
FROM ubuntu
ENTRYPOINT ["top", "-b"]
CMD ["-c"]

ENTRYPOINT与CMD非常类似,不同的是通过docker run 执行的命令不会覆盖ENTRYPOINT,而docker run 命令中指定的任何参数,都会被当作参数再次传递给ENTRYPOINT。Dockerfile中只允许有一个ENTRYPOINT命令,多指定时会覆盖前面的设置,而只执行最后的ENTRYPOINT指令。

docker run -itd --name=nginx nginx echo 'hello word'

3.1.6 WORKDIR: 工作目录

类似cd命令

WORKDIR /usr/local/       (当前的工作目录)

在使用docker run 运行容器时,可以通过-w 参数覆盖构建时所设置的工作目录。

3.2 其他命令

3.2.1 FROM: 指定基础镜像

必须为第一个命令。

FROM <image>
FROM <image>:<tag>    (tag表示版本)
FROM <image>@<digest>
eg:
FROM centos:7.0

 3.2.2 MAINTAINER: 维护者信息

MAINTAINER Tom

3.2.3  ADD: 将本地的文件添加到容器中

tar类型文件会自动解压(网络压缩资源不会被解压),可以访问网络资源,类似wget。

ADD <src>... <dest>
# 添加所有以“tes”开头的文件
ADD test* /mydir/
# "?"代表任一字符
ADD tes?.txt /mydir/
# 添加“test”到相对目录(第一个参数时宿主机文件路径,第二个参数时容器路径)
ADD test relativeDir

3.2.4 COPY: 类似ADD

但不会自动解压文件,也不能访问网络资源。

3.2.5 EXPOSE: 指定与外界交互的端口

EXPOSE并不会让容器的端口访问到主机。要使其可访问,需要在docker run 运行容器时通过-p来发布这些端口,或通过-P参数来发布EXPOSE导出的所有端口。

EXPOSE 80 443
EXPOSE 8080

3.2.6 VOLUME: 用于指定持久化目录

VOLUME ["/data"]
VOLUME ["/var/www", "var/log/apache2", "/etc/apache2"] 

一个卷可以存在于一个或多个容器的指定目录,该目录可以绕过联合文件系统,并具有以下功能:

1. 卷可以在容器间共享和重用;

2. 容器并不一定要和其他容器共享卷;

3. 修改卷后会立即生效;

4. 对卷的修改不会对镜像产生影响;

5. 卷会一直存在,直到没有任何容器在使用它。

3.2.7 其他

LABEL: 用于为镜像添加元数据
LABEL version="1.0" description="这是一个nginx镜像"USER: 指定运行容器时的用户名或UID
USER user
USER user:group
USER uid:gidONBUILD: 用于设置镜像触发器
ONBUILD ADD . /app/src
ONBUILD RUN /usr/local/bin/python-build --dir /app/src
当所构建的镜像被用作其他镜像的基础镜像,该镜像中的触发器将会被触发。

Dockerfile 简介相关推荐

  1. Docker容器---dockerfile简介

    Docker容器---dockerfile简介 一.dockerfile概念 1.dockerfile介绍 2.基于dockerfile创建 3.docker镜像加载原理 二.镜像的创建 1.基于现有 ...

  2. 高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介

    高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介 文章目录 高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介 D ...

  3. 【Docker】Dockerfile简介

    介绍 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本. 我们使用docker commit可以构造镜像,但是docker中的镜像随时变化,不能一 ...

  4. Dockerfile简介

    1.什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成映像. dock ...

  5. Docker核心技术之Dockerfile

    一.Dockerfile简介 Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件 利用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个 ...

  6. docker之Dockerfile

    Dockerfile 简介 从之前 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所 添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个 ...

  7. Docker小白到实战之Dockerfile解析及实战演示,果然顺手

    前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...

  8. DockerFile入门指南

    第一发布地址:http://hphblog.cn/2019/04/07/DockerFile/ 简介 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 1:每 ...

  9. Docker之使用Dockerfile创建定制化镜像(四)--技术流ken

    前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...

最新文章

  1. 如何学好单片机编程?学好单片机的基础是什么?
  2. 多人编辑同一个md_多人协同编辑一份Word文档的正确姿势是这样的
  3. Asp.net Ajax 客户端页面生命周期原生事件
  4. 你的“大厂梦”不是梦,你离大厂仅差我这篇博客!!!【吐血推荐】
  5. php数字从大到小生成,php输入几个数从大到小排序的案例
  6. 《C程序设计语言》 第三章 控制流
  7. 使用multiprocessing时的DictProxy object, typeid 'dict' at ; '__str__()' failed
  8. 天才程序员之陨落:业余项目创业 Cloudflare,公司上市前患病失去自理能力
  9. 前端实现Flexpaper的界面的效果
  10. html 的title中显示网页logo
  11. python会实现编译功能吗_为什么会有这么多python?其实python并不是编程语言!
  12. 手机计算机怎么输入汉字,手机word怎么插入形状并输入文字?
  13. PowerPoint储存此文件时发生错误 出现错误的问题解决方法
  14. 微博SDK第三方授权登陆
  15. CSS实现最简洁的加载动画
  16. 用计算机说出人说的话,用计算机语言说一句情话
  17. OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)
  18. pg数据库自动备份记录
  19. 全志a10 Android,全志A10 Android4.0 电话系统 使用说明文档 (MU509篇)
  20. 操作系统期末总复习——绝地求生版

热门文章

  1. 用懊悔法学习吴恩达机器学习【1】
  2. Angular NG-ZORRO 解决 nz-table 加纵向滚动条表头和单元格不对齐的问题
  3. element组件el-date-picker禁用当前时分秒之前的日期时间选择(代码最少)
  4. 我们 | 单枪匹马,不如群狼作战!
  5. linux文件系统dentry_Linux 文件系统(一)---虚拟文件系统VFS----超级块、inode、dentry、file...
  6. 未来人类 t5 笔记本 禁止U盘启动
  7. JDBC(oracle11g)
  8. Lighthouse 激光定位技术开源了,但不是 Valve 做的
  9. Java树形结构模糊搜索,模糊匹配
  10. 大數據環境搭建,數據採集,數倉環境準備(hive on spark) 01