七、Docker File

  • .dockeringore:打包忽略的文件列表,每行写一个文件的路径,可使用通配符
  • FROM指令:指定基础镜像
FROM <repository>[:<tag>]  or FROM <repository>@<digest>
~]# mkdir img_work  #创建工作目录
~]# cd img_work/
img_work]# vim Dockerfile #注意D大写
# Description: my image #描述信息
FROM centos:centos7.5.1804 #基础镜像
LABEL maintainer="Dongfei <Dongfei@localhost.com>" #元数据
  • COPY指令:
COPY ["<src>",..."<dest>"]
1.<src>必须是build上下午中的路径,不能是父目录中的文件
2.如果<src>是目录,则其内部文件或子目录会被递归复制,但<src>目录本身不会被复制
3.如果指定多个<src>,或在<src>中使用了通配符,则<dest>必须是一个目录,且必须以/结尾
4.如果<dest>事先不存在,它将会被自动创建,这包括其父目录
# 复制网页文件
img_work]# vim Dockerfile
COPY ["index.html","/var/www/html/"]
img_work]# vim index.html
<h1>My Docker website.</h1>
img_work]# docker build -t tinyhttpd:v0.1 ./
img_work]# docker run --name h1 --rm tinyhttpd:v0.1 cat /var/www/html/index.html
<h1>My Docker website.</h1>
# 复制yum源
img_work]# cp -r /etc/yum.repos.d/ ./
img_work]# vim Dockerfile
COPY ["yum.repos.d/","/etc/yum.repos.d/"]
img_work]# docker build -t tinyhttpd:v0.2 ./
img_work]# docker run --name h2 --rm tinyhttpd:v0.2 ls /etc/yum.repos.d/
  • ADD指令:将宿主机的文件打包到docker镜像,支持URL和tar文件
ADD ["<src>",..."<dest>"]
1.<src>如果是本地的tar文件,则会自动展开至镜像中
2.<src>如果是URL的tar文件,则不会自动展开
img_work]# wget http://nginx.org/download/nginx-1.16.0.tar.gz
img_work]# vim Dockerfile
ADD ["http://nginx.org/download/nginx-1.16.0.tar.gz","/usr/local/src/"]
ADD ["nginx-1.16.0.tar.gz","/usr/local/src/"]
img_work]# docker build -t tinyhttpd:v0.3 ./
img_work]# docker run --name h3 --rm tinyhttpd:v0.3 ls /usr/local/src/
  • WORKDIR:指定工作目录,逆序往上找到第一个就是工作路径
WORKDIR /usr/local/src/
ADD http://nginx.org/download/nginx-1.16.0.tar.gz ./
ADD ["nginx-1.16.0.tar.gz","./"]
  • VOLUME:只能挂载Docker-managed volume
VOLUME /data/mysql/
  • EXPOSE:用于为容器打开指定要监听的端口实现以外部通信,只能绑定暴露容器中的端口,动态绑定在宿主机的随机端口
EXPOSE <port>[/<protocol>][<port>[/<protocol>]...] #protocol 协议
EXPOSE 80/tcp 22/tcp
  • ENV:定义环境变量,可注入容器,可以被ADD,COPY等指令所调用
ENV <key>=<value> ...
ENV DOC_ROOT="/var/www/html/"
COPY ["index.html","$DOC_ROOT"]
# docker run --name h5 -e HTTP_PORT=8888 --rm tinyhttpd:v0.5 printenv #启动容器时注入环境变量
  • RUN:在docker build时执行命令
RUN cd /usr/local/src/ && \
tar -xf nginx-1.16.0.tar.gz
  • CMD:在docker run时执行的默认命令,可以写多个,但只有最后一个生效
1.CMD <command>  #使用bash解析命令执行
2.CMD ["<executable>","<param1>","<param2>"]
3.CMD ["/bin/bash","-c","<executable>","<param1>"]
4.CMD ["<param1>","<param2>"] #CMD的参数传递给ENTRYPOINT
image_work2]# vim Dockerfile
FROM busybox
LABEL Author="Dongfei"
ENV WEB_DOC_ROOT="/data/web/html"
RUN mkdir -p ${WEB_DOC_ROOT} && \
echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html
CMD /bin/httpd -f -h ${WEB_DOC_ROOT}
image_work2]# docker build -t tinyhttpd:v0.7 ./
image_work2]# docker image inspect tinyhttpd:v0.7 |grep "CMD" "CMD [\"/bin/sh\" \"-c\" \"/bin/httpd -f -h ${WEB_DOC_ROOT}\"]"
# docker run --name tinyweb7 -it --rm -P tinyhttpd:v0.7
# docker exec -it tinyweb7 /bin/sh
CMD ["/bin/httpd","-f","-h","/data/web/html"]
image_work2]# docker image inspect tinyhttpd:v0.8 |grep "CMD"
"CMD [\"/bin/httpd\" \"-f\" \"-h ${WEB_DOC_ROOT}\"]"
  • ENTRYPOINT:类似CMD指令的功能,用于为容器指定默认运行程序,从而使得容器像是一个单独的可执行程序;与CMD不同的是,由ENTRYPOINT启动的程序不会被docker run命令行指定的参数所覆盖,而且这些命令行参数会被当作参数传递给ENTRYPOINT指定的程序
1.ENTRYPOINT <command>  #使用bash解析命令执行
2.ENTRYPOINT ["<executable>","<param1>","<param2>"]
3.ENTRYPOINT ["/bin/bash","-c","<executable>","<param1>"]
# vim Dockerfile
FROM busybox
LABEL Author="Dongfei"
ENV WEB_DOC_ROOT="/data/web/html"
RUN mkdir -p ${WEB_DOC_ROOT} && \
echo '<h1>Busybox httpd server.</h1>' > ${WEB_DOC_ROOT}/index.html
ENTRYPOINT /bin/httpd -f -h ${WEB_DOC_ROOT}
# docker build -t tinyhttpd:v0.10 ./
# docker run --name tinyweb2 -it --rm -P tinyhttpd:v0.10
img3]# vim entrypoint.sh
#!/bin/sh
cat > /etc/nginx/conf.d/www.conf << EOF
server {
server_name $HOSTNAME;
listen ${IP:-0.0.0.0}:${PORT:-80};
root ${NGX_DOC_ROOT:-/usr/share/nginx/html/};
}
EOF
exec "$@" #执行所有传入的参数 img3]# vim Dockerfile
FROM nginx:1.14-alpine
LABEL maintainer="Dongfei"
ENV NGX_DOC_ROOT="/data/web/html/"
ADD index.html ${NGX_DOC_ROOT}
ADD entrypoint.sh /bin/
CMD ["/usr/sbin/nginx","-g","daemon off;"]
ENTRYPOINT ["/bin/entrypoint.sh"] img3]# vim index.html
<h1>dongfei index</h1> img3]# docker build -t myweb:v0.1 ./
# docker run --name myweb1 --rm -P myweb:v0.1 [root@docker ~]# docker exec -it b41252ebbaa8 sh
/ # wget -O - -q b41252ebbaa8
<h1>dongfei index</h1>

注意:json数组中,注意要使用双引号

  • USER:指定用户
USER <UID>|<UserName>
  • HEALTHCHECK:容器健康监测
--interval=DURATION  :每隔多次时间检测一次,默认30s
--timeout=DURATION :每次检测超时时长,默认30s
--start-period=DURATION :等待主进程启动的时间,默认0s
--retries=N :检测几次失败任务为false,默认3次
0: success  :命令返回值
1:unhealthy
2:reserved
HEALTHCHECK --interval=5m --timeout=3s CMD curl -f http://localhost/ || exit 1
EXPOSE 80/tcp
HEALTHCHECK --start-period=3s CMD wget -O - -q http://${IP:-0.0.0.0}:${PORT:-80}/
  • SHELL:设置使用的shell,默认使用/bin/sh
  • STOPSIGNAL signal :设置使用docker stop命令停止容器时向主进程发的信号
  • ARG:定义Dockerfile变量,在docker build 传值
ARG author="Dongfei"
LABEL maintainer="${author}"
  • ONBUILD:用于在Dockerfile中定义一个触发器,当其他Dockerfile将自己的镜像当做基础镜像时执行;不能自我嵌套,不能执行MAINTAINER指令
ONBUILD ADD http://xxxx.bat

Docker Flie的更多相关文章

  1. docker——容器安装tomcat

    写在前面: 继续docker的学习,学习了docker的基本常用命令之后,我在docker上安装jdk,tomcat两个基本的java web工具,这里对操作流程记录一下. 软件准备: 1.jdk-7 ...

  2. Docker笔记一:基于Docker容器构建并运行 nginx + php + mysql ( mariadb ) 服务环境

    首先为什么要自己编写Dockerfile来构建 nginx.php.mariadb这三个镜像呢?一是希望更深入了解Dockerfile的使用,也就能初步了解docker镜像是如何被构建的:二是希望将来 ...

  3. Docker 第一篇--初识docker

    已经多年不写博客, 看完<晓松奇谈>最后一期猛然觉醒, 决定仔细梳理下自己这几年的知识脉络. 既然决定写, 那么首先就从最近2年热门的开源项目Docker开始.Docker 这两年在国内很 ...

  4. 在docker中运行ASP.NET Core Web API应用程序(附AWS Windows Server 2016 widt Container实战案例)

    环境准备 1.亚马逊EC2 Windows Server 2016 with Container 2.Visual Studio 2015 Enterprise(Profresianal要装Updat ...

  5. docker for mac 学习记录

    docker基本命令 docker run -d -p 80:80 --name webserver nginx 运行容器并起别名 docker ps 展示目前启动的容器 docker ps -a 展 ...

  6. scrapy爬虫docker部署

    spider_docker 接我上篇博客,为爬虫引用创建container,包括的模块:scrapy, mongo, celery, rabbitmq,连接https://github.com/Liu ...

  7. [原][Docker]特性与原理解析

    Docker特性与原理解析 文章假设你已经熟悉了Docker的基本命令和基本知识 首先看看Docker提供了哪些特性: 交互式Shell:Docker可以分配一个虚拟终端并关联到任何容器的标准输入上, ...

  8. 开发者的利器:Docker 理解与使用

    困扰写代码的机器难免会被我们安装上各种各样的开发工具.语言运行环境和引用库等一大堆的东西,长久以来不仅机器乱七八糟,而且有些相同的软件还有可能会安装不同的版本,这样又会导致一个项目正常运行了,却不小心 ...

  9. 使用python自动生成docker nginx反向代理配置

    由于在测试环境上用docker部署了多个应用,而且他们的端口有的相同,有的又不相同,数量也比较多,在使用jenkins发版本的时候,不好配置,于是想要写一个脚本,能在docker 容器创建.停止的时候 ...

随机推荐

  1. poj2661 Factstone Benchmark(大数不等式同取对数)

    这道题列出不等式后明显是会溢出的大数,但是没有必要写高精度,直接两边取对数(这是很简明实用的处理技巧)得: log2(n!)=log2(n)+log2(n-1)+...+log2(1)<=log ...

  2. linux命令学习笔记(1):ls命令

    ls命令是linux下最常用的命令.ls命令就是list的缩写缺省下ls用来打印出当前目录的清单 如果ls指定其他目录那么就会显示指定目录里的文件及文件夹清单. 通过ls 命令不仅可以查 看li ...

  3. Android repo 学习参考

    /*************************************************************************** * Android repo 学习参考 * 说 ...

  4. freeMarker(四)——模板开发指南之模板

    学习笔记,选自freeMarker中文文档,译自 Email: ddekany at users.sourceforge.net 模板开发指南之模板 1. 总体结构 实际上用程序语言编写的程序就是模板 ...

  5. POJ 1503 Integer Inquiry(大数相加)

    一.Description One of the first users of BIT's new supercomputer was Chip Diller. He extended his exp ...

  6. 用Azure CLI批量上传文件

    在Windows环境下,我们可以使用AzCopy批量上传文件.其效率和传输速率都是非常快的. 在Linux或MacOS环境下,可以使用Azure的CLI实现批量文件的上传. 下面的脚本可以实现此功能. ...

  7. POJ3087(模拟)

    #include"iostream" #include"string" #include"map" using namespace std; ...

  8. 删除 char[10][10] 中的一行

    1. 描述 删除二维字符数组其中一行,并用下一行进行填补 2. 代码 #include <iostream> #include <string.h> using namespa ...

  9. .net wcf调用java的需要认证的接口

    1.wcf直接添加java的webservice地址,这都是常规操作,没必要好说 2.修改config配置文件,添加headers消息头节点,这个需要注意 3.OK直接调用里面的方法即可,全部搞定 & ...

  10. python 基础 列表 增删改查

    names = ["aaron", "alex", "james", "meihengfan"]names2 = [1, ...