通过Dockerfile创建镜像

通过Dockerfile创建镜像

Docker 提供了一种更便捷的方式,叫作 Dockerfile

 docker build命令用于根据给定的Dockerfile构建Docker镜像。

docker build语法:

 # docker build [OPTIONS] <PATH | URL | ->
 1. 常用选项说明--build-arg,设置构建时的变量--no-cache,默认false。设置该选项,将不使用Build Cache构建镜像--pull,默认false。设置该选项,总是尝试pull镜像的最新版本--compress,默认false。设置该选项,将使用gzip压缩构建的上下文--disable-content-trust,默认true。设置该选项,将对镜像进行验证--file, -f,Dockerfile的完整路径,默认值为‘PATH/Dockerfile’--isolation,默认--isolation="default",即Linux命名空间;其他还有process或hyperv--label,为生成的镜像设置metadata--squash,默认false。设置该选项,将新构建出的多个层压缩为一个新层,但是将无法在多个镜像之间共享新层;设置该选项,实际上是创建了新image,同时保留原有image。--tag, -t,镜像的名字及tag,通常name:tag或者name格式;可以在一次构建中为一个镜像设置多个tag--network,默认default。设置该选项,Set the networking mode for the RUN instructions during build--quiet, -q ,默认false。设置该选项,Suppress the build output and print image ID on success--force-rm,默认false。设置该选项,总是删除掉中间环节的容器--rm,默认--rm=true,即整个构建过程成功后删除中间环节的容器
 示例: docker build -t soso/bbauto:v2.1 .​docker build  是docker创建镜像的命令 -t 是标识新建的镜像属于 soso的 bbauto镜像 :v2 是tag "."是用来指明 我们的使用的Dockerfile文件当前目录的 

2.1、 创建镜像所在的文件夹和Dockerfile文件

 [root@yixuan ~]# mkdir sinatra[root@yixuan ~]# cd sinatra/[root@yixuan sinatra]# touch Dockerfile

2.2、 在Dockerfile文件中写入指令,每一条指令都会更新镜像的信息例如:

 [root@yixuan sinatra]# vim Dockerfile#This is a comment FROM daocloud.io/library/centos:7MAINTAINER soso soso@yixuanRUN yum install -y wgetRUN touch a.txtRUN mkdir /test

格式说明:

 命令要大写,"#"是注解。 每一个指令后面需要跟空格,语法。FROM 命令是告诉docker 我们的镜像什么从哪里下载。 MAINTAINER 是描述 镜像的创建人。   maintainerRUN 命令是在镜像内部执行。就是说他后面的命令应该是针对镜像可以运行的命令。 

2.3、创建镜像

 命令:# docker build -t soso/centso:7 . ​docker build  是docker创建镜像的命令  

详细执行过程:

 [root@yixuan sinatra]# docker build -t soso/centos:7 . Sending build context to Docker daemon  2.048kBStep 1/4 : FROM daocloud.io/library/centoslatest: Pulling from library/centosd8d02d457314: Pull complete Digest: sha256:a36b9e68613d07eec4ef553da84d0012a5ca5ae4a830cf825bb68b929475c869Status: Downloaded newer image for daocloud.io/library/centos:latest---> 67fa590cfc1cStep 2/4 : MAINTAINER soso soso@yixuan---> Running in aab3d80939d8Removing intermediate container aab3d80939d8---> 12bae7d75a23Step 3/4 : RUN yum update && yum install -y epel*---> Running in ad83c387c60fLoaded plugins: fastestmirror, ovlDetermining fastest mirrors* base: mirrors.aliyun.com* extras: mirrors.aliyun.com* updates: mirrors.aliyun.comResolving Dependencies--> Running transaction check---> Package audit-libs.x86_64 0:2.8.4-4.el7 will be updated---> Package audit-libs.x86_64 0:2.8.5-4.el7 will be an update

2.4、创建完成后,从镜像创建容器

1570288025491

1570288081326

Dockerfile实例:容器化python的flask应用

目标: 用 Docker 部署一个用 Python 编写的 Web 应用。

首先部署整个流程:

 基础镜像(python)-->flask-->部署python应用web框架 flask django

代码功能:

如果当前环境中有"NAME"这个环境变量,就把它打印在"Hello"后,否则就打印"Hello world",最后再打印出当前环境的 hostname。

 [root@yixuan ~]# mkdir python_app[root@yixuan ~]# cd python_app/[root@yixuan python_app]# vim app.pyfrom flask import Flaskimport socketimport os​app = Flask(__name__)​@app.route('/')def hello():html = "<h3>Hello {name}!</h3>" \"<b>Hostname:</b> {hostname}<br/>"return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname())​if __name__ == "__main__":app.run(host='0.0.0.0', port=80)

应用依赖:

定义在同目录下的 requirements.txt 文件里,内容如下:

 [root@yixuan python_app]# vim requirements.txtFlask 

Dockerfile制作容器镜像:

 # vim DockerfileFROM python:2.7-slimWORKDIR /appADD . /appRUN pip install --trusted-host [pypi.python.org|mirrors.aliyun.com] -r requirements.txtEXPOSE 80ENV NAME WorldCMD ["python", "app.py"]

Dockerfile文件说明:

 FROM python:2.7-slim# 使用官方提供的 Python 开发镜像作为基础镜像 # 指定"python:2.7-slim"这个官方维护的基础镜像,从而免去安装 Python 等语言环境的操作。:​WORKDIR /app# 将工作目录切换为 /app,意思是在这一句之后,Dockerfile 后面的操作都以这一句指定的 /app 目录作为当前目录。 ​ADD . /app# 将当前目录下的所有内容复制到 /app 下 Dockerfile 里的原语并不都是指对容器内部的操作。比如 ADD,指的是把当前目录(即 Dockerfile 所在的目录)里的文件,复制到指定容器内的目录当中。​RUN pip install --trusted-host pypi.python.org -r requirements.txt# 使用 pip 命令安装这个应用所需要的依赖​EXPOSE 80# 允许外界访问容器的 80 端口​ENV NAME World# 设置环境变量​CMD ["python", "app.py"]# 设置容器进程为:python app.py,即:这个 Python 应用的启动命令,这里app.py 的实际路径是 /app/app.py。CMD ["python", "app.py"] 等价于 "docker run python app.py"。 

现在目录结构:

 [root@yixuan python_app]# lsDockerfile  app.py   requirements.txt 

构建镜像:

 [root@yixuan python_app]# docker build -t testpython .-t  给这个镜像加一个 Tag

Dockerfile 中的每个原语执行后,都会生成一个对应的镜像层。即使原语本身并没有明显地修改文件的操作(比如,ENV 原语),它对应的层也会存在。只不过在外界看来,这个层是空的。

查看结果:

 [root@yixuan python_app]# docker imagesREPOSITORY                              TAG                 IMAGE ID           ...testpython                              latest              16bc21f3eea3

启动容器:

 [root@yixuan python_app]# docker run -it -p 4000:80 testpython /bin/bash

查看容器:

 [root@yixuan python_app]# docker ps CONTAINER ID        IMAGE               COMMAND             CREATED                  ce02568e64ce        testpython          "/bin/bash"         About a minute ago

进入容器:

 [root@yixuan python_app]# docker exec -it ce02568 /bin/bash root@ce02568e64ce:/app# python app.py &        #将python运行起来

访问容器内应用:

 [root@yixuan ~]# curl http://localhost:4000<h3>Hello World!</h3><b>Hostname:</b> f201f6855136<br/>

实战练习

 1.创建一个nginx的dockerfile[root@yixuan ~]# mkdir nginx  [root@yixuan ~]# cd nginx/[root@yixuan nginx]# vim Dockerfile# This my first nginx Dockerfile# Version 1.0FROM daocloud.io/library/centos:7MAINTAINER yixuanENV PATH /usr/local/nginx/sbin:$PATHADD nginx-1.16.1.tar.gz /usr/local/ADD epel-release-7-11.noarch.rpm /usr/local/RUN rpm -ivh /usr/local/epel-release-7-11.noarch.rpmRUN yum install -y gcc gcc-c++ make && yum -y install openssl openssl-devel && yum install -y zlib zlib-devel && yum clean allRUN useradd -s /sbin/nologin -M wwwWORKDIR /usr/local/nginx-1.16.1RUN ./configure --prefix=/usr/local/nginx --user=www --group=www && make && make installRUN echo "daemon off;" >> /etc/nginx.confEXPOSE 80CMD /bin/sh -c 'nginx -g "daemon off;"'  #放前台启动​[root@yixuan nginx]# ls   #将nginx的tar包与epel源上传到nginx目录下面Dockerfile  epel-release-7-11.noarch.rpm  nginx-1.16.1.tar.gz[root@yixuan nginx]# pwd/root/nginx[root@yixuan nginx]# docker build -t nginx:v7.1 .[root@yixuan nginx]# docker run -itd --name nginx9 -p 8088:80 nginx:v7.1  #启动容器[root@yixuan nginx]# docker ps CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                  NAMESfec1f3a37cb0        nginx:v7.1          "/bin/sh -c '/bin/sh…"   6 seconds ago       Up 5 seconds        0.0.0.0:8088->80/tcp

image-20200307220055661

 2.创建一个jenkins的Dockerfile[root@yixuan ~]# mkdir tomcat [root@yixuan ~]# cd tomcat/[root@yixuan tomcat]# vim Dockerfile# This my first jenkins Dockerfile# Version 1.0​FROM daocloud.io/library/centos:7MAINTAINER yixuanENV JAVA_HOME /usr/local/jdk1.8.0_211ENV TOMCAT_HOME /usr/local/apache-tomcat-8.5.47ENV PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATHENV CLASSPATH=.:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jarADD apache-tomcat-8.5.47.tar.gz /usr/local/ADD jdk-8u211-linux-x64.tar.gz /usr/local/RUN rm -rf /usr/local/apache-tomcat-8.5.47/webapps/*ADD jenkins.war /usr/local/apache-tomcat-8.5.47/webappsRUN rm -rf apache-tomcat-8.5.47.tar.gz  apache-tomcat-8.5.47.tar.gzEXPOSE 8080ENTRYPOINT ["/usr/local/apache-tomcat-8.5.47/bin/catalina.sh","run"]  #运行的命令​[root@yixuan tomcat]# pwd/root/tomcat[root@yixuan tomcat]# ls  #将jdk与tomcat还有jenkins的包上传到tomcat目录中apache-tomcat-8.5.47.tar.gz  Dockerfile  jdk-8u211-linux-x64.tar.gz  jenkins.war[root@yixuan tomcat]# docker build -t jenkins:v1 .[root@yixuan tomcat]# docker run -itd --name jenkins1 -p 8081:8080 jenkins:v1
 3.创建一个jenkins的DockerfileFROM centos:7LABEL maintainer="qingning"ADD https://pkg.jenkins.io/redhat-stable/jenkins.repo /etc/yum.repos.d/jenkins.repoRUN rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io-2023.key &&\yum -y install fontconfig  &&\yum -y install https://download.oracle.com/java/17/latest/jdk-17_linux-x64_bin.rpm &&\yum -y install jenkins && \yum clean allCMD jenkins

镜像已构建完成,并上传至hub.docker.com/qingning800/jenkins:2.1

image-20200307230106461

扩展----CMD与ENTRYPOINT区别

 一、dockerfile中的 CMD​1、每个dockerfile中只能有一个CMD如果有多个那么只执行最后一个。2、CMD 相当于启动docker时候后面添加的参数看,举个简单例子:# docker run -itd --name test image(镜像) /bin/bash -ca、镜像名称后面跟了一个/bin/bash -c ,其实等价于在dockerfile中的CMD ["/bin/bash","-c"]。b、如果dockerfile中的CMD中有了CMD["/bin/bash","-c"],那么就不用在执行的时候再添加了,如果添加了参数的话那么就相当于要执行你添加的参数,默认的CMD中的参数就无效了。​二、dockerfile中的ENTRYPOINT1、一个dockerfile中ENTRYPOINT也只能存在一个,若存在多个那么只执行最后一个,你可以理解为开机启动的意思,和CMD有点像,不过还是有区别。​2、举个简单例子:a、dockerfile中有ENTRYPOINT ["tail","-f","/var/log/nginx/access.log"],那么启动的时候镜像就执行了这个里面的内容,如果你像上面带参数的话就相当于在这个执行的内容后面再加入参数。案例:如果我们的dockerfile中有a中的这句话然后我们启动我们的docker:#docker run -itd --name test image(镜像名) /bin/bash -c​此时就相当于我们启动docker的时候执行了:tail -f /var/log/nginx/access.log /bin/bash -c这个命令明显就不对.
 FROM centos:7CMD ["ls","-a"]ENTRYPOINT ["ls","-a"]​加参数 -l测试

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/728085.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java学习笔记------内部类

类的五大成员 属性、方法、构造方法、代码块、内部类 内部类 格式&#xff1a; public class Outer{//外部类 public class Inner{//内部类 } } public class Test{//外部其他类 public static void main(String[] args) } inner类表示的事物是Outer类的一部分&#xf…

【计算机考研】考408,还是不考408性价比高?

首先综合考虑&#xff0c;如果其他科目并不是很优秀&#xff0c;需要我们花一定的时间去复习&#xff0c;408的性价比就不高&#xff0c;各个科目的时间互相挤压&#xff0c;如果备考时间不充裕&#xff0c;考虑其他专业课也未尝不可。 复习408本来就是费力不讨好的事情 不同…

公司项目总结合分享经验

珠海督办 1.批量导入 导入excel表单给接口&#xff0c;接口返回前端想要的数据 list是代表数据的数量&#xff0c;titleMap是代表数据中会有那些字段 listl里面的字段&#xff1a; value是代表要显示的值&#xff0c;success为true代表excel表格的内容填写是正确的&#…

前端布局方式及其优缺点

前端布局方式多种多样&#xff0c;每种布局方式都有其特定的应用场景、特性和优缺点。以下是一些常见的前端布局方式及其特点和优缺点&#xff1a; 静态布局&#xff1a; 特性&#xff1a;元素的尺寸使用绝对单位&#xff08;如px&#xff09;进行定义&#xff0c;不会随浏览器…

1.5 简述转置卷积的主要思想以及应用场景

1.5 简述转置卷积的主要思想以及应用场景 普通的卷积主要思想&#xff1a; 普通的卷积操作可以形式化为一个矩阵乘法运算&#xff0c;即yAx&#xff08;1-12&#xff09; 其中&#xff0c;x和y分别是卷积的输入和输出(展平成一维向量形式)&#xff0c;维度分别为d⁽i⁾和d⁽…

Linux:kubernetes(k8s)探针ReadinessProbe的使用(9)

本章yaml文件是根据之前文章迭代修改过来的 先将之前的pod删除&#xff0c;然后使用下面这个yaml进行生成pod apiVersion: v1 # api文档版本 kind: Pod # 资源对象类型 metadata: # pod相关的元数据&#xff0c;用于描述pod的数据name: nginx-po # pod名称labels: # pod的标…

第三百八十八回

文章目录 概念介绍使用方法示例代码 我们在上一章回中介绍了DateRangePickerDialog Widget相关的内容,本章回中将介绍Radio Widget.闲话休提&#xff0c;让我们一起Talk Flutter吧。 概念介绍 我们在这里说的Radio Widget是指单选按钮&#xff0c;没有选中时是圆形边框&#x…

Vue+SpringBoot打造超市账单管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块三、系统设计3.1 总体设计3.2 前端设计3.3 后端设计在这里插入图片描述 四、系统展示五、核心代码5.1 查询供应商5.2 查询商品5.3 新增超市账单5.4 编辑超市账单5.5 查询超市账单 六、免责说明 一、摘要 1.1 项目介绍 基于…

王道机试C++第 3 章 排序与查找:排序问题 Day28(含二分查找)

查找 查找是另一类必须掌握的基础算法&#xff0c;它不仅会在机试中直接考查&#xff0c;而且是其他某些算法的基础。之所以将查找和排序放在一起讲&#xff0c;是因为二者有较强的联系。排序的重要意义之一便是帮助人们更加方便地进行查找。如果不对数据进行排序&#xff0c;…

【uni-app小程序开发】实现一个背景色渐变的滑动条slider

最近做的一个用uni-app+vue2开发的微信小程序项目中要实现一个滑动进度控制条,如下图所示: 1. 滑动条需要渐变背景色 2. 滑块的背景色需要与当前位置滑动条的背景色一致(动态改变) 碰到这样的需求,我当然先是看看官方提供的slider组件和uView里的u-slider组件能不能满足…

Javaweb之Web后端开发总结的详细解析

4. Web后端开发总结 到此基于SpringBoot进行web后端开发的相关知识我们已经学习完毕了。下面我们一起针对这段web课程做一个总结。 我们来回顾一下关于web后端开发&#xff0c;我们都学习了哪些内容&#xff0c;以及每一块知识&#xff0c;具体是属于哪个框架的。 web后端开…

nyist_acm 个人积分赛1(部分题解会补充)

Mirrored String II 看到题解说是马拉车算法&#xff0c;我赛时并没想到&#xff08;好吧其实我是比赛完才知道有马拉车这个算法&#xff09; 因为字符串的长度只有1000&#xff0c;直接暴力跑其实就可以了&#xff0c;但是要注意的是&#xff1b;回文串有俩种形式&#xff0c…

1. Gin框架入门

文章目录 一、Gin框架介绍二、RESTful API三、Gin渲染1. HTML渲染2. 自定义模板函数3. 静态文件处理4. 使用模板继承5. 补充文件路径处理6. JSON渲染7. XML渲染8. YMAL渲染9. protobuf渲染 四、Gin获取各种方式传递过来的参数1、获取querystring参数2、获取form参数3、获取path…

Vue3实现页面跳转功能

目标&#xff1a; 首页&#xff1a; 点击About后&#xff1a; 第一步&#xff1a;安装 Vue Router和创建你先 npm install vue-router4第二步&#xff1a;在router.js中设置路由 import { createRouter, createWebHistory } from vue-router; import Home from ./views/Home…

如何写一份简单的产品说明书,教程奉上

如果你是一位新晋产品经理&#xff0c;或者正在研发新产品&#xff0c;并且心中惴惴不安因为未知的产品说明书制作环节&#xff0c;那么今天你就来对地方了。本篇文章将教你如何创建一份简单明了的产品说明书。让我们开始吧&#xff01; 首先&#xff0c;明确产品说明书的目标。…

达梦数据库基础操作(二):表空间操作

达梦数据库基础操作(二)&#xff1a;表空间操作 1. 表空间操作 1.1 达梦表空间介绍 表空间的概念&#xff1a; 每个DM 数据库都是由一个或者多个表空间组成&#xff0c;表空间是一个逻辑的存储容器&#xff0c;它位于逻辑结构的顶层&#xff0c;用于存储数据库中的所有数据&am…

【CSP试题回顾】201503-3-节日

CSP-201503-3-节日 关键点&#xff1a;格式化输出 在C中&#xff0c;格式化输出通常利用iostream库中的功能&#xff0c;特别是iomanip头文件提供的一系列操作符。这些操作符用于控制输出格式&#xff0c;如宽度、填充、对齐方式等。在你提供的代码中&#xff0c;用于格式化输…

基于Springboot+Layui餐厅点餐系统

一、项目背景 在互联网经济飞速发展的时代&#xff0c;网络化企业管理也在其带领下快速兴起&#xff0c;开发一款自主点餐系统会受到众多商家的青睐。现如今市场上的人力资源价格是非常高昂的&#xff0c;一款自主点餐系统可以减少餐厅的人力开销&#xff0c;将服务员从繁忙的…

RESTful接口规范参考

介绍 REST&#xff08;Representational State Transfe&#xff09;&#xff0c;一种架构设计风格&#xff0c;而不是强制标准&#xff0c;主要用于客户端与服务端接口规范&#xff1b;在现代的软件开发中&#xff0c;RESTful API已经成为应用程序之间通信的重要桥梁&#xff…

电磁兼容EMC:单、双面板的均匀传输线

目录 1 传输线 2 均匀传输线 3 特征阻抗 4 应用案例 为何要讲单、双面板的均匀传输线&#xff1f;因为均匀传输线能保证信号质量&#xff0c;减少EMC问题&#xff0c;而单双面板没有完整的地和电源平面&#xff0c;很难实现均匀传输线的布线&#xff0c;所以更需要知道如何在…