【Docker容器化】Dockerfile

  • dockerfile是一个文本的配置文件,它可以快速创建自定义的镜像。

  • 文本内容:包含了若干的命令行,并支持#作为注释行

  • 文本格式:基础镜像FROM维护者MAINTAINER,操作指令ADD,容器启动后指令等共计4部分

总结一句Dockerfile是用来定制镜像的文本文件。

🍃5.1 Docker镜像原理

思考:

  • Docker 镜像本质是什么?

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

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

操作系统组成部分:

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

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

  • bootfs:包含bootloader(引导加载程序)和 kernel(内核)
  • rootfs: root文件系统,包含的就是典型 Linux 系统中的/dev,/proc,/bin,/etc等标准目录和文件
  • 不同的linux发行版,bootfs基本一样,而rootfs不同,如ubuntu,centos等

在这里插入图片描述

docker镜像原理

  • Docker镜像是由特殊的文件系统叠加而成
  • 最底端是 bootfs,并使用宿主机的bootfs 、
  • 第二层是 root文件系统rootfs,称为base image
  • 然后再往上可以叠加其他的镜像文件
  • 统一文件系统(Union File System)技术能够将不同的层整合成一个文件系统,为这些层提供了一个统一的视角,这样就隐藏了多层的存在,在用户的角度看来,只存在一个文件系统。
  • 一个镜像可以放在另一个镜像的上面。位于下面的镜像称为父镜像,最底部的镜像成为基础镜像。
  • 当从一个镜像启动容器时,Docker会在最顶层加载一个读写文件系统作为容器
    在这里插入图片描述

回答问题

  1. Docker 镜像本质是什么?

    是一个分层文件系统

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

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

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

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

🍃5.2 镜像制作

🍵5.2.1 容器转镜像

转镜像

docker commit 容器id 镜像名称:版本号 

压缩

docker save -o 压缩文件名称 镜像名称:版本号 

解压

docker load –i 压缩文件名称

在这里插入图片描述

测试

# 创建tomcat镜像 (宿主机进行)
docker run -id --name=c_tomcat \ 
-p 8080:8080 \ 
-v $PWD:/usr/local/tomcat/webapps \ 
tomcat 

# 进入tomcat镜像 (宿主机进行)
docker exec -it c_tomcat /bin/bash 

#创建a.txt b.txt (容器中进行)
cd ~ 
touch a.txt b.txt

#容器转镜像 (宿主机进行)
docker commit 28b8d4dc9744 mjh_tomcat:1.0 

#压缩镜像 (宿主机进行)
docker save -o lxs_tomcat.tar mjh_tomcat:1.0 

#删除原来镜像 (宿主机进行)
docker rmi mjh_tomcat:1.0 

#从压缩文件加载镜像 (宿主机进行)
docker load -i mjh_tomcat.tar 

#产生镜像 (宿主机进行)
docker run -it --name=new_tomcat mjh_tomcat:1.0 /bin/bash 

#进入查看内容 (宿主机进行)
docker exec -it c_tomcat /bin/bash 

#可以看到a.txt b.txt存在,而webapps/test不存在 (容器中进行)

总结:

镜像的制作并不会将数据卷中的数据打包,只会将容器中的数据携带。

🍵5.2.2 dockerfifile

概念

  • Dockerfifile 是一个文本文件
  • 包含了一条条的指令
  • 每一条指令构建一层,基于基础镜像,最终构建出一个新的镜像
  • 对于开发人员:可以为开发团队提供一个完全一致的开发环境
  • 对于测试人员:可以直接拿开发时所构建的镜像或者通过Dockerfifile文件构建一个新的镜像开始工作了
  • 对于运维人员:在部署时,可以实现应用的无缝移植

参考Dochub网址:https://hub.docker.com ,比如centos和nginx镜像

在这里插入图片描述

案例一:自定义centos7镜像。

要求:

  1. 默认登录路径为 /usr

  2. 可以使用vim

实现步骤

  • 定义父镜像:FROM centos:7

  • 定义作者信息:MAINTAINER lxs lxs@lxs.cn

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

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

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

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

第一步:创建centos_dockerfile

#具体代码 
mkdir ~/docker-files 
cd ~/docker-files 
vim centos_dockerfile

第二步:配置centos_dockerfile,继承父镜像,centos_dockerfile具体内容 如下

FROM centos:7 
MAINTAINER mjh <mjh@mjh.com> 
RUN yum install -y vim 
WORKDIR /usr 
CMD /bin/bash

第三步:build

docker build -f ./centos_dockerfile -t lxs_centos:1 .
  • -f:镜像文件

  • -t:新镜像名

  • . 寻址路径

第四步:测试

#进入看效果
docker run -it --name=c2 mjh_centos:1
案例二:发布springboot项目
  • 定义父镜像:FROM java:8
  • 定义作者信息:MAINTAINER lxs lxs@163.com
  • 将jar包添加到容器: ADD springboot.jar app.jar
  • 定义容器启动执行的命令:CMD [“java”,“-jar”,“app.jar”]
  • 通过dockerfifile构建镜像:docker bulid –f dockerfifile文件路径 –t 镜像名称:版本 .

第一步:在docker-files中创建springboot_dockerfile

#具体代码 
[root@centos7 docker-files]# vim centos_dockerfile

第二步:配置springboot_dockerfile

FROM java:8
MAINTAINER mjh <mjh@123.com>

ADD springboot.jar app.jar

CMD ["java","-jar","app.jar"]

第三步:build

docker bulid –f ./springboot_dockerfile –t app .

第四步:启动容器

docker run -id -p 9000:8080 app

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Docker 中,一个已运行的容器是由一个镜像启动的,而镜像是由 Dockerfile 构建的。因此,一个已运行的容器并没有 Dockerfile,但是可以通过以下步骤找到镜像的 Dockerfile。 1. 查看容器的镜像 ID 首先,需要查看容器的镜像 ID。可以使用以下命令来列出所有正在运行的容器: ```bash docker ps ``` 然后,从输出结果中找到目标容器的 ID。 2. 查看镜像的历史记录 接下来,需要查看容器所使用的镜像的历史记录。可以使用以下命令来列出镜像的历史记录: ```bash docker history <image ID> ``` 将 `<image ID>` 替换为容器的镜像 ID。 这个命令会输出镜像的历史记录,包括每一层的 ID、创建时间、创建者和指令。镜像的每一层都是由 Dockerfile 中的一条指令构建的。 3. 定位 Dockerfile 根据镜像的历史记录,可以定位到创建镜像的 Dockerfile 中的每一条指令。可以从镜像的最后一层开始,向上查找,找到第一条指令。这些指令的顺序和 Dockerfile 中的顺序是相反的,因为 Dockerfile 是从上往下执行的,而镜像的历史记录是从下往上构建的。 通过这些指令,可以推断出 Dockerfile 中的每一条指令。如果 Dockerfile 文件还存在于本地或者 Git 仓库中,就可以直接查看 Dockerfile 文件。如果 Dockerfile 文件已经丢失,可以根据镜像的历史记录重新构建 Dockerfile 文件。 总之,虽然不能直接查询一个已运行的容器Dockerfile,但可以通过查询容器的镜像历史记录来推断 Dockerfile 中的每一条指令,并根据需要重新构建 Dockerfile 文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小满@

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值