第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会在最顶层加载一个读写文件系统作为容器

第09讲:Docker镜像制作_第1张图片

三、对于三个问题就介绍

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

运行效果:

第09讲:Docker镜像制作_第2张图片

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

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

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

我创建了一个目录/usr/local/myfiles/,并将test.war上传到了该目录
第09讲:Docker镜像制作_第3张图片

002、从宿主机将test.war拷贝到容器

docker cp /usr/local/myfiles/test.war tomcat1:/usr/local/tomcat/webapps/test.war
## tomcat1为容器的名称

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

运行效果:

第09讲:Docker镜像制作_第4张图片

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

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

运行效果:

第09讲:Docker镜像制作_第5张图片

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

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

运行效果:

第09讲:Docker镜像制作_第6张图片

第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

运行效果:

第09讲:Docker镜像制作_第7张图片
浏览器运行效果:http://192.168.0.181:8080/test/index.html

第09讲:Docker镜像制作_第8张图片

实验2:制作MySQL镜像

第1步:创建MySQL容器

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

运行效果:

第09讲:Docker镜像制作_第9张图片

第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

运行效果:

第09讲:Docker镜像制作_第10张图片

05、重启docker容器,启动mysql容器

systemctl restart docker
docker start c_mysql

运行效果:

第09讲:Docker镜像制作_第11张图片

第3步:制作mysql镜像

docker  commit 9b8fa15d03a6 my_mysql:2.0

运行效果:

第09讲:Docker镜像制作_第12张图片

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

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

运行效果:

第09讲:Docker镜像制作_第13张图片

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

docker load -i mysql.tar

运行效果:

第09讲:Docker镜像制作_第14张图片

第6步:启动容器

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

运行效果:

第09讲:Docker镜像制作_第15张图片

容器已成功启动

第09讲:Docker镜像制作_第16张图片

第7步:测试容器

查看/work目录是否存在

docker exec -it c_mysql2 bash
cd /work

运行效果:

第09讲:Docker镜像制作_第17张图片

五、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文件

第09讲:Docker镜像制作_第18张图片

步骤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 [email protected]
  • 执行安装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 images

运行结果:

第09讲:Docker镜像制作_第19张图片

实验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 .

运行效果:


发现镜像文件已经做好了

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

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

运行效果:

测试浏览器访问:

第09讲:Docker镜像制作_第20张图片

你可能感兴趣的:(Docker,docker,linux,运维)