Dockerfile命令及实践构建一个网站
dockerfile用于构建docker镜像的,部署一个用于运行你所需的容器环境。相当一个脚本,通过dockerfile自己的指令,来构建软件依赖、文件依赖、存储、
定制docker镜像的方式有两种:
手动修改容器内容,导出新的镜像
基于Dockerfile自行编写指令,基于指令流程创建镜像。
dockerfile简介
镜像都是多层存储的,每一层在前一层的基础上进行修改:
容器也是多层存储,以镜像为基础层,在其基础上加一层做为容器运行时的存储层。
镜像的创建有两种方式:
1、手动修改容器内容,然后docker commit提交容器为新的镜像
2、通过在dockerfile中定义一系列的命令和参数构成的脚本,然后这些命令应用于基础镜像,依次添加层,最终生成一个新的镜像,极大的简化了部署工作。
dockerfile主要组成部分:
基础镜像信息FROM centos:6.8
制作镜像操作指令RUN yum install openssh-server -y
容器启动时执行指令 CMD ["/bin/bash"]
举例:
安装一个mysql,且启动
如果是虚拟机部署形式的话,如下
开启vmare
运行某一个虚拟机,centos7
centos7 安装mysql ,yum install mysql-server
通过脚本,或者命令,启动mysql即可
部署缓慢,且修改了宿主机的环境,删除较为麻烦,占用宿主机的3306端口
下面是基于容器运行mysql
开始vmware
运行虚拟机centos7
安装docker容器软件
获取mysql镜像即可,docker pull mysql:tag(你无法自由控制,该mysql的镜像是什么发行版,你获取的镜像,是别人定制好的,你下载使用的,你希望得到一个基于centos7.8的发行版,运行mysql)
直接运行该镜像,通过端口映射,运行mysql,docker run mysql:5.6 (容器能够运行,必须在容器内,有一个进程在前台运行,该容器内,有mysql正在前台运行)。
访问宿主机的一个映射端口,访问到容器内的mysql
想自定义镜像,就得自己写脚本,也就是dockerfile
dockerfile指令
FROM 这个镜像的妈妈是谁?
MAINTAINER(指定维护者信息,可以没有)
RUN你想让它干啥(在命令前面加上RUN即可)
ADD添加宿主机的文件到容器内,还多了个自动解压的功能。
COPY 作用和ADD是一样的,都是拷贝宿主机的文件到容器内
WORKDIR (设置当前工作目录)
VOLUME 设置卷,挂在主机目录
EXPOSE 指定对外的端口,在容器内暴露一个端口
CMD,指定容器启动后的要干的事情
dockerfile实践
需求,通过dockerfile,构建nginx镜像,且运行容器后,生成的页面是,“测试”。
创建Dockerfile,注意文件名,必须是这个cat Dockerfile
FROM nginx
RUN echo '<meta charset=utf8>测试大佬' >
/usr/share/nginx/html/index.html
2、构建Dockerfile
docker build .
3、修改镜像名字
docker tag b4200a856253 my_nginx
4、运行该镜像
docker run -d -p 80:80 my_nginx
5、查看宿主机的80端口
http://10.10.10.10:80
COPY指令
copy指令从宿主机复制文件/目录到新的一层镜像内如
copy test.py /home/
支持多个文件,以及通配符形式复制,语法要满足Golang的filepath.Match
copy test* /tmp/cc?.txt. /home/
COPY指令能够保留源文件的元数据,如权限,访问时间等等。
ADD
特性和COPY基本一致,不过多些功能
源文件是一个url,此时docker引擎会下载该链接,放入目标路径,且权限自动设为600,若这不是期望结果,还得增加一层
源文件是一个url,且是一个压缩包,不会自动解压,也得是单独用RUN指令解压
源文件是一个压缩文件,且是gzip、bzip2、,ADD指令会自动解压缩文件到目标路径。
Dockerfile 官方推荐使用COPY,ADD会使构建缓存失效,导致镜像构建失败缓慢。
CMD在容器内运行某个命令,启动
用法,注意是双引号
CMD["参数1","参数2"]
在制定了entrypoint指令后,用CMD指令具体的参数
docker 不是虚拟机,容器就是一个进程,既然是进程那么程序在启动的时候需要制定运行参数,这就是CMD指令作用。
例如centos 镜像默认的CMD是/bin/bash,直接docker run -it centos 会直接进入bash解释器。
也可以启动容器时候,指定参数,docker run -it centos cat /etc/os-releasea
CMD运行shell 命令,也会被转化为shell形式
例如
CMD echo $PATH
会被转化为
CMD ["sh", "-c","echo "]
容器内运行程序
这里需要注意,docker不是虚拟机的概念,虚拟机里的程序运行,基本上都是在后台运行,利用systemctl 运行,但是容器内没有后台进程的概念,必须前台运行。
容器就是为了主进程而存在的,主进程如果退出了,容器也就失去意义了,自动退出。
CMD systemctl start nginx
这种写法是错误的,容器会自动退出
因为 systemctl star nginx 是希望以守护进程形式启动nginx,且CMD命令会转化为
CMD ["sh","-c","systemctl start nginx"]
这样的命令主进程是sh解释器,执行完毕后立即结束了,因此容器也就退出了
因此正确的写法是CMD ["nginx","-g","daemon off;"]
ENTRYPOINT 和 CMD的区别及用法
ENTRYPOINT 和CMD的区别及用法
ENV和ARG都是给容器设置环境变量
区别在于ENV无论是在镜像构建时,还是容器运行时,该变量都可以使用
ARG只是用于构建镜像需要设置的变量,容器运行时就消失了。
VOLUME
容器再运行时,应该保证在存储层不写入任何数据,运行在容器内产生的数据,我们推荐是挂载,写入到宿主机上,进行维护。
VOLUME /data #将容器内的/data文件夹,在容器运行时,该目录自动挂载为匿名卷,任何向该目录中写入数据的操作,都不会被容器记录,保证的容器存储层无状态理念。
EXPOSE ,制定容器运行时对外提供的端口服务,
帮助使用该镜像的人,快速理解该容器的一个端口业务,
docker port 容器
docker run -p 宿主机端口:容器端口
docker run -p #作用是随机宿主机端口:容器内端口
WORKDIR
用于在dockerfile中,目录的切换,更改工作目录,
WORKDIR /opt
USER
用于改变环境,用于切换用户
USER root
USER test
构建一个网站镜像
nginx,修改首页内容,html
web framework ,web框架,一般由开发,通过某个开发语音,基于某个web框架,自己去开发一个web站点,python、django框架。
本次实践:
用python语言,基于flask web框架,开发一个网站,写一个后端的 网站代码
开发dockerfile,部署该代码,生成镜像
其他人基于该镜像,docker run就可以在电脑跑起来你这个网站
比如安装一个etcd、nacos,都是比较复杂的一些软件
需要依赖于go语言环境,比如需要依赖于java环境,在自己的机器安装好对应的开发环境,以及对应的版本,以及个各种依赖。
tomcat、jdk环境
当有了docker
docker pull nacos 打包好了各种依赖环境
docker pull tomcat 这些主流的镜像都可以直接找到,并且该镜像中,就已经打包好了Java环境
docker run tomcat xxxx 可以直接访问tomcat了
在宿主机上准备一个目录,准备好dockerfile
写一个flask 的python代码
创建好代码文件
编写dockerfile
touch Dockerfile
FROM centos:7.8.2003
RUN curl -o /etc/ ;
RUN curl -o /etc/ ;
RUN yum makecache fast;
RUN yum install python3-devel python3-pip -y
RUN pip install flask
COPY test_flask.py /opt
WORKDIR /opt
EXPOSE 8080
CMD ["python","app.py"]
检查代码环境,及内容
代码文件 和 Dockerfile 在平级目录中
构建镜像
生成一个镜像
docker build -t 'test/my_flask' .
然后执行dockerfile里的命令
docker build --no-cache -t ‘test/my_flask’.
运行镜像,生成容器, -d 后台运行 --name 容器的名字 -p宿主机的90端口访问到容器内地8080
docker run -d my_flask -p 90:8080 test/my_flask
访问宿主机,看容器内flask web网站
如何修改该网站的内容
第一种修改宿主机的代码,以及dockerfile,重新构建
第二种可以进入到以及运行的容器内,修改代码,重启容器即可。
(1)进入容器
docker exec -it 容器id bash
(2)修改容器内的程序
cat test_flask.py
(3)退出容器,重启容器
exit
docker restart 容器id
相关文章:
Dockerfile命令及实践构建一个网站
dockerfile用于构建docker镜像的,部署一个用于运行你所需的容器环境。相当一个脚本,通过dockerfile自己的指令,来构建软件依赖、文件依赖、存储、定制docker镜像的方式有两种:手动修改容器内容,导出新的镜像基于Docker…...

[VMware]Ubuntu18.04 网络图标消失
Ubuntu 18.04 网络图标消失运行环境问题解决NO.1 执行 sudo systemctl stop network-managerNO.2 执行 sudo rm /var/lib/NetworkManager/NetworkManager.stateNO.3 执行 sudo systemctl start network-managerNO.4 vi /etc/NetworkManager/NetworkManager.confNO.5 执行 sudo …...
国产C2000,P2P替代TMS320F280049C,独立双核32位CPU,主频高达400MHz
一、特性参数 1、独立双核,32位CPU,单核主频400MHz 2、IEEE 754 单精度浮点单元 (FPU) 3、三角函数单元 (TMU) 4、1MB 的 FLASH (ECC保护) 5、1MB 的 SRAM (ECC保护&…...

二十五、Gtk4-多线程分析
1 回顾 1.1 Gnome相关 首先回顾一下GLib,GObject,GIO,Gtk的不同,因为下面会涉及到这些概念里面的函数。 所有这些都是由Gnome项目开发的库,一般都用于Gnome环境相关的应用程序。 Gtk:GUI界面库。GLib&a…...

JVM基础学习
JVM分为两个子系统,两个组件一个子系统是Class loader类装载系统,另一个子系统是Execution Engine执行引擎一个组件是Runtime data area 运行时数据区,Native Interface 本地接口Class loader:根据给定的全限定类名来装载class文件到运行时数…...

ASML逆袭史:人、资金、技术,缺一不可
前言 近年来,由于众所周知的原因,荷兰ASML(阿斯麦)公司的先进半导体制造设备——光刻机,进入普通大众视野,成为人们茶余饭后谈论的焦点话题之一。 1月底,“美日荷三方谈判达成协议,可…...

MongoDB 覆盖索引查询
MongoDB 覆盖索引查询 官方的MongoDB的文档中对覆盖查询做了说明: 所有的查询字段是索引的一部分所有的查询返回字段在同一个索引中 由于所有出现在查询中的字段是索引的一部分, MongoDB 无需在整个数据文档中检索匹配查询条件和返回使用相同索引的查询…...

Flink Checkpoint 中的Aligned Checkpoint 和 Unaligned Checkpoint
文章目录知识点反压CheckpointBarrierAligned CheckpointUnaligned Checkpoint核心思想实现原理UC同步阶段UC异步阶段知识点 反压 反压是流式系统中关于处理能力的动态反馈机制,并且是从下游到上游的反馈,一般是在实时数据处理的过程中,上游…...

C++快速入门
本章内容我将结合C语言一起,初步学习了解c,与大家一起快速入门这门语言。当然鉴于c本身属于一门中级语言,大家对编程有一定了解之后来学习这门知识会更加得心应手。简介C 被认为是一种中级语言,它综合了高级语言和低级语言的特点。…...
ubuntu18.04 network有线网络图标缺失解决记录
先按照博客1安装驱动 博客1链接:Ubuntu安装 Realtek R8125 驱动_Lwang2018的博客-CSDN博客_瑞昱8125 for ubunt 安装完成后,遇到问题:ifconfig -a显示的有线网接口(名字以en开头)没有ip地址…...

java对象克隆和面向对象的设计原则
java进阶注解内置注解元注解自定义注解对象克隆浅克隆深克隆java设计模式建模语言类之间的关系依赖关系关联关系单向关联双向关联自关联聚合关系组合关系继承关系实现关系面向对象设计原则单一职责开闭原则里氏替换原则依赖倒置接口隔离迪米特原则组合/聚合复用原则注解 java注…...
传透式血氧仪设计方案
该方案一种检测方式是选择使用光敏二极管接收光信号,采用传统穿透式夹指测量;另一种是使用光谱传感器接收光信号,采用反射式测量。该传感器可将光信号直接转换成数据信息给主控端进行处理,从而节省了用户将光信号转换成模拟信号&a…...

让逆向工程师们头疼的代码混淆,就像永远也走不出的“浪浪山”
目录 代码混淆究竟是什么? 如何做代码混淆? 代码混淆不等于加密 App 加固非一时之功 “我想离开浪浪山。” 在数次尝试破解某个App 时,某个逆向工程师无奈感慨道。 逆向工程师顾名思义就是把一个个完整的软件逆推,还原成一段段…...
【拓展】基于机器学习的心脏病预测方法(14)——心脏病数据集补充
目录 前言1、数据集11.1 数据集介绍1.2 数据集属性2、数据集22.1 数据集介绍2.2 数据集属性3、数据集33.1 数据集介绍3.2 数据集属性4、下载地址前言 在实际研究过程中,前文所述数据集由于尺寸过小(仅有303份数据和13个属性信息)或数据集单一(仅有一个数据集,不具备普适性…...

深度解读Webpack中的loader原理
一、前言 webpack 是一个现代 JavaScript 应用的静态模块打包器。那么 webpack 是怎样实现不同种类资源模块加载的呢? 没错就是通过 loader。loader 用于对模块的源代码进行转换。loader 可以使你在 import 或加载模块时预处理文件。 我们带着下面几个问题&#…...
2023年全国最新二级建造师精选真题及答案
百分百题库提供二级建造师考试试题、二建考试预测题、二级建造师考试真题、二建证考试题库等,提供在线做题刷题,在线模拟考试,助你考试轻松过关。 一、单选题 1.关于法人在建设工程中的地位的说法,正确的是(࿰…...

为什么现代企业发展离不开CRM系统的助力
如今的CRM系统对于任何企业来说都重要,因为它能帮助企业收获新客户,保留现有客户,并且将不同部门的信息全部汇集,实时提供关于每位客户整体全面的看法。因此,销售、市场营销和客户支持等领域的客户直接服务员工能够做出…...
vb.net计算之.net core基础(1)-获取农历和天气
目录 .net core 简介创建hello,world应用程序获取天气和农历.net core 简介 .NET Core是适用于 Windows、Linux 和 macOS 的免费、开源托管的计算机软件框架。 它是微软开发的第一个官方版本,具有跨平台能力的应用程序开发框架 (Application Framework),未来也将会支持 Free…...

设计模式之代理模式详解和应用
目录1 代理模式定义2 代理模式的应用场景3 代理模式的通用写法4 从静态代理到动态代理5 静态模式在业务中的应用6 动态代理在业务中的应用7 手写JDK动态代理实现原理7.1 JDK动态代理的实现原理7.2 CGLib动态代理容易踩的坑8 CGLib代理调用API及原理分析9 CGLib和JDK动态代理对比…...
JavaScript HTML DOM 节点列表
HTML DOM 是一种文档对象模型,它允许开发人员使用 JavaScript 来访问和修改网页的内容和结构。节点列表是 HTML DOM 中一个重要的概念,它允许开发人员以编程方式访问和操作文档中的节点元素。 在本文中,我们将探讨 JavaScript HTML DOM 节点…...

Opencv中的addweighted函数
一.addweighted函数作用 addweighted()是OpenCV库中用于图像处理的函数,主要功能是将两个输入图像(尺寸和类型相同)按照指定的权重进行加权叠加(图像融合),并添加一个标量值&#x…...
vue3 字体颜色设置的多种方式
在Vue 3中设置字体颜色可以通过多种方式实现,这取决于你是想在组件内部直接设置,还是在CSS/SCSS/LESS等样式文件中定义。以下是几种常见的方法: 1. 内联样式 你可以直接在模板中使用style绑定来设置字体颜色。 <template><div :s…...

视频字幕质量评估的大规模细粒度基准
大家读完觉得有帮助记得关注和点赞!!! 摘要 视频字幕在文本到视频生成任务中起着至关重要的作用,因为它们的质量直接影响所生成视频的语义连贯性和视觉保真度。尽管大型视觉-语言模型(VLMs)在字幕生成方面…...

涂鸦T5AI手搓语音、emoji、otto机器人从入门到实战
“🤖手搓TuyaAI语音指令 😍秒变表情包大师,让萌系Otto机器人🔥玩出智能新花样!开整!” 🤖 Otto机器人 → 直接点明主体 手搓TuyaAI语音 → 强调 自主编程/自定义 语音控制(TuyaAI…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...

推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材)
推荐 github 项目:GeminiImageApp(图片生成方向,可以做一定的素材) 这个项目能干嘛? 使用 gemini 2.0 的 api 和 google 其他的 api 来做衍生处理 简化和优化了文生图和图生图的行为(我的最主要) 并且有一些目标检测和切割(我用不到) 视频和 imagefx 因为没 a…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !
我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

自然语言处理——文本分类
文本分类 传统机器学习方法文本表示向量空间模型 特征选择文档频率互信息信息增益(IG) 分类器设计贝叶斯理论:线性判别函数 文本分类性能评估P-R曲线ROC曲线 将文本文档或句子分类为预定义的类或类别, 有单标签多类别文本分类和多…...
书籍“之“字形打印矩阵(8)0609
题目 给定一个矩阵matrix,按照"之"字形的方式打印这个矩阵,例如: 1 2 3 4 5 6 7 8 9 10 11 12 ”之“字形打印的结果为:1,…...
Java详解LeetCode 热题 100(26):LeetCode 142. 环形链表 II(Linked List Cycle II)详解
文章目录 1. 题目描述1.1 链表节点定义 2. 理解题目2.1 问题可视化2.2 核心挑战 3. 解法一:HashSet 标记访问法3.1 算法思路3.2 Java代码实现3.3 详细执行过程演示3.4 执行结果示例3.5 复杂度分析3.6 优缺点分析 4. 解法二:Floyd 快慢指针法(…...