docker创建镜像 Dockerfile
目录
docker的创建镜像的方式
dockerfile形成(原理)
docker的核心作用
docker的文件结构
dockerfile的语法
CMD和ENTRPOINT的区别
创建dockerfile镜像
区别
RUN命令的优化
如何把run命令写在一块
copy和ADD区别
区别
centos7 构建Apache的dockerfile(编译安装)
页面访问
编辑
centos7 构建nginx的dockerfile(编译安装)
创建镜像,创建自定义的镜像
包括配置文件,挂载点,对外暴露的端口,设置环境变量
docker的创建镜像的方式
1、基于已有的镜像进行创建,根据官方提供的镜像源,创建镜像,然后拉起容器,是一个白版,值能提供基础的功能,
扩展性的功能还是需要自定义(进入容器进行操作)
2、基于模版进行创建
导入镜像到本地
docker import 模版 -- 模版(Ubuntu:14)
3、dockerfile 联合文件系统(unionFS),docker镜像的基础(镜像通过分层来进行集成,特性:一次同时加载多个文件系统,但是从外面来看,就是一个文件系统)
docker镜像世纪上就是由一层一层的文件系统组成,这种层级的文件系统就是unionFS
每层都是layers,每一层都包含文件系统的一部分,这些层次叠加在一起,最终形成的就是rootfs
dockerfile形成(原理)
bootfs 宿主机的引导文件系统,启动操作系统的文件,启动容器需要的最基本的文件,包含宿主机的bootloader和kernel(提供内核)
rootfs 镜像的操作系统,拉取镜像会给镜像自动创建一恶搞操作系统(拉取镜像)
run add 创建容器时的命令
container
从而形成镜像
bootfs 宿主机提供的内核和引导程序
rootfs 就是容器的操作系统,在dockerfile中,我们可以自己指定(是多个基础镜像和应用镜像结合起来的只读层,镜像实际上就死一个只读文件)
容器基于镜像实例,运行起来之后,容器变成可读可写层
在dockerfile当中每创建一个指定都是一个镜像层
镜像层会被缓存和复用
一旦有一层镜像失败那么所有的镜像层都会失败,镜像也不会创建
镜像层是不可变的,你在某一层当中添加一个新的命令,但是下一层删除了指令,镜像中基于这个命令创建的文件依然存在,但是在容器中看不见
docker的核心作用
用户个性化定制docker的镜像
docker的文件结构
1、基础镜像信息
2、维护者信息
3、镜像的操作指令
4、容器启动时,执行的命令(nginx定义好了容器执行的命令,bin/bash,覆盖了容器内的标准输出)
dockerfile的语法
FROM:指定基础镜像信息,指定容器的操作系统
MAINTAINER:指定维护者信息(可有可无)
RUN:在基础的镜像上执行的命令,每个run就是一层,分层越多,镜像越大
ENTRYPOINT:设置容器运行时的默认命令(容器内部运行的主程序)
CMD:指定容器运行时的默认命令(docker run /bin/bash 后面加了其他的命令,CMD的指令将会被覆盖)
EXPOSE:暴漏端口(指定容器的运行端口)
ENV:设置环境变量,环境变量可以被run命令使用(声明容器运行需要的环境变量)
ADD:复制,解压,解压不支持.zip和.rar tar.gz tar.bz2 支持url地址解压和复制(解压)
COPY:复制文件,不能解压,只能复制本地文件,文件要和dockerfile在一个目录(官方推荐复制用copy)
VOLUME:创建一个容器内的挂载点,既可以为宿主机挂载,也可以供容器挂载
USER:设置运行镜像时使用的用户或者UID(可以不加)
WORKDIR:为后续指令设置的工作目录
ONBUILD:这个镜像可以被其他镜像引用,需要这个命令
ARG:传参,用于创建容器时,传递参数,ENV用于容器运行时设置环境变量
CMD和ENTRPOINT的区别
都是可以作为容器启动时的默认命令
创建dockerfile镜像
vim Dockerfile
FROM centos:7
MAINTAINER "this is my docker <xb>"
ENTRYPOINT ["echo","hello"]
CMD ["world"]构建镜像
[root@docker1 test1]# docker build -t centos7:test .
[+] Building 17.0s (5/5) FINISHED docker:default=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 183B 0.0s=> [internal] load metadata for docker.io/library/centos:7 4.5s=> [1/1] FROM docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 12.5s=> => resolve docker.io/library/centos:7@sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 0.0s=> => sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 76.10MB / 76.10MB 8.6s=> => sha256:be65f488b7764ad3638f236b7b515b3678369a5124c47b8d32916d6487418ea4 1.20kB / 1.20kB 0.0s=> => sha256:dead07b4d8ed7e29e98de0f4504d87e8880d4347859d839686a31da35a3b532f 529B / 529B 0.0s=> => sha256:eeb6ee3f44bd0b5103bb561b4c16bcb82328cfe5809ab675bb17ab3a16c517c9 2.75kB / 2.75kB 0.0s=> => extracting sha256:2d473b07cdd5f0912cd6f1a703352c82b512407db6b05b43f2553732b55df3bc 3.8s=> exporting to image 0.0s=> => exporting layers 0.0s=> => writing image sha256:95db50faac27607f675dd62ed2fd7a54e573f28c4b4c6b6b19f8c0718a71c0bc 0.0s=> => naming to docker.io/library/centos7:test 0.0s
创建容器
[root@docker1 test1]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos7 test 95db50faac27 2 years ago 204MB
[root@docker1 test1]# docker run -it --name test1 centos7:test
hello world
[root@docker1 test1]#
区别
1、cmd可以把参数传给ENTRYPOINT
2、多个ENTRYPOINT和多个cmd只会运行最后一个(一个Dockerfile当中只会有一个ENTRYPOINT和CMD)
3、ENTRYPOINT的指令不会被覆盖,CMD的指令如果在docker run的后面加上输出,会被覆盖
4、ENTRYPOINT的指令在容器启动时启动时执行,都会成为容器的主进程,主进程负责接收信号,处理容器的生命周期,主进程退出,容器也将会终止运行
RUN命令的优化
主要是减少镜像的层数:把多个run命令写在一块
如何把run命令写在一块
&& 符号
RUN yum -y install nginx && make -j 4 && make install
前一个命令执行成功才会执行下一个命令; 符号
RUN yum -y install nginx ; make -j 4 ; make install
不管前一个命令是否成功,后面的命令都会执行|| 符号
RUN yum -y install nginx || make -j 4 || make install
如果前面的命令执行失败,才会执行后面的操作反斜杠\ 换行 符号
RUN yum -y install nginx \
&& make j 4\
&& make install
可读性更高
copy和ADD区别
copy和add都可以吧本地文件复制到镜像中,但是官方推荐如果是复制使用copy
区别
add可以解压,如果是一个压缩文件,add在复制之后会自动解压(tar.gz和tar.bz2) 可以支持URL下载源文件,支持下载,但不能解压,通过URL拷贝的文件无法自动解压
copy只能复制,不能解压,而且只能是本地文件,不支持URL路径
centos7 构建Apache的dockerfile(编译安装)
把源码包拖到opt目录下
vim Dockerfile
#创建基础镜像
FROM centos:7
MAITAIENR "this is my apache <dn>"
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt
ADD httpd-2.4.29.tar.bz2 /opt
ADD apr-util-1.6.0.tar.gz /opt
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
cd /opt/httpd-2.4.29 &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 4 && make install
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGROUND"]docker build -t apache:centos .docker run -itd --name httpd1 -p 50:80 apache:centos基于镜像的二次构建
FROM centos:7 AS first
MAITAIENR "this is my apache <dn>"
RUN yum -y install gcc gcc-c++ make pcre pcre-devel expat-devel perl
ADD apr-1.6.2.tar.gz /opt
ADD httpd-2.4.29.tar.bz2 /opt
ADD apr-util-1.6.0.tar.gz /opt
RUN mv /opt/apr-1.6.2 /opt/httpd-2.4.29/srclib/apr && mv /opt/apr-util-1.6.0 /opt/httpd-2.4.29/srclib/apr-util &&\
./configure --prefix=/usr/local/httpd --enable-so --enable-rewrite --enable-charset-lite --enable-cgi &&\
make -j 4 && make install
#二层构建
FROM centos:7
COPY --from=first /usr/local/httpd /usr/local/httpd
RUN yum -y cre pcre-devel expat-devel perl
EXPOSE 80
CMD ["/usr/local/httpd/bin/apachectl","-D","FOREGOUND"]docker build -t apache1:centos .docker run -itd --name httpd1 -p 50:80 apache:centos
页面访问
centos7 构建nginx的dockerfile(编译安装)
把源码包拖到opt/test目录下
vim Dockerfile
FROM centos:7
MAINTAINER "this is nginx <xb>"
ADD nginx-1.22.0.tar.gz /opt/test/
RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel &&\
useradd -M -s /sbin/nologin nginx &&\
cd /opt/test/nginx-1.22.0/ &&\
./configure --prefix=/usr/local/nginx --user=nginx --group=nginx --with-http_ssl_module --with-http_v2_module --with-http_realip_module --with-http_stub_status_module --with-http_gzip_static_module --with-pcre --with-stream --with-stream_ssl_module --with-stream_realip_module &&\
make -j 4 && make install &&\
chown -R nginx.nginx /usr/local/nginx/ &&\
ln -s /usr/local/nginx/sbin/nginx /usr/sbin/
EXPOSE 80
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"][root@docker1 test]# docker build -t nginx:centos .
[+] Building 0.0s (8/8) FINISHED docker:default=> [internal] load build definition from Dockerfile 0.0s=> => transferring dockerfile: 791B 0.0s=> [internal] load .dockerignore 0.0s=> => transferring context: 2B 0.0s=> [internal] load metadata for docker.io/library/centos:7 0.0s=> [internal] load build context 0.0s=> => transferring context: 95B 0.0s=> [1/3] FROM docker.io/library/centos:7 0.0s=> CACHED [2/3] ADD nginx-1.22.0.tar.gz /opt/test/ 0.0s=> CACHED [3/3] RUN yum -y install gcc pcre-devel openssl-devel zlib-devel openssl openssl-devel &&useradd -M -s /sb 0.0s=> exporting to image 0.0s=> => exporting layers 0.0s=> => writing image sha256:5f90f4b42382377324edf884560f8118d6873889dd8179df68b47de39b6fb334 0.0s=> => naming to docker.io/library/nginx:centos 0.0s
[root@docker1 test]# docker run -itd --name xiaobu -p 8080:80 nginx:centos
61beb14328b28a424a4c2e88d7e3a1f63e4ac55b551ec32a3656bcff3cb0711b
[root@docker1 test]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
61beb14328b2 nginx:centos "/usr/local/nginx/sb…" 5 seconds ago Exited (1) 4 seconds ago xiaobu
6068029975ff apache1:centos "/usr/local/httpd/bi…" 3 hours ago Up 3 hours 0.0.0.0:1314->80/tcp, :::1314->80/tcp httpd1
5b6c5af75176 apache:centos "/usr/local/httpd/bi…" 3 hours ago Exited (0) 3 hours ago http1
页面访问
相关文章:
docker创建镜像 Dockerfile
目录 docker的创建镜像的方式 dockerfile形成(原理) docker的核心作用 docker的文件结构 dockerfile的语法 CMD和ENTRPOINT的区别 创建dockerfile镜像 区别 RUN命令的优化 如何把run命令写在一块 copy和ADD区别 区别 centos7 构建Apache的d…...
C++共享和保护——(2)生存期
归纳编程学习的感悟, 记录奋斗路上的点滴, 希望能帮到一样刻苦的你! 如有不足欢迎指正! 共同学习交流! 🌎欢迎各位→点赞 👍 收藏⭐ 留言📝 生命如同寓言,其价值不在于…...
你好,C++(3)2.1 一个C++程序的自白
第2部分 与C第一次亲密接触 在浏览了C“三分天下”的世界版图之后,便对C有了基本的了解,算是一只脚跨入了C世界的大门。那么,怎样将我们的另外一只脚也跨入C世界的大门呢?是该即刻开始编写C程序?还是…… 正在我们犹…...
【INTEL(ALTERA)】Agilex7 FPGA Development Kit DK-DEV-AGI027R1BES编程/烧录/烧写/下载步骤
DK-DEV-AGI027R1BES 的编程步骤: 将外部 USB Blaster II 连接到 J10- 外部 JTAG 接头。将交换机 SW5.3 设置为 ON(首次)。打开 英特尔 Quartus Prime Pro Edition 软件编程工具。单击 硬件设置 ,然后选择 USB Blaster II。将硬件…...
大文件分块上传的代码,C++转delphi,由delphi实现。
在 Delphi 中,我们通常使用 IdHTTP 或 TNetHTTPClient 等组件来处理 HTTP 请求 原文章链接: 掌握分片上传:优化大文件传输的关键策略 【C】【WinHttp】【curl】-CSDN博客 改造思路: 文件分块处理:使用 TFileStream 来…...
MongoDB表的主键可以重复?!MongoDB的坑
MongoDB表的主键可以重复?! 眼见为实? 碰到一个奇怪的现象, MongoDB的一个表居然有两个一样的_id值! 再次提交时,是会报主键冲突的。那上图,为什么会有两个一样的_id呢? 将它们的…...
C++初阶-list类的模拟实现
list类的模拟实现 一、基本框架1.1 节点类1.2 迭代器类1.3 list类 二、构造函数和析构函数2.1 构造函数2.2 析构函数 三、operator的重载和拷贝构造3.1 operator的重载3.2 拷贝构造 四、迭代器的实现4.1 迭代器类中的各种操作4.1 list类中的迭代器 五、list的增容和删除5.1 尾插…...
RecyclerView中的设计模式解读
一.观察者模式:(待完善,这个写的不咋地,没理解透彻) 1.观察者模式的概念: (1)消息传递方向:被观察者->观察者 (2)代码实现: 首…...
ACwing算法备战蓝桥杯——Day30——树状数组
定义: 树状数组是一种数据结构,能将对一个区间内数据进行修改和求前缀和的这两种操作的最坏时间复杂度降低到O(logn); 实现所需变量 变量名变量数据类型作用数组a[]int存储一段区间数组tr[]int表示树状数组 主要操作 函数名函数参数组要作用lowbit()int…...
elementui + vue2实现表格行的上下移动
场景: 如上,要实现表格行的上下移动 实现: <el-dialogappend-to-bodytitle"条件编辑":visible.sync"dialogVisible"width"60%"><el-table :data"data1" border style"width: 100%&q…...
2、快速搞定Kafka术语
快速搞定Kafka术语 Kafka 服务端3层消息架构 Kafka 客户端Broker 如何持久化数据小结 Kafka 服务端 3层消息架构 第 1 层是主题层,每个主题可以配置 M 个分区,而每个分区又可以配置 N 个副本。第 2 层是分区层,每个分区的 N 个副本中只能有…...
CSS新手入门笔记整理:CSS3选择器
属性选择器 属性选择器,指的是通过“元素的属性”来选择元素的一种方式。 语法 元素[attr^"xxx"]{} 元素[attr$"xxx"]{} 元素[attr*"xxx"]{} 选择器 说明 E[attr^"xxx"] 选择元素E,其中E元素的attr属性是…...
D34|不同路径
62.不同路径 初始思路: 1)确定dp数组以及下标的含义: dp[i][i]存放到第i1行和第i1列的方法数 2)确定递推公式: dp[i][i] dp[i -1][i] dp[i][i-1] 3)dp数组如何初始化 第0行是1; 第0列是1&a…...
【运维】Kafka高可用: KRaft(不依赖zookeeper)集群搭建
文章目录 一. kafka kraft 集群介绍1. KRaft架构2. Controller 服务器3. Process Roles4. Quorum Voters5. kraft的工作原理 ing 二. 集群安装1. 安装1.1. 配置1.2. 格式化 2. 启动测试2.1. 启功节点服务2.2. 测试 本文主要介绍了 kafka raft集群架构: 与旧架构的不…...
Python 自动化之批量处理文件(一)
批量新建目录、文档Pro版本 文章目录 批量新建目录、文档Pro版本前言一、做成什么样子二、基本思路1.引入库2.基本架构 三、用户输入模块四、数据处理模块1.excel表格数据获取2.批量数据的生成 总结 前言 我来写一个不一样的批量新建吧。在工作中,有些同学应该会遇…...
力扣72. 编辑距离
动态规划 思路: 假设 dp[i][j] 是 word1 前 i 个字母到 word2 前 j 个字母的编辑距离;那么状态 dp[i][j] 状态的上一个状态有: dp[i - 1][j],word1 前 i - 1 个字母到 word2 前 j 个字母的编辑距离,此状态再插入一个字…...
Unity中 URP Shader 的纹理与采样器的分离定义
文章目录 前言一、URP Shader 纹理采样的实现1、在属性面板定义一个2D变量用于接收纹理2、申明纹理3、申明采样器4、进行纹理采样 二、申明纹理 和 申明采样器内部干了什么1、申明纹理2、申明采样器 三、采样器设置采样器的传入格式1、纹理设置中,可以看见我们的采样…...
Electron学习第一天 ,启动项目
之前在安装官网的步骤操作,结果报错,找了好多办法,最后这种办法成功启动项目,并且没有报错,特此记录 特别提醒,最好安装淘宝镜像,npm 太慢,会导致报错问题,解决起来个人觉…...
WebService技术--随笔1
1.WebService 发展史 创建阶段(1990 年代末至 2000 年代初):在这个阶段,XML-RPC 和 SOAP 协议被引入,为跨平台和跨语言的应用程序集成提供了基础。XML-RPC 提供了一种基于 XML 的远程过程调用机制,而 SOAP…...
如何使用Docker将.Net6项目部署到Linux服务器(一)
目录 一 配置服务器环境 1.1 配置yum 1.1.1 更新yum包 1.1.2 yum命令 1.2 配置docker …...
第4章-第3节-Java中跟数组相关的几个算法以及综合应用
在写这篇博文之前,先大概说明一下,就是很常见的数组算法如求最大值、一维数组的遍历等,这里就不去专门说明了,只说一些有代表性的,然后就是冒泡排序算法很容易查阅到,这里也不专门说明了,只说明…...
AlexNet(pytorch)
AlexNet是2012年ISLVRC 2012(ImageNet Large Scale Visual Recognition Challenge)竞赛的冠军网络,分类准确率由传统的 70%提升到 80% 该网络的亮点在于: (1)首次利用 GPU 进行网络加速训练。 ÿ…...
【单调栈 】LeetCode321:拼接最大数
作者推荐 【动态规划】【广度优先搜索】LeetCode:2617 网格图中最少访问的格子数 本文涉及的知识点 单调栈 题目 给定长度分别为 m 和 n 的两个数组,其元素由 0-9 构成,表示两个自然数各位上的数字。现在从这两个数组中选出 k (k < m n) 个数字…...
TikTok与虚拟现实的完美交融:全新娱乐时代的开启
TikTok,这个风靡全球的短视频平台,与虚拟现实(VR)技术的深度结合,为用户呈现了一场全新的娱乐盛宴。虚拟现实技术为TikTok带来了更丰富、更沉浸的用户体验,标志着全新娱乐时代的开启。本文将深入探讨TikTok…...
PXI/PCIe/VPX机箱 ARM|x86 + FPGA测试测量板卡解决方案
PXI便携式测控系统是一种基于PXI总线的便携式测试测控系统,它填补了现有台式及机架式仪器在外场测控和便携测控应用上的空白,在军工国防、航空航天、兵器电子、船舶舰载等各个领域的外场测控场合和科学试验研究场合都有广泛的应用。由于PXI便携式测控系统…...
ES6 面试题 | 12.精选 ES6 面试题
🤍 前端开发工程师(主业)、技术博主(副业)、已过CET6 🍨 阿珊和她的猫_CSDN个人主页 🕠 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 🍚 蓝桥云课签约作者、已在蓝桥云…...
【linux】Debian不能运行sudo的解决
一、问题: sudo: 没有找到有效的 sudoers 资源,退出 sudo: 初始化审计插件 sudoers_audit 出错 二、可用的方法: 出现 "sudo: 没有找到有效的 sudoers 资源,退出" 和 "sudo: 初始化审计插件 sudoers_audit 出错&q…...
讲解ThinkPHP的链式操作
数据库提供的链式操作方法,可以有效的提高数据存取的代码清晰度和开发效率,并且支持所有的CURD操作。 使用也比较简单,假如我们现在要查询一个User表的满足状态为1的前10条记录,并希望按照用户的创建时间排序 Db::table(think_u…...
Java技术栈 —— 微服务框架Spring Cloud —— Ruoyi-Cloud 学习(二)
RuoYi项目开发过程 一、登录功能(鉴权模块)1.1 后端部分1.1.1 什么是JWT?1.1.2 什么是Base64?为什么需要它?1.1.3 SpringBoot注解解析1.1.4 依赖注入和控制反转1.1.5 什么是Restful?1.1.6 Log4j 2、Logpack、SLF4j日志框架1.1.7 如何将项目打包成指定bytecode字节…...
如何进行软件测试和测试驱动开发(TDD)?
1. 软件测试概述 1.1 什么是软件测试? 软件测试是一种评估系统的过程,目的是发现潜在的错误或缺陷。通过对软件进行测试,开发者和测试人员可以确定软件是否符合预期的需求、功能是否正常运行,以及系统是否足够稳定和可靠。 1.2…...
天津高端网站建设/seo专员岗位要求
今天学习: 在Ubuntu下软件源的文件是/etc/apt/sources.list,那么sourdces.list.d目录下的文件又是什么作用呢? 该文件夹下的文件是第三方软件的源,可以分别存放不同的第三源地址,只需“扩展名”为list即可,…...
wordpress文章指定数量/上海优化外包
当前位置:我的异常网 Java Web开发 插入数据库错误插入数据库错误www.myexceptions.net 网友分享于:2013-08-03 浏览:6次插入数据库异常往mysql里面的表里插数据,表里的字段见下面定义的这一片,下面的代码是往数据库里插得jsp&…...
英文版wordpress安装/seo超级外链工具
欢迎关注头条号:老顾聊技术精品技术文章分享,知识的组装工目录前言先更新数据库,再更新缓存先更新缓存,再更新数据库先删除缓存,再更新数据库先更新数据库,再删除缓存删除缓存失败,导致不一致读…...
宣化网站建设/山东免费网络推广工具
2019独角兽企业重金招聘Python工程师标准>>> ANT通配符有三种: 通配符说明?匹配任何单字符*匹配0或者任意数量的字符**匹配0或者更多的目录例子: URL路径说明/app/*.x匹配(Matches)所有在app路径下的.x文件/app/p?ttern匹配(Matches) /app/…...
长沙做公司网站/谷歌seo推广服务
//查找 键是"a"的元素,返回指向元素的指针。 itword.find ("a"); //若是元素不存在,指针指向word.end(). if(it!word.end ()) cout<<it->second<<endl; //输出元素的值 void main() { //定义map 对象 map<…...
wordpress登陆美化/seo查询
我是卢松松,点点上面的头像,欢迎关注我哦! 2月9日,我们刚上班。很多公司也有开工发红包的习惯,虽然我们只是个小公司,但我们也发。昨天给到岗的同事每人发了800元红包,未到岗的500元。 我们定…...