Docker系列5 之 DockerFile DockerCompose 镜像原理介绍

DockerFile

镜像原理

镜像是什么

镜像是一种轻量级、可执行的独立软件包,用来打包软件运行环境和基于运行环境开发的软件,它包含运行某个软件所需的所有内容,包括代码、运行时、库、环境变量和配置文件

思考

Docker 镜像本质是什么?

Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?

Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?
**
**

操作系统组成部分

进程调度子系统
进程通信子系统
内存管理子系统
设备管理子系统
文件管理子系统
网络通信子系统
作业控制子系统

文件管理子系统

Linux文件系统由bootfs和rootfs两部分组成

bootfs:包含bootloader(引导加载程序)和 kernel(内核)

rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件

不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等

在这里插入图片描述

1)UnionFS(联合文件系统)

**
UnionFS(联合文件系统):Union文件系统是一种分层、轻量级并且高性能的文件系统,它支持对文件系统的修改作为一次提交来一层层的叠加,同时可以将不同目录挂载到同一个虚拟文件系统下,Union文件系统是Dokcer镜像的基础。镜像可以通过分层来进行继承,基于基础镜像(没有父镜像),可以制作各种具体的镜像。
特性:一次同时加载多个文件系统,但从外面看起来,只能看到一个文件系统,联合加载会把各层文件系统加载起来,这样最终的文件系统会包含所有的底层文件和目录
**
**

2)Docker镜像加载原理

**

docker的镜像实际上是由一层一层的文件系统构成,这种层级的文件系统UnionFS。
主要包含bootloader和kernel,bootloader主要是引导加载kernel,Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs。这一层与我们典型的linux/unix系统是一样的,包含boot加载器内核。当boot加载完之后整个内核就都在内存中了,此时内存的使用权已经由bootfs交给内核了,此时系统也会卸载bootfs

平时我们安装进虚拟机的CentOS都是好几个G,为什么docker这里才200M
**
在这里插入图片描述

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

3)分层的镜像

**
以pull为例,在下载的过程中我么可以看到docker的镜像好像是在一层一层的下载

在这里插入图片描述

**

4)为什么Docker镜像要采用这种分层的结构

**
最大一个好处就是——共享资源
比如:有多个镜像都从相同的base镜像构建而来,那么宿主机只需要在磁盘上保存一份base镜像,同时内存中也需要加载一份base镜像,就可以为所有服务器服务了。而且镜像的每一层都可以被共享。
**

2.特点

**
docker镜像都是只读的
当容器启动时,一个新的可写层被加载到镜像的顶部。
这一层通常被称作“容器层”,“容器层”之下都叫“镜像层”

5)深入理解

所有的 Docker 镜像都起始于一个基础镜像层,当进行修改或增加新的内容时,就会在当前镜像层之 上,创建新的镜像层。 举一个简单的例子,假如基于 Ubuntu Linux 16.04 创建一个新的镜像,这就是新镜像的第一层;如果 在该镜像中添加 Python包,就会在基础镜像层之上创建第二个镜像层;如果继续添加一个安全补丁,就 会创建第三个镜像层。 该镜像当前已经包含 3 个镜像层,如下图所示(这只是一个用于演示的很简单的例子)。

在这里插入图片描述

在添加额外的镜像层的同时,镜像始终保持是当前所有镜像的组合,理解这一点非常重要。下图中举了 一个简单的例子,每个镜像层包含 3 个文件,而镜像包含了来自两个镜像层的 6 个文件。

在这里插入图片描述

上图中的镜像层跟之前图中的略有区别,主要目的是便于展示文件。 下图中展示了一个稍微复杂的三层镜像,在外部看来整个镜像只有 6 个文件,这是因为最上层中的文件 7 是文件 5 的一个更新版本。

在这里插入图片描述

这种情况下,上层镜像层中的文件覆盖了底层镜像层中的文件。这样就使得文件的更新版本作为一个新 镜像层添加到镜像当中。

Docker 通过存储引擎(新版本采用快照机制)的方式来实现镜像层堆栈,并保证多镜像层对外展示为统 一的文件系统。

Linux 上可用的存储引擎有 AUFS、Overlay2、Device Mapper、Btrfs 以及 ZFS。顾名思义,每种存储 引擎都基于 Linux 中对应的文件系统或者块设备技术,并且每种存储引擎都有其独有的性能特点。

Docker 在 Windows 上仅支持 windowsfilter 一种存储引擎,该引擎基于 NTFS 文件系统之上实现了分 层和 CoW[1]。

下图展示了与系统显示相同的三层镜像。所有镜像层堆叠并合并,对外提供统一的视图。

在这里插入图片描述

小结

1.Docker镜像是由特殊的文件系统叠加而成
2.最底端是 bootfs,并使用宿主机的bootfs

3.第二层是 root文件系统rootfs,称为base image

4.然后再往上可以叠加其他的镜像文件

5.统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。

6.一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。

7.当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器

解决思考题中的问题

1.Docker 镜像本质是什么?

是一个分层文件系统

2.Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个个G?

Centos的iso镜像文件包含bootfs和rootfs,而docker的centos镜像复用操作系统的bootfs,只有rootfs和其他镜像层

3.Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?

由于docker中镜像是分层的,tomcat虽然只有70多MB,但他需要依赖于父镜像和基础镜像,所有整个对外暴露的tomcat镜像大小500多MB

在这里插入图片描述

镜像制作

1.容器转为镜像

作用:比如我们在tomcat上新建了一个应用,但是我们要把应用发送给测试人员进行测试,这时候就可以把这个应用放在容器之中然后将其转换为镜像,然后发送给测试人员测试

docker commit 容器id 镜像名称:版本号
#镜像是不可以直接传输的
#所以可以将其压缩为压缩文件进行传输
docker save -o 压缩文件名称 镜像名称:版本号

docker load -i 压缩文件名称

在这里插入图片描述

2.DockerFile

什么是DockerFile

1.Dockerfile 是一个文本文件

2.包含了一条条的指令

3.每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像

4.对于开发人员:可以为开发团队提供一个完全一致的开发环境

5.对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了

6.对于运维人员:在部署时,可以实现应用的无缝移植

Dochub网址:https://hub.docker.com

在这里插入图片描述

3.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

4…制作一个基于Centos7的镜像

需求

自定义centos7镜像。
要求:

  1. 默认登录路径为 /usr

  2. 可以使用vim

实现步骤

1.定义父镜像:FROM centos:7

2.定义作者信息:MAINTAINER itheima [email protected]

3.执行安装vim命令: RUN yum install -y vim

4.定义默认的工作目录:WORKDIR /usr

5.定义容器启动执行的命令:CMD /bin/bash

6.通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本 .

注意末尾有一个点号否则会报错

docker bulid –f centos_dockerfile –t pjhcentos:1  .

演示

在root目录下创建一个docker-files目录

在这里插入图片描述

创建一个名为centos_dockerfile的文件内容

在这里插入图片描述

输入命令创建镜像

在这里插入图片描述

创建成功
在这里插入图片描述
在这里插入图片描述

将SpringBoot项目部署到容器中

需求

定义dockerfile,发布springboot项目

实现步骤

1.定义父镜像:FROM java:8

2.定义作者信息:MAINTAINER itheima [email protected]

3.将jar包添加到容器: ADD springboot.jar app.jar

4.定义容器启动执行的命令:CMD java–jar app.jar

5.通过dockerfile构建镜像:docker bulid –f dockerfile文件路径 –t 镜像名称:版本

演示

创建一个springboot项目
在这里插入图片描述

将其打包为jar包
在这里插入图片描述

上传到服务器上
在这里插入图片描述
在这里插入图片描述

传到对应的dockerfile目录中
在这里插入图片描述

将对应的jar包添加到对应的镜像中就有了
编写对应的DockerFile配置文件
在这里插入图片描述

构建镜像
在这里插入图片描述

创建对应的容器
在这里插入图片描述

在这里插入图片描述

测试访问
在这里插入图片描述

服务编排

微服务架构的应用系统中一般包含若干个微服务,每个微服务一般都会部署多个实例,如果每个微服务都要手动启停,维护的工作量会很大。

1.要从Dockerfile build image 或者去dockerhub拉取image
2.要创建多个container
3.要管理这些container(启动停止删除)

概念:

按照一定的业务规则批量管理容器

DockerCompose

概念介绍

Docker Compose是一个编排多容器分布式部署的工具,提供命令集管理容器化应用的完整开发周期,包括服务构建,启动和停止。使用步骤: 利用 Dockerfile 定义运行环境镜像 使用 docker-compose.yml 定义组成应用的各服务 运行 docker-compose up 启动应用

在这里插入图片描述

DockerCompose的安装使用

1.安装方法

# Compose目前已经完全支持Linux、Mac OS和Windows,在我们安装Compose之前,需要先安装Docker。下面我 们以编译好的二进制包方式安装在Linux系统中。 
curl -L https://github.com/docker/compose/releases/download/1.22.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
# 设置文件可执行权限 
chmod +x /usr/local/bin/docker-compose
# 查看版本信息 
docker-compose -version

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

2.卸载方法

# 二进制包方式安装的,删除二进制文件即可
rm /usr/local/bin/docker-compose

3、 使用docker compose编排nginx+springboot项目

1.创建docker-compose目录

mkdir ~/docker-compose
cd ~/docker-compose

在这里插入图片描述

2.编写 docker-compose.yml 文件

注意名字必须为

docker-compose.yml
#版本号
version: '3'
services:
  nginx:
  #对应的nginx镜像名称
   image: nginx
   #容器与虚拟机的端口映射
   ports:
    - 80:80
    #当前的项目可以访问到对应的app项目于下面定义的app相联系
   links:
    - app
    #挂载数据卷,前面为宿主机目录后面为容器的目录
   volumes:
    - ./nginx/conf.d:/etc/nginx/conf.d
  app:
  #对应应用的镜像名称
    image: app
    expose:
      - "8080"

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

3.创建./nginx/conf.d目录

mkdir -p ./nginx/conf.d

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

4.在./nginx/conf.d目录下 编写itheima.conf文件

server {
    listen 80;
    access_log off;
    location / {
        proxy_pass http://app:8080;
    }
   
}

在这里插入图片描述

5.在~/docker-compose 目录下 使用docker-compose 启动容器

docker-compose up

在这里插入图片描述

6.测试访问

http://192.168.149.135/hello

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/pjh88/article/details/114732026
今日推荐