dockerdockerfile编辑和镜像制作
Posted 遙遙背影暖暖流星
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了dockerdockerfile编辑和镜像制作相关的知识,希望对你有一定的参考价值。
一、镜像分层
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
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
以上是关于dockerdockerfile编辑和镜像制作的主要内容,如果未能解决你的问题,请参考以下文章
dockerDockerFile制作tomcat镜像并发布镜像到DockerHub