目录
一、docker基本信息
1、dockerfile的构成
docker是一组由指令组成的文件,共有四个结构部分组成:
- 基础镜像层 #基础镜像信息一般是指linux的一些发行版本:centos等发行版
- 维护者信息 #申明开发者等信息的一个渠道
- 镜像操作指令 #镜像封装过程中执行的语句,常用的指令等会写在下面
- 容器启动时执行命令 #容器第一个启动的指令,例如:CMD
docker每行支持一个指令,每条指令可以携带多个参数,不同参数之间使用“ && ”隔开,也支持使用#开头的注释信息
2、dockerfile操作指令
指令 | 含义 |
---|---|
FROM | 开启一个新的镜像,必须写的一行指令 |
MAINTAINER名字 | 说明新镜像的维护人信息 |
RUN 命令 | 每个run都代表一条命令,每个run都是一个新的命令,在所基于的镜像上执行命令,并提交到新的镜像中 |
CMD [“要运行的程序”,“参数1,参数2”] | 指定启动容器的时候,需要运行的命令,或者脚本,dockerfile只能执行一条CMD,如果指定多条,则是只鞥执行最后一条 |
EXPOES 端口号 | 指定新镜像记载到docker是要开启的端口 |
ENV 环境变量 变量值 | 设置一个环境变量的值,会被后面的run使用 |
ADD 源文件/目录 目标文件/目录 | 将源文件复制到目标文件,源文件要与dockerfille位于相同的目录中,或者是一个url,同时也可以在复制的途中,对压缩包进行解压 |
copY 源文件/目录 目标文件/ 目录 | 将本地主机上的文件或者目录复制到目标地点,源文件或者目录要与dockerfile现在相同的目录中 |
VOLUME ["目录 "] | 在容器中创建一个挂载点 |
USER 用户名/UID | 指定运行容器的首用户 |
workdir 路径 | 移动到指定的目录位置,后续的一些列操作都视为在该目录下操作 |
HEALTHECK | 健康检查 |
上面这些就是在写封装容器镜像的时候,常用到的一些指令信息,每个指令都是代表一行,每一行都是代表的一层封装,层数越多,最终的镜像体积越大。可以合理的使用合并语句来减少封装的层数。例如一个RUN后面使用“ && ”跟随多个命令
3、镜像分层
容器的分层,大致可以分为四层:基础镜像、维护者信息、镜像操作指令、容器启动时执行命令。
在封装镜像的时候,可以对每步进行更改优化,即可是一个容器信息
例如:
容器层 |
---|
CMD [“Nginx”,"-g",“deamon off”] |
RUN ./conflgure --preflx && make && make install |
WORDIR /usr/local/Nginx-1.12.0 |
ADD Nginx-1.12.0.tar.gz /usr/local/ |
RUN yum install -y gcc gcc-c++ pcre pcre-devel make |
基础镜像层 centos (FROM centos:7) |
上面这个就是一个简易的容器镜像,将一个Nginx编译后封装为镜像。就像是我上面所讲的,在封装镜像的时候,需要注意封装的层数。包括这点,还需要注意另外的几点
- dockerfile中每个指令都会创建一个新的镜像层
- 镜像层会被缓存和复用,每层的指令都会被缓存,可以被多次使用,直到最后容器层被调用
- 当容器dockerfile的指令修改了,复制的文件变化了,或者构建镜像是指定的变量不同了,对应的镜像层缓存就会失效,后面的指令,都会将这个失效的指令再次执行一次,确定新的指令的有效性
- 在某一层的镜像失效后,它在之后的镜像层的缓存都会失效
- 镜像层是不可变的,如果在某一层中添加一个文件,然后再下一层删除,则镜像中依然还有这个文件,因为在下一层删除的是这个文件的缓存,而不是文件本身。
4、docker分层原理
1、联合挂载——AUFS
联合挂载是为了实现将一个容器中的每个小镜像,整合在一起,将其暴露给容器层。可以实现将其提供给容器层,来进行操作
2、docker镜像分层
docker镜像位于bootfs之上
- 每一层镜像的下一层惊喜那个成为父镜像
- 每一层镜像成为base image(操作系统会环境镜像)
- 容器层,可读可写,在最顶层,容器层以下都是readonly
3、docker镜像分层每层的名称
- container 读写层,容器层
- images 只读
- base image 基础镜像
- bootfs+rootfs+aufs/overlay2+LXC(kernel)
bootfs:作用引导加载内核,系统刚启动的时候没回加载bootfs文件系统,在docker镜像中,最底层就是bootfs
rootfs:rootfs是个性化的版本信息,含义是linux系统中的每个不同的版本信息。而bootfs是一种统一化的版本信息,含义是linux这个大类的操作系统,rootfs是在这个基础上的运行一些不同版本的操作系统,例如linux系统中的centos、Ubuntu等。
aufs:是一种联合挂载的功能,作用是实现将多个小镜像,连接在一起,将其暴露给容器
二、用dockerfile创建一个镜像
1、创建Dockerfile文件
FROM centos:7
ADD Nginx-1.12.0.tar.gz /tmp
RUN yum -y install pcre-devel zlib-devel gcc gcc-c++ make &> /dev/null \
&& useradd -M -s /sbin/nologin Nginx \
&& cd /tmp/Nginx-1.12.0/ \
&& ./configure \
--prefix=/usr/local/Nginx \
--user=Nginx \
--group=Nginx \
--with-http_stub_status_module &> /dev/null \
&& make &> /dev/null \
&& make install &> /dev/null \
&& ln -s /usr/local/Nginx/sbin/Nginx /usr/local/bin/ \
&& rm -rf /tmp/Nginx-1.12.0 \
&& cd /lib/systemd/system \
&& echo -e "[Unit] \
\nDescription=Nginx \
\nAfter=network.target \
\n[Service] \
\nType=forking \
\nPIDFile=/usr/local/Nginx/logs/Nginx.pid \
\nExecStart=/usr/local/Nginx/sbin/Nginx \
\nExecReload=/usr/bin/kill -s HUP $MAINPID \
\nExecStop=/usr/bin/kill -s QUIT $MAINPID \
\nPrivateTmp=true \
\n[Install] \
\nWantedBy=multi-user.target" > Nginx.service
ENV PATH $PATH:/usr/local/Nginx/sbin
copY Nginx.conf /usr/local/Nginx/conf/Nginx.conf
workdir /usr/local/Nginx
EXPOSE 80
CMD ["Nginx","-g","daemon off;"]
上面就是实际的编译Nginx的一个过程,对编译过程进行了简略的优化,将多个相同指令的容器层使用“ && ”进行合并。
并且,为了方便,事先把Nginx的配置文件配置好,复制一份放在了Dockerfile同目录中
tree
.
├── Dockerfile
├── Nginx-1.12.0.tar.gz
├── Nginx.conf
└── Nginx.service
2、运行Dockerfile文件
docker build -t Nginx:1.12 .
“ . ”代表的是运行当前目录下的Dockerfile文件,镜像名字为Nginx:1.12
输入命令之后,等待编译完成,完成之后查看镜像
docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Nginx 1.12 9c6cfe218d1c 55 seconds ago 466MB
刚刚创建的镜像已经成功了,下面我们再运行一下试试
docker run -d -p 8081:80 Nginx:1.12
docker PS -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
03d258d40fec Nginx:1.12 "Nginx -g 'daemon of…" 7 seconds ago Up 5 seconds 0.0.0.0:8081->80/tcp, :::8081->80/tcp heuristic_wescoff
启动成功之后,再去网站或者别的地方测试一下是否正常运行
curl http://192.168.75.51:8081
#因为我们上面暴露的端口是8081,所以在连接的时候需要进行指定这个端口信息
显示结果如下:
<!DOCTYPE html>
<html>
<head>
<title>Welcome to Nginx!</title>
<style>
body {
width: 35em;
margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif;
}
</style>
</head>
<body>
<h1>Welcome to Nginx!</h1>
<p>If you see this page, the Nginx web server is successfully installed and
working. Further configuration is required.</p>
<p>For online documentation and support please refer to
<a href="http://Nginx.org/">Nginx.org</a>.<br/>
Commercial support is available at
<a href="http://Nginx.com/">Nginx.com</a>.</p>
<p><em>Thank you for using Nginx.</em></p>
</body>
</html>
如果网站浏览是显示这个结果
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GV53Vt9i-1644143111540)(C:\Users\李洪坤\AppData\Roaming\Typora\typora-user-images\image-20220130193641105.png)]
有需要,也可以登录进容器内部,对容器进行一些管理
docker exec -it 03d258d40fec /bin/bash
#指定容器ID号,进行登录
到这里,dockerfile一些简单的原理就介绍完毕
```如果网站浏览是显示这个结果
[外链图片转存中…(img-GV53Vt9i-1644143111540)]
有需要,也可以登录进容器内部,对容器进行一些管理
docker exec -it 03d258d40fec /bin/bash
#指定容器ID号,进行登录
到这里,dockerfile一些简单的原理就介绍完毕