七、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. Linux-shell 练习题(一)

    1.实现批量添加20个用户,用户名为user1-20,密码为user+123 #!/bin/bash count=$ if [ -n "$count" ] then ;i<= ...

  2. UVA11059 - Maximum Product

    1.题目名称 Maximum Product 2.题目地址 https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemi ...

  3. 每天一个linux命令(13):more命令

    版权声明更新:2017-05-17博主:LuckyAlan联系:liuwenvip163@163.com声明:吃水不忘挖井人,转载请注明出处! 1 文章介绍 本文介绍了Linux下面的mv命令. 2. ...

  4. plsql developer v12.1的使用

    1.下载oracle客户端: 配置安装路径到PATH,我的是首先定义了一个环境变量ORACLE_CLIENT_PATH(这个路径其实就是官网下来的zip包解压缩后的路径),然后将这个变量附加到PATH ...

  5. 【转】 Pro Android学习笔记(四一):Fragment(6):数据保留

    目录(?)[-] 通过fragment参数实现数据保留 对TitleFragment进行修改 对DetailActivity进行修改 通过savedInstanceState进行数据保留 保留frag ...

  6. HeartBleed bug

    前两年的一个严重漏洞,影响很大.出现在openssl 1.0.1和1.0.2 beta(包含1.0.1f和1.0.2beta1).利用了TLS的heartbeat. 简单的说,该漏洞被归为缓冲过度读取 ...

  7. tomcat如何修改发布目录

    tomcat免重启 tomcat访问的时候如何去掉项目名访问: 其中fts是您的项目名. 1.tomcat6.0:<Host></Host>间加了一句<Context p ...

  8. ML 徒手系列 SVM

    在Lagrange乘子法中,介绍了如何构建及如何使用对偶函数,对目标问题进行求解. 这一章利用L乘子法对SVM进行推导. SVM 即支持向量机,是通过求解超平面进行分类的一种算法.所谓的支持向量,是在 ...

  9. C# 删除文件和目录到回收站

    if (Directory.GetDirectories(projectPath).Length == 0 && Directory.GetFiles(projectPath).Len ...

  10. p1197&bzoj1015 星球大战

    传送门(洛谷) 传送门(bzoj) 题目 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的 ...