栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 系统运维 > 运维 > Linux

Dockerfile

Linux 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Dockerfile

一、Dockerfile

创建镜像的几种方式
① 基于已有的模板文件进行创建 ,镜像导出、导入 docker save 、docker load
② 基于已有的镜像进行创建
③ dockerfile

1、dockerfile分层原理

(1)、docker镜像分层(基于AUFS构建):
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多一点

bootfs + rootfs :作用是加载、引导内核程序 + 挂载使用linux 操作系统(centos ubantu)等等一些关键的目录文件

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

(1)AUFS 与 overlay/overlay2 (docker 高版本)

AUFS是一种联合文件系统。它使用同一个Linux host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层,而docker 使用了overlay/overlay2存储驱动来支持分层结,Overlay FS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载.

(2)overlay 结构:

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

(3)docker 镜像层次结构小结

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

在修改时,若upper层没有,则会将lower层有的文件复制到upper层进行修改并保存结果

“小”demon (联合挂载):
[root@node1 mnt]# echo “lower.aaaa” > lower/aaaa
[root@node1 mnt]#
[root@node1 mnt]# echo “lower.bbbb” > lower/bbbb
[root@node1 mnt]#
[root@node1 mnt]# echo “upper.bbbb” > upper/bbbb
[root@node1 mnt]#
[root@node1 mnt]# echo “upper.cccc” > upper/cccc
[root@node1 mnt]# mount -t overlay overlay -o lowerdir=lower,upperdir=upper,workdir=work merged
[root@node1 mnt]# df -hT
文件系统 类型 容量 已用 可用 已用% 挂载点
/dev/sda3 xfs 37G 4.2G 33G 12% /
devtmpfs devtmpfs 896M 0 896M 0% /dev
tmpfs tmpfs 911M 0 911M 0% /dev/shm
tmpfs tmpfs 911M 19M 893M 3% /run
tmpfs tmpfs 911M 0 911M 0% /sys/fs/cgroup
/dev/sda1 xfs 1014M 165M 850M 17% /boot
tmpfs tmpfs 183M 12K 183M 1% /run/user/42
tmpfs tmpfs 183M 0 183M 0% /run/user/0
overlay overlay 37G 4.2G 33G 12% /var/lib/docker/overlay2/d00640d71009bfb6bb39562ff5a707bb59775a90fde92bc86aca3985fe1aae4a/merged
overlayfs:/overlay overlay 37G 4.2G 33G 12% /mnt/merged
[root@node1 mnt]# tree .
.
├── lower
│ ├── aaaa
│ └── bbbb
├── merged
│ ├── aaaa
│ ├── bbbb
│ └── cccc
├── upper
│ ├── bbbb
│ └── cccc
└── work
└── work

5 directories, 7 files

GB 大的镜像()

PS:
每次推送到docker hub 只推送增量部分(底包毕竟大,增量推送给/更新部分比较小)
所以生产上,只要你执行的镜像再推送的时候增量部分控制到比较小的一个范围就可以

二、 dockerfile编写 1、概述

Dockerfile是由一组指令组成的文件
Dockerfile结构四部分
基础镜像信息 (指定操作系统镜像是什么镜像、什么版本)
【维护者信息】 ()
镜像操作指令 ()
容器启动时执行指令 (启动容器的时候,执行的脚本/命令参数等等)
Dockerfile每行支持一条指令,每条指令可携带多个参数,支持使用以“#“号开头的注释 &&

2、构建镜像命令(ps:可在构建镜像时指定资源限制)

示例:
docker build -t nginx:test .
-t : tag 打标签
-f : 指定dockerfile 目录
. : 指构建镜像时使用的环境(当前)目录,构建镜像时使用的上下文环境

PS:
ADD :支持将远程URL的资源加入到镜像的文件系统
COPY:只复制

CMD 与entrypoint
:都是容器启动时要加载的命令
exec 模式 与shell模式
exec: 容器加载时使用的启动的第一个任务进程
shell: 容器加载时使用的第一个bash(/bin/bash /bin/sh /bin/init)
自检完成后,加载第一个pid = 1 进程
shell 翻译官/解释器,解析
echo $PATH

demon示例:
[root@node1 test]# vim Dockerfile
FROM centos:7
CMD [“top”]
[root@node1 test]# docker build -t centos:test001 .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM centos:7
—> f3f09806d529
Step 2/2 : CMD [“top”]
—> Running in 780cc8c73a3b
Removing intermediate container 780cc8c73a3b
—> ec98bd6ee8ef
Successfully built ec98bd6ee8ef
Successfully tagged centos:test001
[root@node1 test]# docker run -itd --name test centos:test001 [/bin/bash]
fa24189908f772bbad3f19cbe5438adbeb69c27b3160bebb33a4d4967584db50
[root@node1 test]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
fa24189908f7 centos:test001 “top” 2 seconds ago Up 2 seconds test
938f257a5dae nginx:latest “/docker-entrypoint.…” 8 hours ago Up 8 hours 80/tcp thirsty_hofstadter
[root@node1 test]# docker exec test ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.4 0.1 56156 1948 pts/0 Ss+ 11:59 0:00 top
root 8 0.0 0.0 51732 1704 ? Rs 11:59 0:00 ps aux

3、而使用exec模式是无法输出环境变量的

示例:
[root@node1 test01]# cat Dockerfile
FROM centos:7

CMD [“echo”,“$HOME”]
[root@node1 test01]# docker run --rm centos:v1 ##–rm 一次性运行(删除)
$HOME

##shell模式
[root@node1 test01]# cat Dockerfile
FROM centos:7
CMD [“sh”,“-c”,“echo $HOME”]
[root@node1 test01]# docker run --rm centos:v2
/root

/bin/sh -c nginx shell 模式
nginx exec模式

cmd 是容器环境启动时默认加载的命令
entrypoint 是容器环境启动时第一个加载的命令程序/脚本程序 init

init pid 1

小结:

如果 ENTRYPOINT 使用了 shell 模式,CMD 指令会被忽略。

如果 ENTRYPOINT 使用了 exec 模式,CMD 指定的内容被追加为 ENTRYPOINT 指定命令的参数。

如果 ENTRYPOINT 使用了 exec 模式,CMD 也应该使用 exec 模式。

entrypoint [“sh”,“-c”,“echo $HOME”]
#cmd [“restart”]

nginx restart

#####参数

mkdir nginx
cd nginx/
//拷贝nginx-1.12.0源码包到 nginx/中

vim Dockerfile

#基于基础镜像(centos 需小写)
FROM centos:7
#用户信息(可选)
MAINTAINER this is nginx image
#添加环境包
RUN yum -y update
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make
RUN useradd -M -s /sbin/nologin nginx
#传入、解压nginx软件包
ADD nginx-1.12.0.tar.gz /usr/local/src
VOLUME [“/usr/local/nginx/html”]
WORKDIR /usr/local/src
#指定工作目录
WORKDIR nginx-1.12.0
RUN ./configure
–prefix=/usr/local/nginx
–user=nginx
–group=nginx
–with-http_stub_status_module && make && make install
ENV PATH /usr/local/nginx/sbin:$PATH
#指定http和https端口
EXPOSE 80
RUN echo “daemon off;”>>/usr/local/nginx/conf/nginx.conf
CMD nginx

4、基于dockerfile文件构建镜像命令

完整的写发: docker build -f dockerfile -t nginx:new .
docker build : 基于dockerfile 构建镜像
-f :指定dockerfile 文件(默认不写的话指的是当前目录)
-t :(tag) 打标签 ——》nginx:new
. :专业说法:指的是构建镜像时的上下文环境,简单理解:指的当前目录环境中的文件

docker build -t nginx:new .

docker run -d -P nginx:new

docker ps -a

小结:

构建nginx 镜像

① 创建一个对应的目录(mkdir nginx)
② 编写Dockerfile 文件(最简单的方式,nginx部署脚本 放进去 每条命令用RUN 执行,环境变量使用ENV,移动到对应
目录使用workdir,最后使用CMD 进行启动设置)
③ 在nginx目录中上传nginx-1.12.0.tar.gz 软件包 等文件
④ docker build 创建
⑤ docker run 运行容器
⑥ 检验

要求:
① dockerfile 编写tomcat 文件
②docker 部分 (写完之后,要求写思路 ——> ② 优化)
使用dockerfile 编写lnmp +wordprocess
dockerfile 技术 + 数据卷

优化四种方式——>基于docker镜像分层的原理来的
① 每一条RUN 指令 都会生成一层新的镜像层
② 每一层镜像缓存会继承到下一层中 ——>直接影响到镜像的大小

优化方案
① 减少RUN 指令的使用
RUN yum -y update
RUN yum install -y gcc gcc-c++
整合为yum install -y gcc gcc-c++ && yum -y update

② 将执行后的缓存/不用的输出丢入黑洞 (减少缓存)
yum install -y gcc gcc-c++ && yum -y update > /dev/null

③ 多阶段构建

④ 使用更小体积的linux 发行版本

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/868353.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号