docker—dockerfile

一、分层原理

1、docker镜像分层(基于AUFS构建)
2、Docker 镜像位于bootfs之上
3、每一层镜像的下一层成为父镜像
4、第一层镜像成为base image(操作系统环境镜像)
5、容器层(可读可写),在最顶层(writable),容器层以下都是readonly。
每一层镜像会把自己的缓存交给上一层,第二层将自己的镜像缓存和第一层的镜像缓存交给第三层。以此传给work层,然后下面的每层将组合缓存删除,保留自己的镜像缓存,如果有文件修改,会重新生成新的组合镜像缓存,最终传给work层。

二、涉及技术

二、bootfs(boot file system)

主要包含bootloader和kernel
bootloader主要是引导加载kernel, Linux刚启动时会加载bootfs文件系统,在Docker镜像的最底层是bootfs共享宿主机、bootfs拥有自己独有的rootfs(不同发行版本)。

二、rootfs (root file system)

在bootfs之上(base images,例如centos 、ubuntu)包含的就是典型 Linux 系统中的 /dev, /proc, /bin, /etc 等标准目录和文件rootfs就是各种不同的操作系统发行版,比如Ubuntu,Centos等等。

三、AUFS 与overlay/overlay2

1、AUFS是一种联合文件系统。它使用同一个Linux host上的多个目录,逐个堆叠起来,对外呈现出一个统一的文件系统。AUFS使用该特性,实现了Docker镜像的分层
2、而docker 使用了overlay/overlay2存储驱动来支持分层结构
① OverlayFS将单个Linux主机上的两个目录合并成一个目录。这些目录被称为层,统一过程被称为联合挂载
② overlay 结构:
overlayfs在linux主机上只有两层,一个目录在下层,用来保存镜像(docker),另外一个目录在上层,用来存储容器信息
1、rootfs 基础镜像
2、lower 下层信息 (为镜像层,容器)
3、upper 上层目录 (容器信息,可写)
4、worker 运行的工作目录(copy-on-write写时复制 -》准备容器环境)
5、mergod “视图层”(容器视图)

三、dockerfile操作指令

指令含义
FROM镜像指定新镜像所基于的镜像,第一条指令必须为FROM指令,每创建一个镜像就需要一条FROM指令。
MAINTAINER名字说明新镜像的维护人信息
CMD[“要运行的程序“,”参数1,“参数2“]指令启动容器时要运行的命令或者脚本,Dockerfile只能有一条CMD命令,如果指定多条则只能最后一条被执行
EXPOSE端口号指定新镜像加载到Docker时要开启的端口
ENV环境变量变量值设置一个环境变量的值,会被后面的RUN使用
ADD源文件/目录目标文件/目录将源文件复制到目标文件,源文件要与Dockerfile位于相同目录中,或者是一个URL
COPY源文件/目录目标文件/目录将本地主机上的文件/目录复制到目标地点,源文件/目录要与Dockerfile在相同的目录中
VOLUME[“目录“]在容器中创建一个挂载点
USER用户名/UID指定运行容器时的用户
WORKDIR路径为后续的RUN、CMD、ENTRYPOINT指定工作目录
ONBUILD命令指定所生成的镜像作为一个基础镜像时所要运行的命令
HEALTHCHECK健康检查

四、CMD与entrypoint区别

1、如果ENTRYPOINT使用了shell模式,CMD指令会被忽略。
2、如果ENTRYPOINT使用了exec模式,CMD指定的内容被追加为ENTRYPOINT 指定命令的参数。
3、如果 ENTRYPOINT使用了exec模式,CMD也应该使用exec模式。

五、实验

一、环境

[root@localhost ~]# yum install -y yum-utils device-mapper-persistent-data lvm2 #安装依赖环境
[root@localhost ~]# yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo #安装阿里云docker源
[root@localhost ~]# yum install -y docker-ce #安装docker社区版
[root@localhost ~]# systemctl start docker

四、部署Nginx

一、未优化

[root@localhost ~]# mkdir nginx-a
[root@localhost ~]# cd nginx-a
[root@localhost nginx-a]# vim Dockerfile
FROM centos:7   
#基于centos:7镜像
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make    
#安装依赖环境  
ADD nginx-1.12.2.tar.gz /mnt   
#将源码复制到指定目录,并解压   
WORKDIR /mnt/nginx-1.12.2   
#为下面的指令指定执行目录   
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc   
#关闭Debug调试   
RUN ./configure --prefix=/usr/local/nginx 
#安装编译   
RUN make
RUN make install
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]   
#指定挂载点  
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"] 
#为了保持nginx的容器不退出,关闭nginx后台运行 

[root@localhost nginx-a]# ls #上传软件包
Dockerfile  nginx-1.12.2.tar.gz
[root@localhost nginx-a]# docker build -t nginx:a .

二、优化1:不需要输出的指令丢入/dev/null

[root@localhost ~]# cd nginx-b
[root@localhost nginx-b]# vim Dockerfile
FROM centos:7
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && yum clean all
ADD nginx-1.12.2.tar.gz /mnt
WORKDIR /mnt/nginx-1.12.2
RUN sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc
RUN ./configure --prefix=/usr/local/nginx &> /dev/null
RUN make &> /dev/null
RUN make install &> /dev/null
RUN rm -rf /mnt/nginx-1.12.2   
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

[root@localhost nginx-b]# docker build -t nginx:b .

三、优化2:减少RUN构建

[root@localhost nginx-b]# cd ../nginx-c
[root@localhost nginx-c]# vim Dockerfile
FROM centos:7
ADD nginx-1.12.2.tar.gz /mnt 
WORKDIR /mnt/nginx-1.12.2
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
 yum clean all && \
 sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
 ./configure --prefix=/usr/local/nginx &> /dev/null && \
 make &> /dev/null && make install &> /dev/null &&\
 rm -rf /mnt/nginx-1.12.2 
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

[root@localhost nginx-c]# docker build -t nginx:c .

四、优化3:多阶段构建

[root@localhost nginx-c]# cd ../nginx-d
[root@localhost nginx-d]# vim Dockerfile
FROM centos:7 as build 
ADD nginx-1.12.2.tar.gz /mnt 
WORKDIR /mnt/nginx-1.12.2
RUN yum install -y gcc pcre pcre-devel devel zlib-devel make &> /dev/null && \
 yum clean all &&\
 sed -i 's/CFLAGS="$CFLAGS -g"/#CFLAGS="$CFLAGS -g"/g' auto/cc/gcc && \
 ./configure --prefix=/usr/local/nginx &> /dev/null && \
 make &>/dev/null && \
 make install &>/dev/null && \
 rm -rf /mnt/nginx-1.12.2 

FROM centos:7 
EXPOSE 80
VOLUME ["/usr/local/nginx/html"]
COPY --from=build /usr/local/nginx /usr/local/nginx
CMD ["/usr/local/nginx/sbin/nginx","-g","daemon off;"]

[root@localhost nginx-d]# docker build -t nginx:d .

五、验证

[root@localhost nginx-d]# docker images
REPOSITORY   TAG       IMAGE ID       CREATED          SIZE
nginx        d         75ccf3db229f   2 minutes ago    205MB
nginx        c         b49fcc93d653   7 minutes ago    308MB
nginx        b         adfcddee43b8   12 minutes ago   310MB
nginx        a         f74fdb9ccefe   25 minutes ago   424MB
centos       7         8652b9f0cb4c   10 months ago    204MB

三、部署Tomcat

[root@localhost ~]# mkdir /opt/tomcat
[root@localhost ~]# cd /opt/tomcat
#上传软件包
[root@localhost tomcat]# ls
apache-tomcat-9.0.16.tar.gz  jdk-8u91-linux-x64.tar.gz
[root@localhost tomcat]# vim Dockerfile
FROM centos:7
ADD jdk-8u91-linux-x64.tar.gz /usr/local/
ENV JAVA_HOME /usr/local/jdk1.8.0_91
ENV JRE_HOME ${JAVA_HOME}/jre
ENV CLASSPATH .:${JAVA_HOME}/lib:${JRE_HOME}/lib
ENV PATH $JAVA_HOME/bin:$PATH
ADD apache-tomcat-9.0.16.tar.gz /usr/local/
EXPOSE 8080
#需要加运行环境
#ENTRYPOINT /usr/local/tomcat/bin/startup.sh && tail -f /usr/local/tomcat/logs/catalina.out
#不用加运行环境
CMD ["/usr/local/apache-tomcat-9.0.16/bin/catalina.sh","run"] 
#构建镜像
[root@localhost tomcat]# docker build -t tomcat:new1 .
#创建容器并运行
[root@localhost tomcat]# docker run -itd -P --name tomcat tomcat:new1
60a2290ca8e775fdaf84a1871992a9db643a8642f9085d7944c798a9908273f4
[root@localhost tomcat]# docker ps -a

在这里插入图片描述
访问192.168.238.99:49175
在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值