第09讲:Docker镜像制作

这篇具有很好参考价值的文章主要介绍了第09讲:Docker镜像制作。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

         我们可以在容器去部署应用,然后把容器转为镜像给测试人员用,由于镜像是不能直接传输的,所以我们将新的镜像转成压缩文件,给测试人员。测试人员把我们的压缩文件还原成一个新的镜像。

一、Linux文件系统组成

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

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

思考:

  • Docker 镜像本质是什么?
  • Docker 中一个centos镜像为什么只有200MB,而一个centos操作系统的iso文件要几个G?
  • Docker 中一个tomcat镜像为什么有500MB,而一个tomcat安装包只有70多MB?

二、Docker 镜像原理

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

docker编辑镜像,Docker,docker,linux,运维

三、对于三个问题就介绍

01、 Docker 镜像本质是什么?

Docker 镜像本质是一个分层文件系统

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

我们下载centos镜像很小,是因为centos镜像层复用了宿主机的bootfs,下载的只有rootfs,所以centos是很小的

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

我们下载tomcat镜像大小是600+MB,是因为里面还包含了jdk和centos这两个镜像层,所以很大,另外需要注意一点的是,这个tomcat镜像里面包含了jdk镜像和centos基础镜像,为什么基础镜像是centos而不是ubuntu呢?这是由做这个tomcat镜像的发行商决定的。

四、普通方式制作镜像

docker commit 容器id 镜像名称:版本号     #把容器做成镜像
docker save -o 压缩文件名称 镜像名称:版本号  #把镜像做成压缩包,放到宿主机的某个位置
docker load –i 压缩文件名称     #别人(测试人员)加载镜像(压缩包)

Tips:容器转为镜像,如果容器有挂载的内容,做成新镜像的时候,挂载的内容是不会载入到镜像里面的

实验1:制作tomcat镜像

第1步:创建tomcat容器

docker run -id --name=tomcat1 -p 8080:8080 tomcat:8

运行效果:

docker编辑镜像,Docker,docker,linux,运维

第2步:把宿主机的某个war包拷贝到容器的某个目录里面,这样将来做镜像时,war包会加载到镜像里

实验中的war包下载地址:test.war

001、上传test.war到CentOS宿主机

我创建了一个目录/usr/local/myfiles/,并将test.war上传到了该目录
docker编辑镜像,Docker,docker,linux,运维

002、从宿主机将test.war拷贝到容器
docker cp /usr/local/myfiles/test.war tomcat1:/usr/local/tomcat/webapps/test.war
## tomcat1为容器的名称

注意:不能将内容拷贝到tomcat容器的挂载目录,如果放到里面,做成镜像时,该目录下的内容不会载入镜像里面

运行效果:

docker编辑镜像,Docker,docker,linux,运维

第3步:把tomcat容器做成镜像

#语法:docker commit 容器名称 生成的镜像名称:版本号
docker commit tomcat1 my_tomcat:1.0
docker images   #可以查看到my_tomcat镜像,版本号是1.0

运行效果:

docker编辑镜像,Docker,docker,linux,运维

第4步:把镜像做成压缩包放到宿主机的某个位置

docker save -o my_tomcat.tar my_tomcat:1.0   #-o:output 压缩文件保存到/root目录下

运行效果:

docker编辑镜像,Docker,docker,linux,运维

第5步:把压缩文件载入镜像(第三方载入该压缩包)

docker run -id --name=tomcat2 -p:8080:8080 my_tomcat:1.0
docker exec -it tomcat2 bash  #进入容器,进入webapps/目录可以看到test.war存在

Tip:由于之前tomcat1已经运行,8080端口被占用,所以在启动容器之前先把之前的tomcat容器停掉

docker stop tomcat1

运行效果:

docker编辑镜像,Docker,docker,linux,运维
浏览器运行效果:http://192.168.0.181:8080/test/index.html

docker编辑镜像,Docker,docker,linux,运维

实验2:制作MySQL镜像

第1步:创建MySQL容器

docker run -id --name=c_mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Aa123123. mysql:8.0.16

运行效果:

docker编辑镜像,Docker,docker,linux,运维

第2步:进入容器,修改mysql的数据文件位置

        当创建一个数据库容器的时候,数据库文件默认是放在/var/lib/mysql,比如我们用外部客户端naticat导入一个数据文件,也会放到/var/lib/mysql目录里,这样在做成镜像时,var目录的内容是不会复制到镜像里面去的。那么就要修改容器里面的mysql的data数据库目录的位置 如:把/var/lib/mysql 放到/work下

01、进入c_mysql容器
docker exec -it c_mysql bash
02、拷贝mysql的数据目录
cp -r /var/lib/mysql   /work/
03、安装vim
apt-get update
apt-get install vim
04、修改mysql配置文件

修改/etc/mysql/my.cnf文件,找到 datadir这行修改为 datadir=/work/mysql

cd /etc/mysql
vi my.cnf

运行效果:

docker编辑镜像,Docker,docker,linux,运维

05、重启docker容器,启动mysql容器
systemctl restart docker
docker start c_mysql

运行效果:

docker编辑镜像,Docker,docker,linux,运维

第3步:制作mysql镜像

docker  commit 9b8fa15d03a6 my_mysql:2.0

运行效果:

docker编辑镜像,Docker,docker,linux,运维

第4步:导出mysql镜像到宿主机

docker save -o mysql.tar my_mysql:2.0 #-o:output 压缩文件保存到/root目录下

运行效果:

docker编辑镜像,Docker,docker,linux,运维

第5步:把压缩文件载入镜像(第三方载入该压缩包)

docker load -i mysql.tar

运行效果:

docker编辑镜像,Docker,docker,linux,运维

第6步:启动容器

docker run -id --name=c_mysql2 -p 3306:3306 -e MYSQL_ROOT_PASSWORD=Aa123123. my_mysql:2.0 /bin/bash

运行效果:

docker编辑镜像,Docker,docker,linux,运维

容器已成功启动

docker编辑镜像,Docker,docker,linux,运维

第7步:测试容器

查看/work目录是否存在

docker exec -it c_mysql2 bash
cd /work

运行效果:

docker编辑镜像,Docker,docker,linux,运维

五、dockerfile方式

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

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

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上下文 可以来源于远程服务, ADD 源路径 目标路径
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

实验1:自定义centos7镜像

需求
1、默认登录路径为 /usr
2、可以使用vim

步骤1:创建centos-dockerfile文件

docker编辑镜像,Docker,docker,linux,运维

步骤2:文件内容如下

将一下内容拷贝到centos-dockerfile文件中

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

代码解释:

  • 定义父镜像:FROM centos:7
  • 定义作者信息:MAINTAINER woniu woniu@woniu.cn
  • 执行安装vim命令: RUN yum install -y vim
  • 定义默认的工作目录:WORKDIR /usr
  • 定义容器启动执行的命令:CMD /bin/bash

步骤3:通过dockerfile文件构建镜像

语法:docker build –f dockerfile的文件路径 –t 镜像名称:版本 .

docker build -f ./centos-dockerfile -t qin_centos:1 .

Ps
利用当前centos-dockerfile文件构建镜像 -t qin:1 指定新镜像的名称和版本, 后面的 . 不能省略
参数:-f 表示dockerfile -t 表示tag

运行结果:

docker编辑镜像,Docker,docker,linux,运维
查看自定义的镜像是否构建完毕

docker images

运行结果:

docker编辑镜像,Docker,docker,linux,运维

实验2:定义dockerfile文件构建镜像,发布springboot项目

第1步:上传jar包

当前案例将jar包上传到/usr/local/docker-file目录下

案例jar包下载地址:dockerfile-demo-0.0.1-SNAPSHOT.jar

第2步:创建dockerfile文件并编写内容

FROM java:8
MAINTAINER  qin<15543563186@163.com>
ADD dockerfile-demo-0.0.1-SNAPSHOT.jar app.jar   
CMD java -jar /app.jar

第3步:通过dockerfile构建镜像

docker build -f  ./springboot-dockerfile -t  springboot-app:1.0 .

运行效果:

docker编辑镜像,Docker,docker,linux,运维
发现镜像文件已经做好了

docker编辑镜像,Docker,docker,linux,运维

第4步:通过springboot-app:1.0镜像创建容器

docker run -it --name=app -p 8080:8080 springboot-app:1.0

运行效果:
docker编辑镜像,Docker,docker,linux,运维
测试浏览器访问:

docker编辑镜像,Docker,docker,linux,运维文章来源地址https://www.toymoban.com/news/detail-759969.html

到了这里,关于第09讲:Docker镜像制作的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • IDEA制作docker镜像推送到docker hub和阿里云镜像仓库

    IDEA制作docker镜像推送到docker hub和阿里云镜像仓库

    学习如何本地制作镜像推送到远程仓库管理,希望可以帮到有需要的人 准备工作:         1.注册docker hub账号,下载Docker Desktop Windows版本         2.注册阿里云账号,开通容器镜像服务个人版 注意事项 Docker Desktop的安装教程网上有很多,这里不做教程,这里提醒一点避免安

    2024年01月19日
    浏览(49)
  • docker 镜像的制作

    本文主要介绍镜像制作,以及周边比如镜像支持中文等问题 将本机系统里主要文件打成tar 包,然后编写dockerfile.txt 文件,最后docker build,以下以centos 7.9 为例 2.1.1 制作tar 包 2.1.2 编写dockerfile.txt 可以借鉴dockerhub 官网的的dockerfile 2.1.3 制作docker image centos79dockerfile.txt 跟systemcent

    2024年02月09日
    浏览(49)
  • docker制作镜像

    docker制作镜像有两种: 1.docker  build dockerfile  2.基于容器制作镜像 语法:docker  commit   options  容器名称 参数: -a:作者 -c:修改dockfile创建的镜像 -m:提交信息 -p:在提交期间暂停容器  例子: 一台主机可以有多个dockerfile,并且dockerfile中涉及的文件需要和当前dockerfile同

    2024年02月14日
    浏览(48)
  • 多架构Docker镜像制作

    从https://github.com/docker/buildx/releases网站下载二进制文件到本地并重命名为docker-buildx,移动到 docker 的插件目录 ~/.docker/cli-plugins。 增加可执行权限:

    2024年02月13日
    浏览(61)
  • docker || nginx镜像制作

    docker || nginx镜像制作

        1.以centos7作为基础镜像     2.安装好ip,vim,ping命令     3.编译安装nginx(编写脚本)     4.使用指定的配置文件nginx.conf       5.启动容器的时候启动nginx     6.网站的网页上传到容器里:              1.直接做到镜像里             2.使用数据卷挂载使

    2024年02月08日
    浏览(50)
  • docker 制作tomcat镜像

    需要下载tomcat安装包和jdk安装包,我这边下载的jdk版本分别为(jdk和tomcat版本需要对应上) 创建一个readme.txt空文件 创建一个Dockerfile文件 构建镜像 查看镜像 创建容器并启动容器

    2024年02月14日
    浏览(11)
  • Docker镜像与制作

    Docker镜像与制作

    Docker镜像是没有内核的,镜像在启动为容器后将直接使用宿主机的内核。 Docker镜像的制作分为了手动制作和自动制作(基于DockerFile) 先准备一个目录, 编写Dockerfile文件 在该目录下编写nginx.conf文件 构建docker镜像: -f 后跟Dockerfile所在的路径 -t 后跟构建的镜像名 :v1 表示版本

    2024年02月04日
    浏览(12)
  • docker镜像制作

    docker镜像制作

    FROM:指定构建使用的基础镜像,FROM命令必须写在其他的指令前 MAINTAINER:用于为Dockerfile署名 ADD:复制文件并解压到镜像中的指定位置 ENV:设置镜像中的环境变量 COPY:类似于ADD,将CentOS7中的文件赋值到镜像中的某个位置 RUN:普通命令,后面紧跟具体的操作指令 EXPOSE:声明

    2023年04月22日
    浏览(11)
  • Docker制作SpringBoot镜像

    Docker制作SpringBoot镜像

    Dcokerfile目录 编写Dockerfile 在dockerfile中,声明了操作系统的环境变量,暴露了端口号,用CMD命令指定容器启动后的命令,这里是启动jar包。 注意: CMD 命令不要写在一个字符串中,而是要以数组的形式分开写。 镜像构建 docker build -t app:1.0 . 查看镜像 这些镜像名和标签名都是

    2024年02月14日
    浏览(15)
  • 【运维知识大神篇】运维人必学的Docker教程1(Docker安装部署+Docker镜像管理+容器管理常用命令+搭建docker的本地yum源+windows系统安装docker环境)

    【运维知识大神篇】运维人必学的Docker教程1(Docker安装部署+Docker镜像管理+容器管理常用命令+搭建docker的本地yum源+windows系统安装docker环境)

    本篇文章开始给大家介绍Docker,这个是我非常喜欢的一个服务,介绍给大家,希望大家也能喜欢! 目录 何为容器 Docker环境安装部署 一、yum安装(CentOS7.9) 二、rpm包安装(CentOS) 三、卸载docker环境 四、安装指定的docker版本 五、Ubuntu安装docker环境 六、使用deb安装docker 七、

    2024年01月18日
    浏览(55)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包