Dockerfile 简介
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 简介相关推荐
- Docker容器---dockerfile简介
Docker容器---dockerfile简介 一.dockerfile概念 1.dockerfile介绍 2.基于dockerfile创建 3.docker镜像加载原理 二.镜像的创建 1.基于现有 ...
- 高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介
高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介 文章目录 高级架构师_Docker_第2章_ Docker核心原理_ 第5节 Dockerfile简介 D ...
- 【Docker】Dockerfile简介
介绍 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本. 我们使用docker commit可以构造镜像,但是docker中的镜像随时变化,不能一 ...
- Dockerfile简介
1.什么是dockerfile? Dockerfile是一个包含用于组合映像的命令的文本文档.可以使用在命令行中调用任何命令. Docker通过读取Dockerfile中的指令自动生成映像. dock ...
- Docker核心技术之Dockerfile
一.Dockerfile简介 Dockerfile其实就是根据特定的语法格式撰写出来的一个普通的文本文件 利用docker build命令依次执行在Dockerfile中定义的一系列命令,最终生成一个 ...
- docker之Dockerfile
Dockerfile 简介 从之前 docker commit 的学习中,我们可以了解到,镜像的定制实际上就是定制每一层所 添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个 ...
- Docker小白到实战之Dockerfile解析及实战演示,果然顺手
前言 使用第三方镜像肯定不是学习Docker的最终目的,最想要的还是自己构建镜像:将自己的程序.文件.环境等构建成自己想要的应用镜像,方便后续部署.启动和维护:而Dockerfile就是专门做这个事的 ...
- DockerFile入门指南
第一发布地址:http://hphblog.cn/2019/04/07/DockerFile/ 简介 Dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本. 1:每 ...
- Docker之使用Dockerfile创建定制化镜像(四)--技术流ken
前言 在之前的博客<Docker端口映射及创建镜像演示(二)--技术流ken>,演示了如何使用一个现有容器创建一个镜像,以及镜像在阿里云的上传和下载. 但是这样的镜像有很大的局限性,不能根 ...
最新文章
- 如何学好单片机编程?学好单片机的基础是什么?
- 多人编辑同一个md_多人协同编辑一份Word文档的正确姿势是这样的
- Asp.net Ajax 客户端页面生命周期原生事件
- 你的“大厂梦”不是梦,你离大厂仅差我这篇博客!!!【吐血推荐】
- php数字从大到小生成,php输入几个数从大到小排序的案例
- 《C程序设计语言》 第三章 控制流
- 使用multiprocessing时的DictProxy object, typeid 'dict' at ; '__str__()' failed
- 天才程序员之陨落:业余项目创业 Cloudflare,公司上市前患病失去自理能力
- 前端实现Flexpaper的界面的效果
- html 的title中显示网页logo
- python会实现编译功能吗_为什么会有这么多python?其实python并不是编程语言!
- 手机计算机怎么输入汉字,手机word怎么插入形状并输入文字?
- PowerPoint储存此文件时发生错误 出现错误的问题解决方法
- 微博SDK第三方授权登陆
- CSS实现最简洁的加载动画
- 用计算机说出人说的话,用计算机语言说一句情话
- OpenCV入门(C++/Python)-使用OpenCV裁剪图像(四)
- pg数据库自动备份记录
- 全志a10 Android,全志A10 Android4.0 电话系统 使用说明文档 (MU509篇)
- 操作系统期末总复习——绝地求生版
热门文章
- 用懊悔法学习吴恩达机器学习【1】
- Angular NG-ZORRO 解决 nz-table 加纵向滚动条表头和单元格不对齐的问题
- element组件el-date-picker禁用当前时分秒之前的日期时间选择(代码最少)
- 我们 | 单枪匹马,不如群狼作战!
- linux文件系统dentry_Linux 文件系统(一)---虚拟文件系统VFS----超级块、inode、dentry、file...
- 未来人类 t5 笔记本 禁止U盘启动
- JDBC(oracle11g)
- Lighthouse 激光定位技术开源了,但不是 Valve 做的
- Java树形结构模糊搜索,模糊匹配
- 大數據環境搭建,數據採集,數倉環境準備(hive on spark) 01