bootfs:包含bootloader (引导加载程序)和kernel (内核) rootfs: root文件系统,包含的就是典型Linux系统中的/dev,/proc,/bin,/etc等标准目录和文件。 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu、centos等
Docker镜像原理
![[Pasted image 20230920093626.png]]
- Docker镜像是由特殊的文件系统叠加而成
- 最底端是bootfs,使用宿主机的bootfs
- 所以再windows下不能安装一个linux镜像,因为宿主机的bootfs不同
- 第二层是root文件系统rootfs,称为base image
- 然后在往上可以叠加其他的镜像文件
- 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
- 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
- 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
镜像制作
![[Pasted image 20230920093639.png]] 要想把自己在docker中部署的服务转给别人,需要把容器先转为镜像,再传给别人把镜像还原成容器,就可以实现了。 但是镜像是不可以直接发送的,需要再把镜像做成压缩文件,就可以传了。
- 容器转为镜像
docker commit 容器id 镜像名称:版本号
docker save -o 压缩文件名称 镜像名称:版本号
docker load -i 压缩文件名称
这个方法没有办法保存卷里面的数据,解压缩镜像后就成为了一个全新的镜像
Dockerfile
- Dockerfile是一个文本文件,包含了一条条的指令
- 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
- 对于开发人员:可以为开发团队提供一个完全一致的开发环境
- 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfile文件构建一个新的镜像开始工作了
- 对于运维人员:在部署时,可以实现应用的无缝移植
通过dockerfile构建镜像: docker build -t 镜像名称:版本 [dockerfile文件路径]
Dockerfile关键字
ENTRYPOINT
是Dockerfile中的一个指令,用于指定容器启动时要执行的命令或可执行文件。它类似于CMD
指令,但是ENTRYPOINT
的参数不会被docker run
命令行中的参数覆盖。
ENTRYPOINT
指令的格式可以有两种形式:
ENTRYPOINT ["executable", "param1", "param2"]
:使用JSON数组的形式指定执行的可执行文件和参数。这种形式可以保留参数的原样性,不会被解释为字符串。ENTRYPOINT command param1 param2
:使用Shell形式指定执行的命令和参数。这种形式会被解释为字符串。
当容器启动时,ENTRYPOINT
指定的命令或可执行文件会作为容器的主进程运行。如果有多个ENTRYPOINT
指令,只有最后一个会生效。
使用ENTRYPOINT
指令的好处是可以确保容器始终运行指定的命令或可执行文件,而不会被覆盖或修改。这对于构建可复用的镜像和遵循最佳实践非常有用。
Dockerfile 案例
案例一:自定义centos7镜像
要求:默认登录路径为/user;可以使用vim
实现步骤
- 定义父镜像:
FROM centos:7
- 定义作者信息:
MAINTAINER itheima <itheima@itcastcn>
- 执行安装vim命令:
RUN yum install -y vim
- 定义默认的工作目录:
WORKDIR/usr
- 定义容器启动执行的命令:
CMD/bin/bash
最后还需要build
命令用Dockerfile构建
docker build
案例二:发布springboot项目
- 定义父镜像:
FROM java:8
- 定义作者信息:
MAINTAINER itheima <itheima@itcastcn>
- 将jar包添加到容器:
ADD springboot.jar app.jar
- 定义容器启动执行的命令:
CMDjar -jar app.jar
- 通过dockerfile构建镜像:
docker bulid -f dockerfile文件路径 -t 镜像名称:版本
使用 Dockerfile 定制镜像 · Docker -- 从入门到实践 (docker-practice.github.io)