1. dockerFile介绍

    dockerFile是用来构建docker镜像的文件!命令参数脚本!

    步骤:

    • 编写dockerFile文件
    • docker build构建成为一个镜像
    • docker run运行镜像
    • docker push发布镜像(DockerHub,阿里云镜像仓库)

    查看官方制作的dockerFile

    • 在hub.docker上搜索centos

    • 选择某个版本的centos,随后跳转到github上


    • FROM scratch #最底层
      ADD centos-8-x86_64.tar.xz /
      LABEL org.label-schema.schema-version="1.0"
      org.label-schema.name="CentOS Base Image"
      org.label-schema.vendor="CentOS"
      org.label-schema.license="GPLv2"
      org.label-schema.build-date="20200809"
      CMD ["/bin/bash"]

    dockerFile与dockerImages,docker容器的关系:

    • dockerFile用于构建生成镜像,也就是最终发布和运行的产品
    • docker容器是docker镜像实际运行的一个个独立的服务

    基础知识:

    • 每个保留关键字(指令)都必须是大写字母
    • 执行从上到下顺序执行
    • #表示注释
    • 每一个指令都会创建提交一个新的镜像层
  2. dockerFIle指令

    FROM         # 基础镜像
    MAINTAINER # 维护者信息(姓名+邮箱)
    RUN # 镜像构建时的命令
    ADD # 需要添加的其它环境,如:tomcat压缩包,会自动解压
    WORKDIR # 镜像的工作目录(如一开始就进入的目录)
    VOLUME # 需要挂载的目录
    EXPOSE # 暴露端口(可以替代-p)
    CMD # 指定容器启动的时候要运行的命令,只有最后一个会生效,可被替代(即从外部调用docker run指令且携带参数时,参数会替代dockerFile中的指令)
    ENTRYPOINT # 指定容器启动的时候要运行的命令,可以追加命令(与上面的不同,不会被替代,而是追加)
    ONBUILD # 当构建一个被继承DockerFile的时候,会运行ONBUILD的指令
    COPY # 类似ADD,当我们文件拷贝到镜像中
    ENV # 构建的时候设置环境变量

    测试:

    #1,编写dockerFile文件
    FROM centos #基于centos构建
    MAINTAINER arno<1143037783@qq.com>
    ENV MYPATH /user/local #设置环境变量
    WORKDIR $PATH #设置工作目录
    RUN yum -y install vim #RUN命令应该是在镜像构建的时候运行的,添加了一些新功能
    RUN yum -y install net-tools
    EXPOSE 80 #暴露的端口
    CMD echo $MYPATH
    CMD echo "---end---"
    CMD /bin/bash #2.构建镜像
    [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f mydockerfile -t newcentos . #3.查看镜像
    [root@iZwz908j8pbqd86doyrez5Z test]# docker images
    REPOSITORY TAG IMAGE ID CREATED SIZE
    newcentos latest ded9efb6e766 3 minutes ago 295MB #4.运行镜像
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run -P -d -it newcentos
    [root@iZwz908j8pbqd86doyrez5Z test]# docker ps
    CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
    4ce4eebf72f9 newcentos "/bin/sh -c /bin/bash" 7 seconds ago Up 7 seconds 0.0.0.0:32773->80/tcp sad_ride #可以看到运行的是80端口
    [root@iZwz908j8pbqd86doyrez5Z test]# docker attach 4ce4eebf72f9
    [root@4ce4eebf72f9 local]# #可以看到进入的是/usr/local这一工作目录
    [root@4ce4eebf72f9 local]# ifconfig #成功在基础的centos上添加了一些新功能(RUN)
    eth0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
    inet 172.17.0.10 netmask 255.255.0.0 broadcast 172.17.255.255
    ether 02:42:ac:11:00:0a txqueuelen 0 (Ethernet)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 lo: flags=73<UP,LOOPBACK,RUNNING> mtu 65536
    inet 127.0.0.1 netmask 255.0.0.0
    loop txqueuelen 1000 (Local Loopback)
    RX packets 0 bytes 0 (0.0 B)
    RX errors 0 dropped 0 overruns 0 frame 0
    TX packets 0 bytes 0 (0.0 B)
    TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 #5.查看镜像固构建的历史
    [root@iZwz908j8pbqd86doyrez5Z test]# docker history newcentos
    IMAGE CREATED CREATED BY SIZE COMMENT
    ded9efb6e766 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "/bin… 0B
    345196631c6a 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
    86451430c08f 12 minutes ago /bin/sh -c #(nop) CMD ["/bin/sh" "-c" "echo… 0B
    11948d022259 12 minutes ago /bin/sh -c #(nop) EXPOSE 80 0B
    99c8922d054b 12 minutes ago /bin/sh -c yum -y install net-tools 22.8MB
    b43f395d0d9e 12 minutes ago /bin/sh -c yum -y install vim 57.2MB
    c973079ba70d 13 minutes ago /bin/sh -c #(nop) WORKDIR /usr/local 0B
    ff143e3cb146 13 minutes ago /bin/sh -c #(nop) ENV MYPATH=/usr/local 0B
    eee54c129432 13 minutes ago /bin/sh -c #(nop) MAINTAINER arno<114303778… 0B
    0d120b6ccaa8 4 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
    <missing> 4 weeks ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
    <missing> 4 weeks ago /bin/sh -c #(nop) ADD file:538afc0c5c964ce0d… 215MB

    docker history:查看镜像的变更历史(构建过程,配置参数)

  3. CMD命令与ENTRYPOINT区别

    比较思路,cmd中的“ls -a”可以列出所有的目录,"ls -al"可以列出所有目录的详细信息.我们分别用CMD和ENTRYPOINT命令构建镜像,然后在运行容器时尝试添加"-l参数",查看运行结果

    (1).CMD

    #1.编写dockerfile文件
    FROM centos
    CMD ["ls","-a"] #复杂命令用[]包裹 #2.构建镜像
    [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest1 -t dockerfiletest1 . #3.运行容器
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest1
    .
    ..
    ... #4.尝试添加参数运行——失败,因为没有"ls -l"指令
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run -l dockerfiletest1
    "docker run" requires at least 1 argument.

    (2).ENTRYPOINT

    #1.编写dockerfile文件
    FROM centos
    ENTRYPOINT ["ls","-a"] #复杂命令用[]包裹 #2.构建镜像
    [root@iZwz908j8pbqd86doyrez5Z test]# docker build -f dockerfiletest2 -t dockerfiletest1 . #3.运行容器
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2
    .
    ..
    ... #4.尝试添加参数运行
    [root@iZwz908j8pbqd86doyrez5Z test]# docker run dockerfiletest2 -l
    total 56
    drwxr-xr-x 1 root root 4096 Sep 13 01:17 .
    ...

    区别:

    • docker run的命令的参数是覆盖CMD指令的参数
    • docker run的命令的参数是追加ENTRYPOINT指令的参数后
  4. 使用duockerfile制作Tomcat镜像(最难的一部分)

    准备工作:tomcat压缩包,jdk压缩包

    #1.编写Dockerfile文件
    FROM centos
    MAINTAINER arno<1143037783@qq.com> COPY readme.txt /usr/local/readme.txt #添加readme目录 ADD jdk-8u261-linux-x64.tar.gz /usr/local/ #添加安装包,会自动解压
    ADD apache-tomcat-9.0.37.tar.gz /usr/local/ #这里路径最后应该有"/" RUN yum -y install vim ENV MYPATH /usr/local #工作目录(用户一开始进入的目录)
    WORKDIR $MYPATH ENV JAVA_HOME /usr/local/jdk1.8.0_261
    ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
    ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.37 #centos环境变量
    ENV CATALINA_BASH /usr/local/apache-tomcat-9.0.37 #绝对路径
    ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin EXPOSE 8080 CMD /usr/local/apache-tomcat-9.0.37/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.37/logs/catalina.out #启动apache,同时输出日志文件 #2.构建镜像
    docker build -t arno-tomcat . #因为dockerfile文件名为Dockerfile,所以省略了-f #3.运行容器
    docker run -d -it -p 9090:8080 -v /usr/arno/tomcat/test:/usr/local/apache-tomcat-9.0.37/webapps/ROOT -v /usr/arno/tomcat/log:/usr/local/apache-tomcat-9.0.37/logs arno-tomcat #挂载tomcat的对外展示页面以及日志的目录 #4.测试端口
    curl localhost:38775
    • 需要准备tar.gz压缩包,这边犯了一个比较睿智的问题,x86是32位的,x64是64位的
    • 起名为Dockerfile(默认名),在build的时候-f后面可以不用指定名字
    • 使用COPY命令拷贝文件到容器内部(比如readme.md)
    • ADD命令添加的压缩包会自动解压(一般会将它解压到/usr/local目录下)
    • Tomcat没有运行起来,可以到tomcat/bin目录下运行catalina.sh run &指令运行
  5. 镜像发布

    发布到DockerHub

    (1).注册账号

    (2).从服务器登陆docker.hub

    docker login -u usrname -p password

    (3).从服务器提交镜像

    [root@iZwz908j8pbqd86doyrez5Z test]# docker tag arno-tomcat8 arnovc/arno-tomcat8  #打上标记
    [root@iZwz908j8pbqd86doyrez5Z test]# docker push arnovc/arno-tomcat8 #将打上标记的镜像上传

    注意:

    • 要在镜像之前打上id的标记
    • docker tag指令打标记

    阿里云镜像

    准备工作:登陆阿里云,点开阿里云镜像服务,创建命名空间,创建镜像仓库,创建容器镜像

    #登陆阿里云(如果有登陆docker.hub,建议先退出)
    docker login --username=亚诺_vc registry.cn-hangzhou.aliyuncs.com #打上tag
    docker tag [ImageId] registry.cn-hangzhou.aliyuncs.com/arno-test/新的镜像名:[镜像版本号] #上传镜像
    $ sudo docker push registry.cn-hangzhou.aliyuncs.com/arno-test/镜像名:[镜像版本号]

    注意:

    • 点击仓库的基本信息,可以查看镜像推送的步骤
    • [:tag]中的"[]"表示可选项,本身是不用带上的

Docker——dockerfile的更多相关文章

  1. docker Dockerfile指令ADD和COPY的区别,添加目录方法

    docker Dockerfile指令ADD和COPY的区别,添加目录方法 ADD指令的功能是将主机构建环境(上下文)目录中的文件和目录.以及一个URL标记的文件 拷贝到镜像中.其格式是: ADD 源 ...

  2. Docker Dockerfile简述

    原文地址:https://www.cnblogs.com/cuimiemie/p/6442677.html 作用 Dockerfile的内容是一坨可以执行的代码(或者说是指令)(docker的DSL) ...

  3. Docker - Dockerfile - 常见命令简介

    概述 感觉是个 比较重要的东西 有个疑问 我是先讲 docker build 还是 先讲 Dockerfile 穿插讲 docker build 最基本的东西 原理 -t -f docker file ...

  4. [第十二篇]——Docker Dockerfile之Spring Cloud直播商城 b2b2c电子商务技术总结

    Docker Dockerfile 什么是 Dockerfile? Dockerfile 是一个用来构建镜像的文本文件,文本内容包含了一条条构建镜像所需的指令和说明. 使用 Dockerfile 定制 ...

  5. Docker dockerfile创建Eclipse镜像初试

    抽空初步阅读了Docker技术入门与实战 [Kindle电子书] http://www.cnblogs.com/2018/p/4600116.html 现在想首先在开发环境下引入统一的环境,由于开发中 ...

  6. .Net Core+cenos7+Docker+Dockerfile 部署实践

    因为这段时间比较忙,同时也在抽时间将开发框架转移到 .net Core 上 所以写博客的时间就少了,这次我利用dockerfile成功将.net Core程序部署到了cenos7容器中,特抽时间把我的 ...

  7. Docker Dockerfile详解

    http://blog.csdn.net/wsscy2004/article/details/25878223 如何使用 Dockerfile用来创建一个自定义的image,包含了用户指定的软件依赖等 ...

  8. Docker Dockerfile COPY vs ADD

    http://blog.163.com/digoal@126/blog/static/163877040201410341236664/   在Dockerfile中, 我们可以使用ADD和COPY拷 ...

  9. docker——Dockerfile创建镜像

    写在前面: 继续docker的学习,昨天用docker成功跑了tomcat,但是在centos中镜像跑的容器手动装jdk和tomcat,今天学习用Dockerfile创建镜像,并在上面搭建java环境 ...

  10. docker~Dockerfile优化程序的部署

    回到目录 一些理论 我们都知道docker这个容器工具可以帮助我们快速进行环境的部署,这对于运营人员来说,无疑是个福音,而这个工作大叔认为不应该是运营人员干的,而是由开发人员来做,因为只有你知道你干的 ...

随机推荐

  1. nginx中的模块分类及常见核心模块有哪些

    1.模块分类 核心模块:是 Nginx 服务器正常运行必不可少的模块,提供错误日志记录 .配置文件解析 .事件驱动机制 .进程管理等核心功能 标准HTTP模块:提供 HTTP 协议解析相关的功能,比如 ...

  2. web测试学习大纲

    Web测试 Web测试体系介绍 网络协议 Web开发 基础 原理 前端分析 安全性测试 可用性,兼容性 功能测试(同系统测试) 理解网络协议 互联网历史沿革 Web系统基础 Web核心技术 web服务 ...

  3. Solution -「国家集训队」「洛谷 P2619」Tree I

    \(\mathcal{Description}\)   Link.   给一个 \(n\) 个点 \(m\) 条边的带权无向图,边有权值和黑白颜色,求恰选出 \(K\) 条白边构成的最小生成树.    ...

  4. Vue2.0源码学习(4) - 合并配置

    合并配置 通过之前的源码学习,我们已经了解到了new Vue主要有两种场景,第一种就是在外部主动调用new Vue创建一个实例,第二个就是代码内部创建子组件的时候自行创建一个new Vue实例.但是无 ...

  5. Zookeeper开源客户端Curator之创建会话

    前面Zookeeper的链接使用的都是其提供的原生代码,实际开发过程中非常底层的细节开发工作如连接重连,反复注册等耗费开发人员大量的工作精力并且重复工作.而开源客户端Curator的出现解决了该类问题 ...

  6. 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享

    今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...

  7. jemter参数化是如何取值的?(数据分配)

    参数化文件数据 脚本设置 ${__threadNum}是线程号,${n}是取值 测试结果 第一次 线程1取值:1,4,7,10,12 线程2取值:2,3,6,11,16 线程3取值:5,9,15,17 ...

  8. 可视化BI软件为企业提升数据分析效率

    ​可视化BI软件经过几十年的不断发展,已成为大型企业进行商业决策不可缺少的工具.在BI软件问世之前,由于做数据分析可视化的时间较长.人力成本较高,企业一直处于忽视的状态.可视化BI软件的出现极大地提高 ...

  9. 【C# .Net GC】GC内存分配规则

    GC 管理内存分配和回收 公共语言运行时的垃圾回收器为应用程序管理内存的分配和释放. https://docs.microsoft.com/zh-cn/dotnet/standard/automati ...

  10. Python 小数据池和代码块缓存机制

    前言 本文除"总结"外,其余均为认识过程:3.7.5: 总结: 如果在同一代码块下,则采用同一代码块下的缓存机制: 如果是不同代码块,则采用小数据池的驻留机制: 需要注意的是,交互 ...