dockfile概述,使用dockerfile构建Nginx,Tomcat镜像

2023-11-12

一.镜像分层

1.1 docker 三要素

镜像:容器的一种静态模板(一组资源的集合,分层的方式一层层累加,组成了完整的镜像
容器:是一种应用/环境的运行时状态/运行时环境
仓库:存放镜像

1.2 创建容器的几种方式

①基于已有的模板文件进行创建
容器导出、导入
②基于已有的镜像进行创建
③dockerfile

1.3 镜像所包含的部分

①基础镜像——》centos 7
②依赖环境——》gcc gcc-C++ make jdk jre gd 等
③应用服务软件包
④应用服务的相关配置文件
⑤启动方式/容器开启时运行的脚本/命令/指令

1.4 镜像的分层

在这里插入图片描述

在这里插入图片描述

二.dockerfile分层原理

2.1 docker镜像分层

基于AUFS构建
AUFS是一种可叠加的文件系统
Docker镜像位于bootfs之上
每一层镜像的下一层成为父镜像
第一层镜像成为base image(操作系统环境镜像)
容器层(可读可写),在最顶层( writable)
容器层以下都是readonly

2.2 涉及技术

①bootfs (boot file system)内核空间
主要包含bootloader和kernel

bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs

这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

在linux操作系统中(不同版本的linux发行版本),linux.加载bootfs时会将rootfs设置为read-only,系统自检后会将只读改为读写,让我们可以在操作系统中进行操作

②rootfs (root file system)内核空间
在bootfs之上 (base images,例如centos 、 ubuntu)
包含的就是典型 Linux系统中的/dev,/proc,/bin,/etc 等标准目录和文件

rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等

③小结:为什么docker的centos镜像只有200M多一点
bootfs + rootfs :作用是加载、引导内核程序+挂载使用linux操作系统(centos ubantu)等等一些关键的目录文件

对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序库就可以了,因为底层直接用Host的kernel,自己只需要提供rootfs 就行了。由此可见对于不同的linux发行版,bootfs基本是一致的,rootfs会有差别,因此不同的发行版可以公用bootfs

AUFS与overlay / overlay2 (docker 高版本)
AUFS是一种联合文件系统。它使用同一个Linux
host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了pocker镜像的分层
而docker使用了overlay/overlay2存储驱动来支持分层结构
OverlayFs将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载

overlay结构:

overlayfs在linux主机上只有两层,一个目录在下层,用来保存镜像(docker),另外一个目录在上层,用来存储容器信息
1、rootfs          基础镜像
2、lower           下层信息(为镜像层,容器)
3、upper           上层目录(容器信息,可写)
4、worker          运行的工作目录( copy-on-write写时复制一》
准备容器环境)
5、mergod          "视图层”(容器视图)

docker镜像层次结构小结

1.base image :基础镜像
2.image:固化了一个标准运行环境,镜像本身的功能-封装一组功能性的文件,通过统一的方式,文件格式提供出来(只读)
3.container:容器层(读写)
4.docker-server端
5.呈现给docker-client(视图)

注:在修改时,若upper层没有,则会将lower层有的文件复制到upper层进行修改并保存结果

镜像分层简洁概述:

本从顶层到底层顺序
container                 容器层
image (s)                 镜像层(应用的像层——》上层镜像层)
image (s)                 镜像层(依赖环境的镜像层——》下层镜像层)
base image                基础镜像层(linux发行版本操作系统rootfs)
kernel                    内核层(aufs + bootfs )
因为各linux发行版本公用一套bootfs引导、加载文件系统(是由宿主机内核提供的)
同时vm虚拟机的操作系统需要完整的模拟出来
所以容器的操作系统比vm虚拟机的操作系统更为轻量级(区别在于容器是共享宿主机内核的)

2.3 联合挂载

①按下图示创建目录和文件
在这里插入图片描述
②挂载

[root@docker demo]# mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work mergod 

在这里插入图片描述
③查看
在这里插入图片描述

三.dockerfile操作指令

在这里插入图片描述

3.1 ADD和copy区别

copy = cp复制,将宿主机指定的文件复制到image层中

ADD
①可以复制,同时兼有了解压的功能
add nginx-1.12.tar.gz /root/nginx
在复制进去的同时会对压缩包进行解压到容器内部就是 nginx-1.12/
②add复制的对象可以是URL,跨节点的数据(URL)

3.2 CMD和entrypoint的区别

都是容器启动时要加载的命令
①cmd是容器环境启动时默认加载的命令
②entrypoint是容器环境启动时第一个加载的命令程序/脚本程序init

如果 ENTRYPOINT使用了shell模式,CMD指令会被忽略。
entrypoint ["sh","-c", "echo $HOME"]
cmd [ "restart" ] #CND会被忽略
如果 ENTRYPOINT使用了exec模式,CMD指定的内容被追加为ENTRYPOINT 指定命令的参数。
entrypoint ["/etc/init.d/nginx"]
cmd [ "restart"]  #CMD作为entrypoint的参数
如果 ENTRYPOINT使用了exec模式,CMD也应该使用exec模式。

例如:
同一个dockerfile中有多个cmd指令的话,哪个生效?
答:最后一个生效
如果dockerfile中有多个cmd命令同时,docker build -t nginx:new
/bin/bash 哪个生效?
答:docker build指定的生效
如果dockerfile中cmd和entrypoint同时存在哪个生效呢
答:看情况,如果都是默认加载的类型:
cmd :默认加载的命令/执行程序
entrypoint:第一个加载的环境
exec方式启动的话,那么entrypoint会覆盖,或将cmd做为entrypoint传入参数
shell 方式启动的话,直接就是entrypoint生效

exec模式与shell模式:
exec:容器加载时使用的启动的第一个任务进程
shell:容器加载时使用的第一个bash

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

四.编写dockerfile,构建镜像

Dockerfile是由一组指令组成的文件,Dockerfile结构四部分:
①基础镜像信息(指定操作系统镜像是什么镜像、什么版本)
②维护者信息
③镜像操作指令
④容器启动时执行指令(启动容器的时候,执行的脚本/命令参数等等)
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以"#"号开头的注释

4.1 构建nginx镜像

①创建目录和Dockerfile文件

mkdir nginx
vim nginx/Dockerfile 
#基础镜像(centos需小写)
FROM centos:7
#用户信息
MAINTAINER THIS IS NGINX IMAGE
添加环境包
RUN yum  -y update
RUN yum install -y pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#解压nginx软件包
ADD nginx-1.12.2.tar.gz /usr/local/src
#指定工作目录(相当于cd)
WORKDIR /usr/local/src
WORkDIR nginx-1.12.2
RUN ./configure \
--prefix=/usr/local/nginx \
--user=nginx \
--group=nginx \
--with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定httpd端口
EXPOSE 80
RUN echo "daemon off;" >> /usr/local/nginx/conf/nginx.conf
CMD nginx

②上传nginx-1.12.2.tar.gz至/root/nginx/目录下
在这里插入图片描述

③基于Dockerfile文件构建镜像命令

docker build -f Dockerfile -t nginx:new .
docker build :基于dockerfile 构建镜像
-f :指定dockerfile 文件(默认不写的话指的是当前目录)
-t : (tag)打标签——》nginx:new
. :指的是构建镜像时的上下文环境,简单理解:指的当前目录环境中的文件

④运行容器

 docker run -d -P nginx:new 

在这里插入图片描述
⑤浏览器访问
在这里插入图片描述
小结:构建nginx镜像
①创建一个对应的目录( mkdir nginx)
②编写Dockerfile文件(最简单的方式,nginx部署脚本放进去,每条命令用RON执行,环境变量使用ENV,移动到对应目录使用workdir,最后使用CMD 进行启动设置)
③在nginx目录中上传nginx-1.12.2.tar.gz软件包等文件
④docker build 创建
⑤docker run运行容器
⑥检验

4.2 构建Tomcat镜像

①创建目录并编写Dockerfile文件,上传相关文件

[root@docker ~]# mkdir Tomcat/

FROM centos:7
MAINTAINER build image tomcat <tang>
EXPOSE 8080

ADD jdk-8u91-linux-x64.tar.gz /usr/local/src
WORKDIR /usr/local/src
ENV JAVA_HOME /usr/local/src/jdk1.8.0_91
ENV CLASSPATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH $JAVA_HOME/bin:$PATH

ADD apache-tomcat-9.0.16.tar.gz /usr/local/src
RUN mv apache-tomcat-9.0.16/ /usr/local/tomcat9 &> /dev/null
ENV PATH /usr/local/tomcat9/bin/:$PATH
ADD tomcat9.run.sh /usr/local/src
RUN chmod 755 /usr/local/src/tomcat9.run.sh &> /dev/null
CMD ["/usr/local/src/tomcat9.run.sh"]
#ENTRYPOINT ["/usr/local/tomcat9/bin/catalina.sh","run"]
1、ENRYPOINT指开启容器前镜像就已经执行了括号内的命令

2、CMD是开启容器时,要执行的指令,设置容器启动后默认执行的命令及其参数,但 CMD 能够被 docker run 后面跟的命令行参数替换

3、基于Dockerfile内有CMD或者ENTRYPOINT创建镜像时,docker run 后面就不要加指令(/bin/bash)了,会覆盖掉Dockerfile中的指令或者语法报错
vim tomcat9.run.sh
#!/bin/bash
/usr/local/tomcat9/bin/catalina.sh run

在这里插入图片描述

②生成镜像

[root@docker tomcat]# docker build -t tomcat:test .
[root@docker tomcat]# docker images |grep tomcat

在这里插入图片描述

③创建容器

root@docker tomcat]# docker run -d -P tomcat:test
[root@docker tomcat]# docker ps -a |grep tomcat

在这里插入图片描述

④测试
在这里插入图片描述

4.3 dockerfile构建Tomcat镜像优化

创建目录并编写Dockerfile文件

[root@docker Tomcat]# cat Dockerfile 
FROM frolvlad/alpine-oraclejdk8  
ADD apache-tomcat-9.0.16.tar.gz /usr/local/
WORKDIR /usr/local/
RUN mv /usr/local/apache-tomcat-9.0.16 /usr/local/tomcat &>/dev/null
RUN ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime \
&& sed -i "s#securerandom.source=file:/dev/random#securerandom.source=file:/dev/urandom#g" $JAVA_HOME/jre/lib/security/java.security
EXPOSE 8080
ENTRYPOINT ["/usr/local/tomcat/bin/catalina.sh","run"]

生成镜像

[root@docker Tomcat]# docker build -t tomcat:new .

在这里插入图片描述
创建容器
在这里插入图片描述
测试:
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

dockfile概述,使用dockerfile构建Nginx,Tomcat镜像 的相关文章

  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 如何在 shell 脚本中并行运行多个实例以提高时间效率[重复]

    这个问题在这里已经有答案了 我正在使用 shell 脚本 它读取 16000 行的输入文件 运行该脚本需要8个多小时 我需要减少它 所以我将其划分为 8 个实例并读取数据 其中我使用 for 循环迭代 8 个文件 并在其中使用 while
  • 无法访问本地 Docker 容器上的 Asp.Net Core

    我在 asp net core 中创建了一个应用程序 并创建了一个 dockerfile 来生成本地映像并运行它 FROM microsoft dotnet latest COPY app WORKDIR app RUN dotnet re
  • 使用 Docker 文件分配附加功能

    我需要部署 Docker 映像 但我只想使用 Docker run 命令而不使用其任何参数 我想在运行容器时分配特殊权限 这是我的 Docker 运行命令 docker run cap add SYS ADMIN cap add DAC R
  • 无法连接到 macOS 上的 Docker 守护进程

    我通常更喜欢使用brew 来管理我的OSX 上的应用程序 我能够安装 docker docker compose 和 docker machine docker version Docker version 17 05 0 ce build
  • Linux 中的动态环境变量?

    Linux 中是否可以通过某种方式拥有动态环境变量 我有一个网络服务器 网站遵循以下布局 site qa production 我想要一个环境变量 例如 APPLICATION ENV 当我在 qa 目录中时设置为 qa 当我在生产目录中时
  • 域套接字“sendto”遇到“errno 111,连接被拒绝”

    我正在使用域套接字从另一个进程获取值 就像 A 从 B 获取值一样 它可以运行几个月 但最近 A 向 B 发送消息时偶尔会失败 出现 errno 111 连接被拒绝 我检查了B域套接字绑定文件 它是存在的 我也在另一台机器上做了一些测试 效
  • Android 时钟滴答数 [赫兹]

    关于 proc pid stat 中应用程序的总 CPU 使用率 https stackoverflow com questions 16726779 total cpu usage of an application from proc
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • 适用于elasticsearch 7.0.1 和 kibana 7.0.1 的 docker-compose.yml

    我在 Windows 10 上将 Docker Desktop 与 Linux 容器结合使用 并希望通过 docker compose 文件启动最新版本的 elasticsearch 和 kibana 容器 使用 6 2 4 等旧版本时一切
  • Docker 中的 Python 日志记录

    我正在 Ubuntu Web 服务器上的 Docker 容器中测试运行 python 脚本 我正在尝试查找由 Python Logger 模块生成的日志文件 下面是我的Python脚本 import time import logging
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 将 nvidia 运行时添加到 docker 运行时

    我正在运行虚拟机GCP配备特斯拉 GPU 并尝试部署一个PyTorch基于应用程序使用 GPU 加速 我想让 docker 使用这个 GPU 可以从容器访问它 我设法在主机上安装了所有驱动程序 并且该应用程序在那里运行良好 但是当我尝试在
  • Docker 教程入门第 4 部分连接被拒绝

    我不明白我错过了什么 docker compose yml version 3 services web replace username repo tag with your name and image details image sv
  • CentOS:无法安装 Chromium 浏览器

    我正在尝试在 centOS 6 i 中安装 chromium 以 root 用户身份运行以下命令 cd etc yum repos d wget http repos fedorapeople org repos spot chromium
  • os.Mkdir 和 os.MkdirAll 权限

    我正在尝试在程序开始时创建一个日志文件 我需要检查是否 log如果不创建目录 则目录存在 然后继续创建日志文件 好吧 我尝试使用os Mkdir 也os MkdirAll 但无论我在第二个参数中输入什么值 我都会得到一个没有权限的锁定文件夹
  • Windows 上的 boot2docker 缺少 apt-get / 包管理器

    我在 boot2docker 中 我不确定我完全理解它 但它似乎是我正在进行的项目所需要的 我已经通过 ssh 登录了 并且尝试对我们的项目进行 make 但是我得到了 make not found 然后我尝试了一个 apt get ins
  • Linux 可执行文件与 OS X“兼容”吗?

    如果您在基于 Linux 的平台上用 C 语言编译一个程序 然后将其移植以使用 MacOS 库 它会工作吗 来自编译器的核心机器代码在 Mac 和 Linux 上兼容吗 我问这个问题的原因是因为两者都是 基于 UNIX 的 所以我认为这是真
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • ASP .NET Core 在 Heroku 上出现 System.Net.Sockets.SocketException 错误

    我正在尝试将 NET core Web API 部署到 Heroku 下面是我的Dockerfile FROM mcr microsoft com dotnet core aspnet 2 1 AS runtime WORKDIR app

随机推荐

  • Git patch生成以及更新的命令

    1 使用git format patch生成所需要的patch 当前分支所有超前master的提交 git format patch M master 某次提交以后的所有patch git format patch 4e16 4e16指的是
  • VS2019+QGIS开发库二次开发环境搭建

    VS2019 QGIS开发库二次开发环境搭建 总共分为以下步骤 下载qgis和二次开发库 VS2019搭建开发环境 配置VS2019中的Qt插件 配置完Qt版本后对工程属性进行配置 编写测试代码 运行测试代码 拷贝运行程序需要用的动态库文件
  • ajax改变input框属性,ajax怎么实现输入框文字改变展示下拉列表的效果

    ajax怎么实现输入框文字改变展示下拉列表的效果 发布时间 2021 07 26 18 16 59 来源 亿速云 阅读 72 作者 chen 本篇内容主要讲解 ajax怎么实现输入框文字改变展示下拉列表的效果 感兴趣的朋友不妨来看看 本文介
  • 考研刷题小程序

    2020年12月28号 今年的考研已于昨天结束 小肥羊携手考研刷题小程序 祝各位考研学子一战上岸 话说2020年我开发了一个考研刷题小程序 今天非常好奇 竟然还有人在刷题 在签到打卡 在邀请好友 1 这个刷题小程序从2020年年初开发到6月
  • JQ源码分析(环境处理)

    JQ可以在哪运行 浏览器 手机端app中 有window环境 不支持commonJS规范 支持es6 module规范 node环境 没有window 支持commonJS 但不支持Es6Module 可以用webpack进行编译 支持wi
  • c++中的vector容器(笔记练习)

    笔记 1 about vector vector是可变大小数组的序列容器 同数组一样 vector也采用连续存储空间存储元素 因此可采用下标对元素进行访问 与普通数组不同的是 它的大小是可动态改变 vector使用动态数组存储元素 与其它动
  • 【黑马程序员】MySQL 基础篇

    文章目录 前言 一 MySQL 概述 1 数据库相关概念 2 MySQL 数据库 1 版本 2 下载 3 安装 4 启动与停止 5 客户端连接 3 数据模型 1 关系型数据库 RDBMS 2 数据模型 二 SQL 1 SQL 通用语法 2
  • 企业应如何减少云配置错误?

    在当今技术驱动的环境中 大多数公司都会在云上拥有一些工作负载 与本地网络不同 这些云环境缺乏安全的外部边界和特定的关闭时间 云网络始终开启且始终可用 虽然方便 但这也意味着黑客可以随时访问它们 因此 这些网络中的任何漏洞 例如云配置错误 都
  • 项目回顾(一)-----原型的建立

    距离实习结束也有一段时间了 这段时间里我从前到后参加的过的一个项目 收获颇丰 故在博客中自我总结 积累经验 从了解到需求开始 就要开始着手思考功能 功能联系 数据存储等问题 根据客户的需求来进行原型的设计 这一步操作不单单是给客户一个样例
  • Java JDK动态代理

    Java JDK动态代理 一 代理是什么 二 示例 三 总结 一 代理是什么 代理是一种设计模式 被代理对象 真实对象 实现具体的服务方法 委托给代理来进行处理 代理类可以在被代理对象的方法上附加更多的处理 一般有静态代理和动态代理 区别在
  • Rancher部署Flink集群

    目录 一 添加flink conf yaml 二 配置flink jobmanager 三 配置flink taskmanager 一 添加flink conf yaml 资源 gt 配置映射 添加配置项
  • 解决npm install各种报错的6种方案 Error: Command failed: cmd.exe autoreconf -ivf以及gifsicle pre-build test fail

    解决npm install各种报错的6种方案 报错示例 方案零 刷新刷新 DNS 解析缓存 还有 可以尝试重启电脑 方案一 使用yarn 方案二 使用cnpm 方案三 修改配置host 方案四 这种解决其他报错比较多 修改npm源 方案五
  • Jmeter查看结果树之查看响应的13种详解方法

    Jmeter查看结果树查看响应有哪几种方法 可通过左侧面板底部的下拉框选择 01 Text 查看结果树中请求的默认格式为Text 显示取样器结果 请求 响应数据3个部分内容 取样器结果 默认Raw展示 可以切换为Parsed视图 表单展示更
  • 域名导向服务器 开源项目,让 Page 服务指向自己域名

    正常情况下如果只买了域名 但是没有买云主机 所以可以利用现有的 Page 服务并让域名跳转到该Page来实现 码云 自定义域名是收费的 但是服务文档 推荐 码云pro版自定义域名解析 Step 1 绑定你已备案的域名 Step 2 通过解析
  • hadoop,pySpark环境安装与运行实战《一》

    一 环境准备 环境最好再mac或者liunx环境搭建最为友好 不建议在windows上折腾 1 安装java jdk 下载java jdk 并在 bash profile配置 jdk mac路径查找方式 export JAVA HOME U
  • 后摩尔定律时代的芯片新选择!

    来源 gizmodo 摘要 很长一段时间以来 摩尔定律和它的最终结局一直就像房间里的大象 不容忽视 英特尔联合创始人戈登 摩尔在1965年的一篇论文中预测 芯片中的晶体管数量每年将翻一番 更多的晶体管意味着更快的速度 而这种稳定的增长推动了
  • jul177链接_「jul177小早川中文」无删减版高清天天影音第89集

    简介 一会儿 小早小早她走进来 小早小早看上去苍白而动摇 彼得 她说 去找丈夫而不是代替她在他对面 彼得 她颤抖的手放在他的手臂上 一世今天早上还没见过男孩 他们的床还没睡在 安静点 老兄 安静一下 坐下来吃点东西 沟通破坏了礼貌 但是当厄
  • 1G服务器网站,1核1g内存云服务器建网站

    1核1g内存云服务器建网站 内容精选 换一换 网站的访问与云服务器的网络配置 端口通信 防火墙配置 安全组配置等多个环节相关联 任意一个环节出现问题 都会导致网站无法访问 本节操作介绍网站无法访问时的排查思路 网站无法访问怎么办 如果打开网
  • 插优盘电脑计算机窗口闪,U盘插到电脑上,电脑怎么一闪一闪的?

    2009 05 08 我的U盘一直是好的 今天U盘插进电脑后 U盘灯闪几秒就熄灭了 不能读取 我怎么办 真是着急 请高手解答 非常感谢 U盘正规的是在插上后灯闪烁一下 在没有动作的情况下就不会亮 向盘里考资料 软件 音乐等任何文件时候 灯闪
  • dockfile概述,使用dockerfile构建Nginx,Tomcat镜像

    dockfile概述 使用dockerfile构建Nginx Tomcat镜像 一 镜像分层 1 1 docker 三要素 1 2 创建容器的几种方式 1 3 镜像所包含的部分 1 4 镜像的分层 二 dockerfile分层原理 2 1