制作镜像有两种方法,
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将其删除。