docker镜像原理基础与dockerfile部署springboot项目
一.docker镜像原理
1.操作系统组成部分
进程调度子系统
进程通信子系统
内存管理子系统
设备管理子系统
文件管理子系统
网络通信子系统
作业控制子系统
Linux文件系统由bootfs和rootfs两部分组成
bootfs:包含bootloader(引导加载程序)和 kernel(内核)
rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等
2.docker镜像原理
- Docker镜像是由特殊的文件系统叠加而成
- 最底端是 bootfs,并使用宿主机的bootfs
- 第二层是 root文件系统rootfs,称为base image
- 然后再往上可以叠加其他的镜像文件
- 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
3.docker镜像本质
是一个分层文件系统
案例
Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?
Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层
Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB
4.镜像制作
容器转为镜像
docker commit 容器id 镜像名称:版本号
压缩镜像
docker save -o 压缩文件名称 镜像名称:版本号
解压镜像压缩包
docker load –i 压缩文件名称
二.dockerfile概念
1.定义
- dockerfile是一个用来构建镜像的文本文件
- 文本内容包含了一条条构建镜像所需的指令和说明
- 每一条指令对于一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝移植
2.dockerfile关键字
关键字 | 作用 | 备注 |
---|---|---|
FROM | 指定父镜像 | 指定dockerfile基于那个image构建 |
MAINTAINER | 作者信息 | 用来标明这个dockerfile谁写的 |
LABEL | 标签 | 用来标明dockerfile的标签 可以使用Label代替Maintainer 最终都是在docker image基本信息中可以查看 |
RUN | 执行命令 | 执行一段命令 默认是/bin/sh 格式: RUN command 或者 RUN [“command” , “param1”,“param2”] |
CMD | 容器启动命令 | 提供启动容器时候的默认命令 和ENTRYPOINT配合使用.格式 CMD command param1 param2 或者 CMD [“command” , “param1”,“param2”] |
ENTRYPOINT | 入口 | 一般在制作一些执行就关闭的容器中会使用 |
COPY | 复制文件 | build的时候复制文件到image中 |
ADD | 添加文件 | build的时候添加文件到image中 不仅仅局限于当前build上下文 可以来源于远程服务 |
ENV | 环境变量 | 指定build时候的环境变量 可以在启动的容器的时候 通过-e覆盖 格式ENV name=value |
ARG | 构建参数 | 构建参数 只在构建的时候使用的参数 如果有ENV 那么ENV的相同名字的值始终覆盖arg的参数 |
VOLUME | 定义外部可以挂载的数据卷 | 指定build的image那些目录可以启动的时候挂载到文件系统中 启动容器的时候使用 -v 绑定 格式 VOLUME [“目录”] |
EXPOSE | 暴露端口 | 定义容器运行的时候监听的端口 启动容器的使用-p来绑定暴露端口 格式: EXPOSE 8080 或者 EXPOSE 8080/udp |
WORKDIR | 工作目录 | 指定容器内部的工作目录 如果没有创建则自动创建 如果指定/ 使用的是绝对地址 如果不是/开头那么是在上一条workdir的路径的相对路径 |
USER | 指定执行用户 | 指定build或者启动的时候 用户 在RUN CMD ENTRYPONT执行的时候的用户 |
HEALTHCHECK | 健康检查 | 指定监测当前容器的健康监测的命令 基本上没用 因为很多时候 应用本身有健康监测机制 |
ONBUILD | 触发器 | 当存在ONBUILD关键字的镜像作为基础镜像的时候 当执行FROM完成之后 会执行 ONBUILD的命令 但是不影响当前镜像 用处也不怎么大 |
STOPSIGNAL | 发送信号量到宿主机 | 该STOPSIGNAL指令设置将发送到容器的系统调用信号以退出。 |
SHELL | 指定执行脚本的shell | 指定RUN CMD ENTRYPOINT 执行命令的时候 使用的shell |
三.dockerfile部署springboot项目
1.准备一个简单的springboot项目
2.在云服务器中进行相关操作
dockerfile文件
FROM java:8
MAINTAINER henrik <10791894@qq.com>
ADD hellodocker-0.0.1-SNAPSHOT.jar app.jar
CMD java -jar app.jar
3.执行构建命令
docker build -f ./springboot_dockerfile -t app .
4.运行
docker run -id -p 9000:8080 app
docker镜像原理基础与dockerfile部署springboot项目相关推荐
- Docker系列之Jenkins+Git实现流水线部署SpringBoot项目
1. 概述 本文使用Docker.Jenkins和Gitee持续部署SpringBoot项目,小伙伴们需要提前准备好Docker和Jenkins开发环境,有不清楚如何安装Docker和Jenkins的 ...
- Docker上部署SpringBoot项目并推送镜像到Docker Hub上---以MacOS为例
Docker部署.镜像推送至Docker Hub.拉取.运行 Docker部署 Dockerfile文件内容 文件内容解释 制作镜像 查看镜像 本地运行镜像 镜像推送.拉取.运行 镜像推送 镜像拉取 ...
- Docker 部署 SpringBoot 项目整合 Redis 镜像做访问计数Demo
Docker 部署SpringBoot项目整合 Redis 镜像做访问计数Demo 最终效果如下 大概就几个步骤 1.安装 Docker CE 2.运行 Redis 镜像 3.Java 环境准备 4. ...
- K8S实战基础篇:一文带你深入了解K8S实战部署SpringBoot项目
K8S实战基础篇:一文带你深入了解K8S实战部署SpringBoot项目 1.前言 2.简介 2.1.为什么写这篇文章 2.2.需求描述 2.3.需求分析 3. 部署实战 3.1 环境准备 3.2 i ...
- Docker 部署SpringBoot项目不香吗?
点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 作者:流星007 链接:toutiao.com/i68433912 ...
- IDEA配置Docker一键部署SpringBoot项目(企业级做法)
Docker一键部署SpringBoot项目 前言 一.开启Linux的Docker远程访问 1.1 安装vim工具: 1.2 修改`daemon.json`的配置: 1.3 加入配置: 1.4 重新 ...
- docker安装以及部署springboot项目
一.docker安装 1.安装 Docker Engine-Community 安装最新版本的 Docker Engine-Community 和 containerd,或者转到下一步安装特定版本: ...
- 【docker系列】docker之部署springboot项目
目录 一.项目依赖 二.引入docker依赖 三.项目打包 四.编写Dockerfile文件 五.构建镜像 六.启动容器 七.测试 一.项目依赖 本篇主题主要实战如何使用Docker部署springb ...
- 【Docker】11、IDEA集成Docker插件实现一键部署SpringBoot项目
日常开发项目的过程中,我们每次需要部署线上的时候,都需要安装一大堆的运行环境,例如:JDK.MySQL.Redis 等,非常花费时间.我们可以使用 Docker 的容器技术,方便快捷地搭建项目启动所需 ...
最新文章
- python3和2的区别大吗_python3和2为什么区别大吗
- 【渝粤教育】电大中专沟通技巧作业 题库
- MVC利用URLRoute实现伪静态后正真的静态html无法访问
- 20200716:最多 K 次交换相邻数位后得到的最小整数(leetcode 1505)
- python有关迭代器和生成器的面试题_python面试题之生成器迭代器
- jquery表单选择器input、:text、:password、:radio、:checkbox、:submit、:reset、:image、:button、:file、:hidden
- ubb码转换的java类库 ubb2html_ubb代码转换为html
- DSP28335定时器
- 如何从苹果手机中导出视频且保证画面不失真
- 为civil3D2018 添加snoop DB工具
- 选一个适合自己的加密芯片,加密IC,如何才能真正的做到不被破解。
- WireShark 不能正常解析 Radius 包,提示 Malformed Packet .
- itext将html转换为pdf,使用itext将html转换为pdf
- 第六部分 项目成本管理
- c++头文件:stdio.h ,cstdio ,iostream ,bits/stdc++.h
- 蓝宇风:高强度加密狗
- [活动预告]倒数1天!开源世界高峰论坛将于北京举行,偶数科技将进行主题演讲和产品展示
- 【JAVA面试】来自某双非本科菜比的秋招历程分享
- 手写公式自动识别方法汇总
- 【文件系统】如何在ubi之上运行squashfs
热门文章
- 常见建模软件导出gltf
- dd linux 格式化u盘启动盘_Ubuntu使用dd命令制作U盘系统启动盘
- [RUST]nightly版本安装和切换
- div +css 纵向导航
- 起点中文网月票等字体数据爬取Python
- 摩天大楼如何靠一颗铁球防风抗震?
- python编程实验,模拟聪明版的尼姆游戏设计原理
- Ayoa永久免费版网页在线思维脑图软件
- 这款APP让你免费无限畅享高质量阅读
- xp系统qq安装不上网络连接服务器,XP系统安装QQ提示无法访问Windows Installer的解决步骤...