CKA笔记整理(五)之dockerfile镜像构建

制作镜像有两种方法,

1.把一个容器导出为一个镜像。创建一个临时容器,在里面安装所需的东西,然后导出(docker commit)为镜像来生成新的容器,可使用yum clean all(清理缓存)来减小镜像大小。

2.使用dockerfile来构建新镜像。

我们构建新镜像时,并非0-1的过程,而是基于已有镜像的基础上进行改编,然后获取一个新镜像。已有镜像称之为基础镜像或基镜像。可通过docker history  镜像名:TAG 来查看镜像的构建过程。

vi  Dockerfile   ,内容如下:

FROM hub.c.163.com/library/centos     #此处为指定基础镜像
RUN yum install net-tools -y          #安装服务
RUN yum install iproute -y            #正常情况下应该尽量减少层级,以减少镜像大小
#上两行可使用该写法代替,
RUN yum install net-tools -y && yum install iproute -y

RUN yum clean all                     #清理缓存,减少大小
#上三行(不带注释)可使用该写法代替,
RUN yum install net-tools -y && \
	yum install iproute -y && \
	yum clean all

CMD ["/bin/bash"]                     #指定运行进程

使用docker bulid -t  centos:v1 .  -f Dockerfile  构建镜像。

-t,指定镜像名 ,.表示当前路径下,-f指定构建文件。构建过程中会产生一个临时容器,结束自动删除。

可使用ADD或COPY来将宿主机文件拷贝至镜像下,具体见下:

FROM centos:v1             #使用新制作的镜像
RUN mkdir  /add  /copy     #准备两个文件夹
ADD repo.tar.gz /add       #将repo文件拷贝到/add下
COPY repo.tar.gz /copy     #ADD带解压功能,COPY不带解压功能

CMD ["/bin/bash"]

两者区别在于ADD带解压功能可将拷贝的压缩文件解压,COPY不带解压功能。

例:使用dockerfile制作一个nginx镜像:

FROM centos:v1
COPY epel.repo /etc/yum.repos.d/               #将宿主机yum源复制到镜像
RUN yum install nginx -y                       #安装nginx
COPY index.html /usr/share/nginx/html/         #将提前准备的index页面拷贝至镜像

EXPOSE  80                                     #通告使用者端口为80,但并不对容器起左右
CMD  ["nginx","-g","daemon off;"]              #指定nginx的运行进程,CMD中空格应改为逗号(json格式)

CMD和ENTRYPOINT的区别:

FROM centos:v1
CMD ["/bin/ping"]                       #最后跟的命令代替CMD指定的命令
#docker run -dit --name=c1 centos:v1 www.baidu.com
--------------------
FROM centos:v1
ENTRYPOINT ["/bin/ping"]                #最后跟的命令作为ENTRYPOINT指定命令的参数
#docker run -dit --name=c1 centos:v2 www.baidu.com

结果相当于CMD下在执行www.baidu.com,而ENTRYPOINT下在执行ping  www.baidu.com  。

其他的一些指令: 

ENV 用于在容器中定义变量
VOLUME 用于定义卷
USER 用于指定容器里的进程以什么用户运行

FROM hub.c.163.com/library/centos
RUN useradd tom                             #创建tom用户
VOLUME ["/data1","/data2"]                  #指定data1和data2挂载宿主机
ENV xx AAAA                                 #指定变量
USER tom                                    #使用tom运行

CMD ["/bin/bash"]

docker之多阶段构建:我们需要控制容器镜像的大小,此时就需要用到多阶段构建的方式来构建镜像。对于多阶段构建,可以在Dockerfile中使用多个FROM语句。每个FROM指令都可以使用不同的基镜像,并且它们都开始了构建的新阶段。可以有选择地将中间物从一个阶段复制到另一个阶段,舍弃在最后的镜像中您不想要的所有内容。

例如:

FROM hub.c.163.com/library/centos
RUN yum -y install net-tolls iproute                #阶段1

FROM hub.c.163.com/library/centos
COPY  --from=0 /sbin/ifconfig  /sbin
COPY  --from=0 /sbin/ip   /sbin
CMD ["/bin/bash"]                                   #阶段2

COPY --from=0只将前1阶段构建的结果复制到2阶段,从而大大降低了生成镜像的大小。需要注意的是,多阶段构建时会产生多个容器,同时构建过程中会产生空悬镜像,结束后可根据容器ID将其删除。

猜你喜欢

转载自blog.csdn.net/qq_52676760/article/details/129051077