DockerFile文件解析

DockerFile

要研究自己如何做一个镜像,而且微服务项目打包上云部署,Docker就是最方便的。

微服务打包成镜像,任何装了Docker的地方,都可以下载使用,极其的方便。

流程:开发应用=>DockerFile=>打包为镜像=>上传到仓库(私有仓库公司内部的 aliyun,公有仓库dockerhub)=> 下载镜像 => 启动运行

还可以方便移植!

什么是DockerFile

dockerfile是用来构建Docker镜像的构建文件,是由一系列命令和参数构成的脚本。

-controller
-poji
-xxx
-xxx-Dockerfile (必备)

构建步骤:

1、编写DockerFile文件

2、docker build 构建镜像

3、docker run

dockerfile文件我们刚才已经编写过了一次,这里我们继续使用 centos 来看!

地址:https://hub.docker.com/_/centos

在这里插入图片描述

在这里插入图片描述

DockerFile构建过程

基础知识:

1、每条保留字指令都必须为大写字母且后面要跟随至少一个参数

2、指令按照从上到下,顺序执行

3、# 表示注释

4、每条指令都会创建一个新的镜像层,并对镜像进行提交

流程:

1、docker从基础镜像运行一个容器

2、执行一条指令并对容器做出修改

3、执行类似 docker commit 的操作提交一个新的镜像层

4、Docker再基于刚提交的镜像运行一个新容器

5、执行dockerfile中的下一条指令直到所有指令都执行完成!

说明:

从应用软件的角度来看,DockerFile,docker镜像与docker容器分别代表软件的三个不同阶段。

  • DockerFile 是软件的原材料 (代码)
  • Docker 镜像则是软件的交付品 (.apk)
  • Docker 容器则是软件的运行状态 (客户下载安装执行)

DockerFile 面向开发,Docker镜像成为交付标准,Docker容器则涉及部署与运维,三者缺一不可!

在这里插入图片描述

DockerFile:需要定义一个DockerFile,DockerFile定义了进程需要的一切东西。DockerFile涉及的内容包括执行代码或者是文件、环境变量、依赖包、运行时环境、动态链接库、操作系统的发行版、服务进程和内核进程(当引用进行需要和系统服务和内核进程打交道,这时需要考虑如何设计 namespace的权限控制)等等。

Docker镜像:在DockerFile 定义了一个文件之后,Docker build 时会产生一个Docker镜像,当运行 Docker 镜像时,会真正开始提供服务;

Docker容器:容器是直接提供服务的。

DockerFile指令

关键字:

FROM         # 基础镜像,当前新镜像是基于哪个镜像的
MAINTAINER   # 镜像维护者的姓名混合邮箱地址
RUN          # 容器构建时需要运行的命令
EXPOSE       # 当前容器对外保留出的端口
WORKDIR      # 指定在创建容器后,终端默认登录的进来工作目录,一个落脚点
ENV          # 用来在构建镜像过程中设置环境变量
ADD          # 将宿主机目录下的文件拷贝进镜像且ADD命令会自动处理URL和解压tar压缩包
COPY         # 类似ADD,拷贝文件和目录到镜像中!
VOLUME       # 容器数据卷,用于数据保存和持久化工作
CMD          # 指定一个容器启动时要运行的命令,dockerFile中可以有多个CMD指令,但只有最后一个生效!
ENTRYPOINT   # 指定一个容器启动时要运行的命令!和CMD一样
ONBUILD      # 当构建一个被继承的DockerFile时运行命令,父镜像在被子镜像继承后,父镜像的ONBUILD被触发

在这里插入图片描述

实践

Docker Hub 中99% 的镜像都是通过在base镜像(Scratch)中安装和配置需要的软件构建出来的

Scratch镜像很赞,它简洁、小巧而且快速,它没有bug、安全漏洞、延缓的代码或技术债务。除了被Docker添加了metadata之外,它基本上是空的。

我们在使用Dockerfile构建docker镜像时,一种方式是使用官方预先配置好的容器镜像。优点是我们不用从头开始构建,节省了很多工作量,但付出的代价是需要下载很大的镜像包。

如果我们的需求是在构建一个符合我们实际业务需求的Docker镜像的前提下,确保镜像尺寸尽可能的小,应该怎么做呢?

思路是使用空镜像scratch,可以说是真正的从零开始构建属于自己的镜像,镜像的第一层

在这里插入图片描述

发行一个自己的centos

# 阿里云官方的centos是不完整的,很多命令没有。自定义一个镜像,vim 、ifconfig
# vim dockerfileFROM centos
MAINTAINER kuangshen<24736743@qq.com>ENV MYPATH /usr/local
WORKDIR $MYPATH# centos 8 镜像源更新
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*RUN yum makecache
RUN yum update -y# 在基础的centos上安装vim、net-toolsRUN yum -y install vim
RUN yum -y install net-toolsEXPOSE 80CMD echo $MYPATH
CMD echo "------end------"
CMD /bin/bash# 构建我们自己的镜像 
-f 指定dockerfile文件
-t 输出的镜像文件名:版本号
.
[root@kuangshenlinux ~]# docker build -f dockerfile-mycentos -t mycentos:1.0 .

centos8 , https://developer.aliyun.com/article/1165954

在这里插入图片描述

docker history 查看镜像的变更历史

如果你下载了一个镜像,报错了或者你想查看一些构建逻辑,使用docker history

思路

项目中编写Docker

1、基于一个空的镜像

2、下载需要的环境 ADD

3、执行环境变量的配置 ENV

4、执行一些Linux命令 RUN

5、日志 CMD

6、端口暴露 EXPOSE

7、挂载数据卷 VOLUMES

这个过程就是你手动部署项目的过程,你通过docker可以再未来实现自动化构建。

CMD VS ENTRYPOINT

我们之前说过,两个命令都是指定一个容器启动时要运行的命令

这里的有效,值得是我们容器运行起来之后的参数有效。

**CMD:**Dockerfile 中可以有多个CMD 指令,但只有最后一个生效,CMD 会被 docker run 之后的参数替换!

ENTRYPOINT: docker run 之后的参数会被当做参数传递给 ENTRYPOINT,之后形成新的命令组合!

# vim cmd 的 dockerfileFROM centos
# docker run执行以后,你想要添加新命令参数,无法直接添加,而是需要编写完整的命令,CMD的使用
CMD ["ls","-a"]# 测试
[root@kuangshenlinux ~]# docker run 7d ls -al
total 0
drwxr-xr-x   1 root root   6 Dec 10 12:42 .
drwxr-xr-x   1 root root   6 Dec 10 12:42 ..
-rwxr-xr-x   1 root root   0 Dec 10 12:42 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root 340 Dec 10 12:42 dev
drwxr-xr-x   1 root root  66 Dec 10 12:42 etc
drwxr-xr-x   2 root root   6 Nov  3  2020 home
lrwxrwxrwx   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root   6 Sep 15  2021 lost+found
drwxr-xr-x   2 root root   6 Nov  3  2020 media
drwxr-xr-x   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x 145 root root   0 Dec 10 12:42 proc
dr-xr-x---   2 root root 162 Sep 15  2021 root
drwxr-xr-x  11 root root 163 Sep 15  2021 run
lrwxrwxrwx   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x  13 root root   0 Dec 10 12:42 sys
drwxrwxrwt   7 root root 171 Sep 15  2021 tmp
drwxr-xr-x  12 root root 144 Sep 15  2021 usr
drwxr-xr-x  20 root root 262 Sep 15  2021 var

在这里插入图片描述


FROM centos
# docker run传递参数的时候,拼接到 ENTRYPOINT 指令中,不传就是执行默认的
ENTRYPOINT ["ls","-a"][root@kuangshenlinux ~]# docker run entrycentos -l
total 0
drwxr-xr-x   1 root root   6 Dec 10 12:46 .
drwxr-xr-x   1 root root   6 Dec 10 12:46 ..
-rwxr-xr-x   1 root root   0 Dec 10 12:46 .dockerenv
lrwxrwxrwx   1 root root   7 Nov  3  2020 bin -> usr/bin
drwxr-xr-x   5 root root 340 Dec 10 12:46 dev
drwxr-xr-x   1 root root  66 Dec 10 12:46 etc
drwxr-xr-x   2 root root   6 Nov  3  2020 home
lrwxrwxrwx   1 root root   7 Nov  3  2020 lib -> usr/lib
lrwxrwxrwx   1 root root   9 Nov  3  2020 lib64 -> usr/lib64
drwx------   2 root root   6 Sep 15  2021 lost+found
drwxr-xr-x   2 root root   6 Nov  3  2020 media
drwxr-xr-x   2 root root   6 Nov  3  2020 mnt
drwxr-xr-x   2 root root   6 Nov  3  2020 opt
dr-xr-xr-x 144 root root   0 Dec 10 12:46 proc
dr-xr-x---   2 root root 162 Sep 15  2021 root
drwxr-xr-x  11 root root 163 Sep 15  2021 run
lrwxrwxrwx   1 root root   8 Nov  3  2020 sbin -> usr/sbin
drwxr-xr-x   2 root root   6 Nov  3  2020 srv
dr-xr-xr-x  13 root root   0 Dec 10 12:42 sys
drwxrwxrwt   7 root root 171 Sep 15  2021 tmp
drwxr-xr-x  12 root root 144 Sep 15  2021 usr
drwxr-xr-x  20 root root 262 Sep 15  2021 var

自定义一个Tomcat

一般一个项目都在一个文件夹中,我们只需要在项目目录下 编辑一个Dockerfile 文件即可

build 不需要在-f来指定,默认寻找项目目录下的 Dockerfile 来构建镜像

!在这里插入图片描述

FROM centos
MAINTAINER kuangshen<24736743@qq.com># 步骤
# 宿主机目录下文件 拷贝到容器内
COPY readme.txt /usr/local/container-readme.txt# 添加我们自己的安装包
ADD jdk-8u11-linux-x64.tar.gz /usr/local
ADD apache-tomcat-9.0.22.tar.gz /usr/local# 安装yum / vim 配置环境变量# centos 8 配置
RUN cd /etc/yum.repos.d/
RUN sed -i 's/mirrorlist/#mirrorlist/g' /etc/yum.repos.d/CentOS-*
RUN sed -i 's|#baseurl=http://mirror.centos.org|baseurl=http://vault.centos.org|g' /etc/yum.repos.d/CentOS-*
RUN yum makecache
RUN yum update -y#安装vim编辑器
RUN yum -y install vim# 配置工作目录
ENV MYPATH /usr/local
WORKDIR $MYPATH# 配置环境变量
ENV JAVA_HOME /usr/local/jdk1.8.0_11
ENV CLASSPATH $JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
ENV CATALINA_HOME /usr/local/apache-tomcat-9.0.22
ENV CATALINA_BASE /usr/local/apache-tomcat-9.0.22
ENV PATH $PATH:$JAVA_HOME/bin:$CATALINA_HOME/lib:$CATALINA_HOME/bin# 
EXPOSE 8080# 启动的时候自动运行tomcat
CMD /usr/local/apache-tomcat-9.0.22/bin/startup.sh && tail -F /usr/local/apache-tomcat-9.0.22/bin/logs/catalina.out

启动

[root@kuangshenlinux kuangshentomcat]# docker run -d -p 9090:8080 --name kuangshentomcat \
> -v /root/mytomcat/test:/usr/local/apache-tomcat-9.0.22/webapps/test \
> -v /root/mytomcat/logs:/usr/local/apache-tomcat-9.0.22/logs \
> --privileged=true \
> tomcatnew

在我们自定义的tomcat服务器中上传一个项目,在本地挂载目录,丢一个项目上去。

发布镜像

公有仓库:DockerHub

注册dockerhub https://hub.docker.com/signup,需要有一个账号

# docker login 默认登录是 Docker Hub 仓库
[root@kuangshenlinux ~]# docker login --helpUsage:  docker login [OPTIONS] [SERVER]Log in to a registry.
If no server is specified, the default is defined by the daemon.Options:-p, --password string   Password--password-stdin    Take the password from stdin-u, --username string   Username[root@kuangshenlinux ~]# docker login -u kuangshen
Password: 
WARNING! Your password will be stored unencrypted in /root/.docker/config.json.
Configure a credential helper to remove this warning. See
https://docs.docker.com/engine/reference/commandline/login/#credentials-storeLogin Succeeded# 上传镜像需要打标签
docker tag 0a5262a16c83 kuangshen/tomcatnew:1.0# 上传推送到Dockerhub
[root@kuangshenlinux ~]# docker push kuangshen/tomcatnew:1.0
The push refers to repository [docker.io/kuangshen/tomcatnew]
5f70bf18a086: Pushed 
7e35af64d506: Pushed 
1da1d8285a23: Pushed 
cebec5506465: Pushed 
15a3304b2547: Pushed 
6a4a6f0a44c5: Pushed 
8b070a512c7d: Pushed 
06f964bcf5f7: Pushed 
7d33883ba73a: Pushed 
74ddd0ec08fa: Mounted from library/centos 

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

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

相关文章

负载均衡-轮询-两种简易实现

1、描述 下游可用的服务器目前有5个&#xff08;node&#xff09;&#xff0c;设计一个方法&#xff0c;方法没有任何参数&#xff0c;采用轮询的方式返回其中一个node&#xff1b; 2、使用环形链表 每次取下一个node即可。注意&#xff1a;需要保证线程安全&#xff01; // …

安泰高压功率放大器主要应用场景有哪些

高压功率放大器是一种专门设计用于处理高电压信号并提供大功率输出的设备。它们在各种领域中发挥着重要作用&#xff0c;以下是它们的主要应用场景和特点。 一、医疗设备 医疗成像&#xff1a;高压功率放大器在医疗成像设备中扮演关键角色&#xff0c;例如X射线设备和CT扫描仪。…

【启明智显分享】乐鑫HMI方案4.3寸触摸串口屏应用于称重测力控制仪表

称重测力控制仪表是将称重传感器信号&#xff08;或再通过重量变送器&#xff09;转换为重量数字显示&#xff0c;并可对重量数据进行传输、储存、统计、打印的电子设备&#xff0c;常用于工农业生产中的自动化配料&#xff0c;称重&#xff0c;以提高生产效率。随着工业化的发…

TC4056A 1A线性锂离子电池充电器芯片IC

产品描述 TC4056A是一款完整的单节锂离子电池采用恒定电流/恒定电压线性充电器。其底部带有散热片的ESOP8/DIP8封装与较少的外部元件数目使得TC4056A成为便携式应用的理想选择TC4056A可以适合USB电源和适配器电源工作。 由于采用了内部PMOSFET架构&#xff0c;加…

《ElementUI/Plus 基础知识》el-tree 之修改可拖拽节点的高亮背景和线

前言 收到需求&#xff0c;PM 觉得可拖拽节点的高亮背景和线样式不明显&#xff01;CSS 样式得改&#xff01; 注意&#xff1a;下述方式适用于ElementUI el-tree 和 ElementPlus el-tree&#xff01; 修改 拖拽被叠加节点的背景色和文字 关键类名 is-drop-inner .el-tree…

Day02-ES集群常见术语,索引管理,文档管理,IK分词器,数据类型映射及kibana环境安装

Day02-ES集群常见术语&#xff0c;索引管理&#xff0c;文档管理&#xff0c;IK分词器&#xff0c;数据类型映射及kibana环境安装 1、昨日内容回顾2、今日内容预告3、ES的常见术语4、索引管理4.1 查看索引4.2 创建索引4.3 修改索引4.4 删除索引4.5 索引别名4.6 关闭索引4.7 打开…

FakeNewsGPT4:通过知识增强的大规模视觉语言模型推进多模态假新闻检测

FakeNewsGPT4: Advancing Multimodal Fake News Detection through Knowledge-Augmented LVLMs 1.概述 当前,多模态假新闻的大量涌现导致了显著的分布差异,这一现状亟需我们开发具备广泛适用性的检测器。然而,现有假新闻检测器因特定领域内的训练方式,难以有效获取开放世…

<数据集>Udacity交通目标识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;13239张&#xff08;实际有15000张&#xff0c;但其中1761张无标签的图片被我去除掉&#xff09; 标注数量(xml文件个数)&#xff1a;13239 标注数量(txt文件个数)&#xff1a;13239 标注类别数&#xff1a;11 标注…

护网--1

实验要求&#xff1a; 实现过程&#xff1a; &#xff08;一&#xff09;配置防火墙接口&#xff1a; 在防火墙上创建两个子接口&#xff1a;1/0/1.1 1/0/1.2 在浏览器上用视图界面配置接口&#xff1a; 到服务器&#xff1a; 到生产区&#xff1a; 到办公区&#xff1a; 到…

离线下载linux mysql和mysql基本库

下载地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 选择数据库版本&#xff0c;系统&#xff0c;系统版本信息 下载需要的rpm包&#xff0c;传入服务器&#xff0c;使用yum install xxx.rpm安装即可 mysql-community下载地址 https://dev.mysql.com/downloads/my…

专业无线麦克风品牌排行榜,无线麦克风哪个品牌音质最好

在数字化的浪潮中&#xff0c;个人创作与表达的舞台日益宽广。无论是专业的影像工匠、热情四溢的播客主播&#xff0c;亦或是生活点滴的记录者——Vlogger&#xff0c;一套卓越的音频装备是确保声音纯净、无瑕传递给观众的基石。无线领夹麦克风凭借其携带方便、操作简便以及卓越…

ai写作软件哪个好?亲测好用的5款工具分享

一眨眼&#xff0c;初伏就要到来了~办公室内的高温仿佛连空气都凝固了&#xff0c;键盘敲击声似乎都变得沉重而迟缓。在这样的天气下&#xff0c;创意与灵感似乎也躲进了阴凉处&#xff0c;办公效率显然大打折扣。 幸运的是&#xff0c;被我找到了新的应对之策&#xff0c;那便…

FastAPI 学习之路(四十七)WebSockets(三)登录后才可以聊天

之前我们是通过前端自动生成的token信息&#xff0c;这次我们通过注册登录&#xff0c;保存到本地去实现。首先&#xff0c;我们实现一个登录页面&#xff0c;放在templates目录下。 <!DOCTYPE html> <html lang"en"> <head><meta charset&quo…

PHP单商户微店b2c商城微信小程序系统源码

打造专属线上购物空间&#x1f6cd;️ &#x1f680;【开篇&#xff1a;解锁新零售时代新风尚】&#x1f680; 在这个数字化飞速发展的时代&#xff0c;线上购物已成为我们日常生活不可或缺的一部分。对于单商户而言&#xff0c;拥有一个专属的B2C商城微信小程序&#xff0c;…

非堆成加密SM2算法java实现

基于SM2算法的Java示例代码&#xff0c;展示了如何进行公钥加密、私钥解密、私钥签名和公钥验签。 非堆成加密公私钥使用学习请查看&#xff1a;非堆成加密公私钥使用-CSDN博客 RSA算法&#xff1a;非堆成加密RSA算法java实现-CSDN博客 代码示例 展示了以下步骤&#xff1a…

Centos7 yum 报错「Errno 256」No more mirrors to try 解决方法

解决方案大致有三种 一、更新yum 二、若不行&#xff0c;可能是因为DNS不稳定吧&#xff0c;因为yum安装时会从三个”repo源“&#xff08;base&#xff0c;extras&#xff0c;updates&#xff09;随机获取地址 三、分析总结法 背景 我使用yum方式安装软件时&#xff0c;比…

如何高效去除论文中的AI痕迹?AI助手在此,为你指点迷津

试试这四款AI论文工具和降重技术&#xff01; 在科研领域&#xff0c;AI写作工具如同新一代的科研利器&#xff0c;它们能够极大提高文献查阅、思路整理和表达优化的效率&#xff0c;本质上促进了科研工作的进步。AI写作工具不仅快速获取并整理海量信息&#xff0c;还帮助我们…

C++心决之stl中那些你不知道的秘密(string篇)

目录 1. 为什么学习string类&#xff1f; 1.1 C语言中的字符串 2. 标准库中的string类 2.1 string类 2.2 string类的常用接口说明 1. string类对象的常见构造 2. string类对象的操作 3.vs和g下string结构的说明 3. string类的模拟实现 3.2 浅拷贝 3.3 深拷贝 3.4 写…

基于springboot的鲜花管理系统

系统文档需要联系&#xff0c;白嫖勿扰

程序员的自我约束炼成记

自我约束&#xff0c;是一个人能否走向成功的关键&#xff0c;不知道你是否同意&#xff1f;搞编程10几年了&#xff0c;从来不觉得有什么了不起的&#xff0c;但可以不断自我更新&#xff0c;学习新技术&#xff0c;自我约束力起了很大的作用&#xff0c;对我而言&#xff0c;…