docker(三)dockerfile编辑和镜像制作

一、镜像分层

Docker镜像含有启动容器所需要的文件系统及其内容,因此,其用于创建并启动docker容器
采用分层构建机制,最底层为bootfs,其之为rootfs
bootfs :用于系统引导的文件系统,包括bootloader和kernel,
容器启动完成后会被卸载以节约内存资源;
rootfs :位于bootfs之上,表现为docker容器的根文件系统;
·传统模式中,系统启动之时,内核挂载rootfs时会首先将其挂载为“只读"模式,完整性自检完成后将其重新挂载为读写模式;
docker中,rootfs由内核挂载为“只读"模式,而后通过“联合挂载"技术额外挂载一个“可写”层;、
在这里插入图片描述
docker images layer
·位于下层的镜像称为父镜像(parent image),最底层的称为基础镜像(baseimage)
·位于下层的镜像称为父镜像(父图像),最底层的称为基础镜像(基图)

最上层为“可读写"层,其下的均为“只读"层
最上层为“可读写”层,其下的均为“只读”层

在这里插入图片描述
aufs
advanced multi-layered unification filesystem,高级多层统一文件系统用于为Linux文件系统实现“联合挂载”
aufs是之前的UnionFS的重新实现,2006年由Junjiro Okajima开发;
Docker最初使用aufs作为容器文件系统层,它目前仍作为存储后端之一来支持;aufs的竞争产品是overlayfs,后者自从3.18版本开始被合并到Linux内核;
docker的分层镜像,除了aufs,docker还支持btrfs, devicemapper和vfs等
·在Ubuntu系统下,docker默认Ubuntu的 aufs;而在CentOS7上,用的是devicemapper;

Docker 镜像位于bootfs之上
每一层镜像的下一层成为父镜像
第一层镜像成为base image(操作系统环境镜像)
容器层(可读可写),在最顶层(writable)
容器层以下都是readonly

contaier 读写层
images (只读)
base image
bootfs + rootfs + aufs (kernel)
在这里插入图片描述

2、涉及技术:
① bootfs(boot file system)
主要包含bootloader和kernel

bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs

这一层与我们典型的Linux/Unix系统是一样的,包含boot加载器和内核。当boot加载完成之后整个内核就都在内存中了,此时内存的使用权已由bootfs转交给内核,此时系统也会卸载bootfs

在linux操作系统中(不同版本的linux发行版本),linux加载bootfs时会将rootfs设置为read-only,系统自检后会将只读改为读写,让我们可以在操作系统中进行操作

② rootfs (root file system)
在bootfs之上(base images,例如centos 、ubuntu)

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

rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等

③ 小结:为什么docker的centos镜像只有200M多一点

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

③ AUFS 与overlay/overlay2
AUFS是一种联合文件系统。它使用同一个Linux host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层

而docker 使用了overlay/overlay2存储驱动来支持分层结构
OverlayFS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载

overlay 结构:
overlayfs在linux主机上只有两层,一个目录在下层,用来保存镜像(docker),另外一个目录在上层,用来存储容器信息
1、rootfs    基础镜像
2、lower    下层信息 (为镜像层,容器)
3、upper    上层目录 (容器信息,可写)
4、worker    运行的工作目录(copy-on-write写时复制 -》准备容器环境)
5、mergod    “视图层”(容器视图)

docker 镜像层次结构小结
① base image :基础镜像
② image:固化了一个标准运行环境,镜像本身的功能-封装一组功能性的文件,通过统一的方式,文件格式提供出来
(只读)
③ container:容器层(读写)
④ docker-server 端 
⑤ 呈现给docker-client (视图)



在修改时,若upper层没有,则会将lower层有的文件复制到upper层进行修改并保存结果
[root@docker ~]# cd 
[root@docker ~]# mkdir demo
[root@docker ~]# cd demo
[root@docker demo]# mkdir lower upper woker
[root@docker demo]# echo “lower.aaaa” > lower/aaaa
[root@docker demo]# echo “lower.bbbb” > lower/bbbb
[root@docker demo]# echo “upper.bbbb” > upper/bbbb
[root@docker demo]# echo “upper.cccc” > upper/cccc
[root@docker demo]# yum -y install tree
[root@docker demo]# tree .
.
├── lower
│   ├── aaaa
│   └── bbbb
├── upper
│   ├── bbbb
│   └── cccc
└── woker
[root@docker demo]# mkdir mergod

在这里插入图片描述

二、镜像挂载

在这里插入图片描述

1、docker数据卷

数据卷:挂载宿主系统的存储空间
docker run -v /容器名:/目录的路径 --name 容器名 -it centos:7 /bin/bash

[root@docker demo]# docker run -v /test1:/test1 --name test1 -it centos:7 /bin/bash
[root@8f53c1247122 /]# cd /test1/
[root@8f53c1247122 test1]#  echo "wozailimian" > test1
[root@8f53c1247122 test1]# ls
test1


#返回宿主机查看
[root@8f53c1247122 test1]# exit
exit
[root@docker demo]#
[root@docker demo]# cd
[root@docker ~]# cd /test1/
[root@docker test1]# cat test1
wozailimian


2、数据卷容器

数据卷容器:挂载容器的存储空间

#创建数据卷容器test2

[root@docker test1]# docker run --name test2 -v /data1 -v /data2 -it centos:7 /bin/bash
#指定要挂载的两个目录
[root@f2c485dc89a8 /]# exit
exit

#创建新容器test3并挂载数据卷容器目录

[root@docker test1]# docker run -it --volumes-from test2 --name test3 centos:7 /bin/bash
#挂载来源为test2
[root@dc36a405ceca /]#

#测试

[root@dc36a405ceca /]# ls
anaconda-post.log  data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                data2  etc  lib   media  opt  root  sbin  sys  usr
#出现了/data1 和/data2
[root@dc36a405ceca /]# echo "wozaitest3" >/data1/test3
[root@dc36a405ceca /]# echo "wozaitest3" >/data2/test3
[root@dc36a405ceca /]# exit
exit

#到test2查看

[root@docker ~]# docker ps -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS                      PORTS                                         NAMES
dc36a405ceca   centos:7               "/bin/bash"              4 minutes ago    Exited (0) 47 seconds ago                                                 test3
f2c485dc89a8   centos:7               "/bin/bash"              7 minutes ago    Exited (0) 7 minutes ago                                                  test2
8f53c1247122   centos:7               "/bin/bash"              17 minutes ago   Exited (0) 28 minutes ago                             test1
[root@docker test1]# docker start f2c485dc89a8
f2c485dc89a8
[root@docker ~]# docker exec -it f2c485dc89a8 /bin/bash
[root@f2c485dc89a8 /]# ls
anaconda-post.log  data1  dev  home  lib64  mnt  proc  run   srv  tmp  var
bin                data2  etc  lib   media  opt  root  sbin  sys  usr
[root@f2c485dc89a8 /]# cd data1
[root@f2c485dc89a8 data1]# cat test3
wozaitest3
#挂载成功

三、dockerfile文件编辑和镜像制作

语句说明

FROM		#基础镜像,一切从这里开始构建
MAINTAINER	#镜像是谁写的,姓名+邮箱
RUN			#镜像构建的时候需要运行的命令
ADD			#步骤,tomcat镜像,这个tomcat的压缩包!添加内容
WORKDIR		#镜像的工作目录	
VOLUME		#挂载的目录
EXPOSE		#暴露端口配置
CMD			#指定这个容器启动的时候要运行的命令,只有最后一个会生效,可被替代
ENTRYPOINT	#指定这个容器启动的时候要运行的命令,可以追加命令
ONBUILD		#当构建一个被继承 Dockerfile 这个时候就会运行ONBUILD 的指令
COPY 		#类似ADD,将我们文件拷贝到镜像中
ENV			#构建的时候设置环境遍量
2、ADD和copy区别是什么
copy = cp复制,将宿主机指定的文件复制到image层中
ADD可以复制,同时兼有了解压的功能;add nginx-1.12.tar.gz/root/nginx
在复制进去的同时会对压缩包进行解压-》容器内部就是ginx-1.12
add复制的对象可以是URL,跨节点的数据(URL)
 CMD和entrypoint的区别
都是容器启动时要加载的命令
①cmd是容器环境启动时默认加载的命令
②entrypoint是容器环境启动时第一个加载的命令程序/脚本程序init

如果 ENTRYPOINT使用了shell模式,CMD指令会被忽略。
entrypoint ["sh","-c", "echo $HOME"]
cmd [ "restart" ] #CND会被忽略
如果 ENTRYPOINT使用了exec模式,CMD指定的内容被追加为ENTRYPOINT 指定命令的参数。
entrypoint ["/etc/init.d/nginx"]
cmd [ "restart"]  #CMD作为entrypoint的参数
如果 ENTRYPOINT使用了exec模式,CMD也应该使用exec模式。

例如:
同一个dockerfile中有多个cmd指令的话,哪个生效?
答:最后一个生效
如果dockerfile中有多个cmd命令同时,docker build -t nginx:new
/bin/bash 哪个生效?:docker build指定的生效
如果dockerfile中cmd和entrypoint同时存在哪个生效呢
答:看情况,如果都是默认加载的类型:
cmd :默认加载的命令/执行程序
entrypoint:第一个加载的环境
exec方式启动的话,那么entrypoint会覆盖,或将cmd做为entrypoint传入参数
shell 方式启动的话,直接就是entrypoint生效

exec模式与shell模式:
exec:容器加载时使用的启动的第一个任务进程
shell:容器加载时使用的第一个bash


1、编辑Dockerlife文件和所需脚本

[root@docker ~]# mkdir tomcat
[root@docker ~]# cd tomcat/
#将安装服务所用的软件包上传到本目录下
[root@docker tomcat]# ls
apache-tomcat-9.0.16.tar.gz   jdk-8u201-linux-x64.rpm 

[root@docker tomcat]# vim Dockerfile
FROM centos:7
MAINTAINER llq
EXPOSE 8080

ADD jdk-8u201-linux-x64.rpm /usr/local/src
WORKDIR /usr/local/src
RUN rpm -ivh jdk-8u201-linux-x64.rpm
ENV JAVA_HOME /usr/java/jdk1.8.0_201-amd64
ENV CLASSPATH $JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
ENV PATH $JAVA_HOME/bin:$PATH

ADD apache-tomcat-9.0.16.tar.gz /usr/local/src
RUN mv apache-tomcat-9.0.16/ /usr/local/tomcat9
ENV PATH /usr/local/tomcat9/bin/:$PATH
ADD tomcat9.run.sh /usr/local/src
RUN chmod 755 /usr/local/src/tomcat9.run.sh
CMD ["/usr/local/src/tomcat9.run.sh"]
#ENTRYPOINT ["/usr/local/tomcat9/bin/catalina.sh","run"]

..................................

[root@docker tomcat]# vim tomcat9.run.sh
#!/bin/bash
/usr/local/tomcat9/bin/catalina.sh run

[root@docker tomcat]# ls
apache-tomcat-9.0.16.tar.gz   Dockerfile  jdk-8u201-linux-x64.rpm  tomcat9.run.sh

2、开始创建镜像

[root@docker tomcat]# docker build -t tomcat:new .   #.表示当前目录
[root@docker tomcat]# docker images
REPOSITORY    TAG              IMAGE ID       CREATED        SIZE
tomcat        new              03af090bdc62   3 hours ago    807MB    #创建成功
nginx         1.21             8345d48257de   8 hours ago    132MB
redis         6.2-alpine3.14   f6f2296798e9   4 days ago     32.3MB
busybox       latest           42b97d3c2ae9   11 days ago    1.24MB
nginx         lnmp             dd34e67e3371   2 weeks ago    133MB

3、登陆验证

[root@docker tomcat]# docker run -itd  --name tomcat1 -P tomcat:new
d6d9fc90f73a5c60c2e58a38b440aa46007021495ca1e92e4fe8ccca787aa5af
#开启并跑着后端且随机分配端口
[root@docker tomcat]# docker ps -a
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                         NAMES
d6d9fc90f73a   tomcat:new             "/usr/local/src/tomc…"   12 seconds ago   Up 12 seconds   0.0.0.0:49153->8080/tcp, :::49153->8080/tcp   tomcat1
#随机分配的端口为49153

在这里插入图片描述

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Docker是一款非常流行的容器化工具,可以通过在Docker中运行镜像来实现容器化。在使用Docker的时候,我们可以通过编写Dockerfile文件来配置、构建和部署Docker镜像。 首先,我们需要在Windows系统上安装Docker,确保Docker已经正确安装并升级到最新版本。然后,我们可以使用任何文本编辑器创建Dockerfile文件。Dockerfile文件包含用于构建Docker镜像的所有指令和配置。以下是一些基本的指令: - FROM:指定所需的基础镜像 - RUN:在容器内执行命令 - COPY:将文件从本地文件系统复制到容器中 - WORKDIR:设置容器内的工作目录 - EXPOSE:声明容器将使用的端口 - CMD:指定容器启动时运行的命令 例如,我们可以使用以下Dockerfile文件在Windows系统上制作一个简单的Docker镜像: ``` # 使用基于Windows Server Core的镜像 FROM mcr.microsoft.com/windows/servercore:ltsc2019 # 安装IIS RUN Install-WindowsFeature Web-Server # 复制Web应用程序文件夹 COPY website/ c:\inetpub\wwwroot\ # 指定容器端口 EXPOSE 80 # 设置工作目录 WORKDIR c:\inetpub\wwwroot # 设置默认命令 CMD ["cmd.exe", "/k", "ping 127.0.0.1 -t"] ``` 在终端中,我们可以使用以下命令从Dockerfile文件中构建镜像: ``` docker build -t myimage . ``` 该命令会在当前目录中查找Dockerfile文件,然后使用该文件中的指令来构建镜像并指定名称为“myimage”。 总的来说,在Windows系统上配置Dockerfile文件制作镜像需要了解Dockerfile文件的语法和指令,以及对目标应用程序和环境的设置和配置。使用Dockerfile文件构建镜像可以自动化镜像构建和部署的过程,提高了开发和部署的效率。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值