DockerFile

DockerFile简介

Dockerfile是由一系列命令和参数构成的脚本,这些命令应用于操作系统(centos或者Ubuntu)基础镜像并最终创建的一个新镜像;
Dockerfile,用脚本方式来构建自动化,可复用的,高效率的创建镜像方式,是企业级开发的首选方式;
在软件系统开发生命周期中,采用Dockerfile来构建镜像;
1、对于开发人员:可以为开发团队提供一个完全一致的开发环境;
2、对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作;
3、对于运维人员:在部署时,可以实现应用的无缝移植。


DockerFile常用指令
    FROM image_name:tag
      定义了使用哪个基础镜像启动构建流程
    MAINTAINER user_info
      声明镜像维护者信息
    LABEL key value
      镜像描述元信息(可以写多条)
    ENV key value
      设置环境变量(可以写多条)
    RUN command
      构建镜像时需要运行的命令(可以写多条)
    WORKDIR path_dir
      设置终端默认登录进来的工作目录
    EXPOSE port
      当前容器对外暴露出的端口
    ADD source_dir/file dest_dir/file
      将宿主机的文件复制到容器内,如果是一个压缩文件,将会在复制后自动解压
    COPY source_dir/file dest_dir/file
      和ADD相似,但是如果有压缩文件是不能解压
    VOLUME
      创建一个可以从本地主机或其他容器挂载的挂载点,一般用来存放数据库和需要保持的数据等
    CMD
      指定容器启动时要运行的命令,假如有多个CMD,最后一个生效
    ENTRYPOINT
      指定容器启动时要运行的命令
    ONBUILD
      当构建一个被继承的Dockerfile时运行的命令,父镜像在被子镜像继承后父镜像的onbuild被触发。可以把ONBUID理解为一个触发器。

当构建一个被继承的Dockerfile时运行的命令,父镜像在被子镜像继承后父镜像的onbuild被触发。可以把ONBUID理解为一个触发器。

编写Dockerfile的时候,其他命令都是为了自身镜像服务的,只有ONBUILD是为了子镜像服务;

简单实例:父镜像Dockerfile:
FROM centos
ONBUILD RUN yum -y install vim
CMD /bin/bash

子镜像简单点:
FROM parent

一句即可;

当构建子镜像的时候,父镜像的ONBUILD会触发,子镜像直接安装vim;

实际应用,一般是ONBUILD里执行的是一些父镜像暂时无法执行的东西,比如一些COPY,ADD,可以启动一些服务,父镜像当做模板一些,仅仅提供基础支持,然后具体实行是子镜像操作。

DockerFile构建自定义centos
    编写DockerFile

FROM centos
MAINTAINER caofeng<caofeng2012@126.com>LABEL name="Java1234 CentOS Image" \build-date="20191112"ENV WORKPATH /home/
WORKDIR $WORKPATHRUN yum -y install net-tools
RUN yum -y install vimEXPOSE 80
CMD /bin/bash

构建 docker build -f myCentosDockerFile -t java1234/mycentos:1.1 .(注意必须有.作为结束)

有坑及解决办法:

 完美解决:

Ubuntu
查看当前DNSsystemd-resolve --status或resolvectl status修改DNSsudo vi /etc/systemd/resolved.confsudo systemctl restart systemd-resolved.serviceCentOS
#在宿主机执行
$ nmcli dev show | grep 'IP4.DNS'#出现
IP4.DNS[1]:              x.x.x.x
IP4.DNS[2]:              x.x.x.x#在/etc/docker目录下创建文件daemon.json
## 此处的dns是填写你前面查询出来的
## 有几个写几个{                                                                          "dns": ["x.x.x.x", "x.x.x.x"]
}#示例文件如下{"registry-mirrors": ["https://nrbewqda.mirror.aliyuncs.com"],"dns": ["208.116.3.201"]
}#重启docker
sudo service docker restart

运行 docker run -it 镜像ID
    查看镜像历史  docker history 镜像ID

DockerFile构建自定义Tomcat
    编写DockerFile

DockerFile构建自定义Tomcat的需要的JDK和TOMCAT归档-系统集成文档类资源-CSDN下载

FROM centos
MAINTAINER caofeng<caofeng2012@126.com>LABEL name="Java1234 Tomcat Image" \build-date="20191115"COPY  copyright.txt /home/copyright.txt
ADD server-jre-8u151-linux-x64.tar.gz /home/
ADD apache-tomcat-8.5.37.tar.gz /home/ENV WORKPATH /home/apache-tomcat-8.5.37/
WORKDIR $WORKPATHENV JAVA_HOME /home/jdk1.8.0_151
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /home/apache-tomcat-8.5.37/
ENV CATALINA_BASE /home/apache-tomcat-8.5.37/
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/binEXPOSE 8080
CMD ["/home/apache-tomcat-8.5.37/bin/catalina.sh","run"]

构建 docker build -f myTomcatDockerFile -t java1234/myTomcat:1.1 .
    运行 docker run -it -p 80:8080 镜像ID

DockerFile构建自定义nginx
    编写DockerFile

FROM nginx
RUN echo  '<h1>This is Tuling Nginx!!!</h1>' > /usr/share/nginx/html/index.html 

构建

sudo docker build -f DockerFile -t mynginx:V1 .

运行 docker run -it -p 80:8080 镜像ID

sudo docker run -d -p 93:80 9ca2828fb6ae

坑:

spark@spark-VirtualBox:~/app$ sudo docker run -d -p 93:80 9ca2828fb6ae
d1a9adc24ec87a75a82b21705a29a20a90ffbea9b40a3d95d67e061da0070e75
docker: Error response from daemon: driver failed programming external connectivity on endpoint friendly_fermat (c32a41fd4f3834e62a087846b4fbb5e17957592a8e989d29635049ae3659d04c):  (iptables failed: iptables --wait -t filter -A DOCKER ! -i docker0 -o docker0 -p tcp -d 172.17.0.2 --dport 80 -j ACCEPT: iptables: No chain/target/match by that name.
 (exit status 1)).

解决办法:

sudo systemctl restart docker

DockerFile通过VOLUME实现容器卷
    介绍

VOLUME['/home/v1','/home/v2']

说明:前面用启动命令 -v 宿主机目录:容器卷目录  来实现容器卷目录挂载
但是由于定义Dockerfile的时候,并不能保证在所有的宿主机上都有这样的特定目录,
所以在Dockerfile定义中,只能指定容器卷目录;

编写DockerFile

FROM centos
VOLUME ["/home/v1","/home/v2"]
CMD /bin/bash

构建 docker build -f myVolumeDockerFile -t java1234/mytest:1.1 .
    运行 docker run -it  镜像ID
    测试

运行后,我们进入home目录,找到v1,v2两个容器卷目录;

然后我们通过  docker inspect 容器ID   来查看下默认生成的容器卷对应的宿主机目录

通过新建文件和 修改,我们发现,能实现同步,没毛病;

个人认为,要实现容器卷,还是通过前面讲得-v启动命令,用dockerfile方式,比较操蛋,宿主机目录不能自定义;

CMD, ENTRYPOINT 的区别和联系

CMD语法;
CMD ["executable","param1","param2"] (exec form, this is the preferred form)
CMD ["param1","param2"] (as default parameters to ENTRYPOINT)
CMD command param1 param2 (shell form)
第一种用法:运行一个可执行的文件并提供参数。
第二种用法:为ENTRYPOINT指定参数。
第三种用法(shell form):是以”/bin/sh -c”的方法执行的命令。

ENTRYPOINT 语法;
ENTRYPOINT [“executable”, “param1”, “param2”] (exec 格式, 推荐)
ENTRYPOINT command param1 param2 (shell 格式)

我们一般开发 官方都建议用 exec格式;好使;

下面我们通过一些简单实例,来具体看下CMD, ENTRYPOINT 的实际用法;
第一个dockerfile
FROM centos
CMD echo "abc"
#CMD ["/bin/echo", "defg"]

我们可以运行测试,看看结果,以及把第二个CMD去掉 看看结果;
以及 运行命令后面跟运行参数 看看结果;能明白CMD多个的话 只有最后一个生效;

第二个dockerfile
FROM centos
ENTRYPOINT ["ls"]
CMD ["-l"]

这个dockerfile 我们用 ENTRYPOINT 执行一个ls命令 然后CMD 追加参数
相当于这个CMD是默认的一个参数 假如需要更换参数 启动的时候 ,我们直接替换即可;


DOCKER(4,DockerFile):Docker高级应用课程学习过程和一些资源汇总相关推荐

  1. Docker Review - dockerfile 入门篇

    文章目录 Docker 镜像.容器 .Docker file 概述 Docker File文件格式 Docker File 解读 1.FROM 指定基础镜像 2.RUN 执行命令 3.COPY 复制文 ...

  2. Docker : Dockerfile 定制镜像

    使用 Dockerfile 定制镜像 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程.   镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们 ...

  3. Docker学习2——Docker高级

    Docker学习2--Docker高级 2.1 Dockerfile解析 2.1.1 Dockfile是什么 Dockerfile是用来构建Docker镜像的文本文件,是由一条条构建镜像所需的指令和参 ...

  4. Kubernetes学习笔记三:Docker安装,Docker使用,编写Dockerfile,制作容器镜像,上传docker镜像

    文章目录 Docker的安装 Docker的使用:docker run命令 查看本地存在的镜像:docker images命令 编写Dockerfile,制作容器镜像 docker build制作镜像 ...

  5. Docker(七):Docker build 、Docker Dockerfile 详解

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

  6. Docker用Dockerfile定制镜像

    用Dockerfile定制镜像 镜像的定制实际上就是定制每一层所添加的配置.文件.如果我们可以把每一层修改.安装.构建.操作的命令都写入一个脚本,用这个脚本来构建.定制镜像,那之前提示的无法重复的问题 ...

  7. Docker 之 Dockerfile 的概述与使用

    一.dockerfile 概述 二.USER\WORKDIR 命令-----创建一个dockerfile文件[root@docker dockerfile]# vi Dockerfile        ...

  8. Docker Review - dockerfile 实战_使用dockerfile制作tomcat镜像

    文章目录 Pre Docker 官方镜像 Dockerfile dockerfile制作tomcat镜像 准备软件 编写Dockerfile文件 dockerfile构建镜像 启动镜像 测试访问tom ...

  9. docker之Dockerfile指令介绍

    Docker通过对于在Dockerfile中的一系列指令的顺序解析实现自动的image的构建 通过使用build命令,根据Dockerfiel的描述来构建镜像 通过源代码路径的方式 通过标准输入流的方 ...

最新文章

  1. 深入解析redis cluster gossip机制
  2. vi profile
  3. system-config-kickstart报错
  4. c语言 库 键盘,python 函数 map 、lambda
  5. matlab 第i行到j行,matlab简明教程
  6. NET问答: 为什么 IEnumerablestring 不能被初始化?
  7. spring 注释的作用_Spring的@Primary注释在起作用
  8. 常用css属性集(持续更新…)
  9. 201506110135陈若倩词法分析实验报告
  10. Oct 12: Patch Set Update Released
  11. UITextFiled和UITextView限制字数和输入特殊字符的总结
  12. Senparc.Weixin 授权获取微信信息
  13. PROFINET 模拟器使用教程
  14. AD13 整个pcb旋转任意角度
  15. 新闻叙事与文学影视叙事的区别
  16. oel6安装oracle报错,OEL6.1下安装Oracle 11gr2 RAC
  17. 小米笔记本电脑的SN码如何查找?
  18. ppt在服务器上打开要修复,打开ppt提示需要修复怎么办-处理ppt总是提示需要修复的方法 - 河东软件园...
  19. 致爱丽丝用计算机怎么弹,致爱丽丝电子琴谱应该怎么弹
  20. GetKeyState()和GetAsyncKeyState()的区别

热门文章

  1. Ant Design学习——Rate
  2. 树莓派通过MQTT协议发送图片
  3. java 面向对象之构造器:
  4. Nginx配置文件下载
  5. 价格敏感型消费者 | 画饼系列
  6. vlunhub系列之CH4INRULZ
  7. 如何改变对话框的背景颜色
  8. web前端期末大作业:基于HTML+CSS+JavaScript实现网上鲜花店网站设计(14页)
  9. 关于Word,PDF,PPT,TXT之间的转换
  10. 惠惠网发布2013年1-2月份《网购价格不完全报告》