Docker构建镜像的两种方式:docker commit与Dockerfile创建

docker commit

  • docker commit命令是创建新镜像最直观的方法,其中包含三个步骤:
  • 运行容器
  • 修改容器
  • 将容器保存为新的镜像

实验举例

  • 在ubuntubase镜像中安装vim程序
  1. 运行容器:
docker run -it ubuntu
#-it:以交互模式进入容器
  1. 安装vim
#设置阿里云镜像:
mv /etc/apt/sources.list /etc/apt/sources.list.bak
cat >> /etc/apt/sources.list <<- EOF
deb http://mirrors.aliyun.com/ubuntu/ xenial main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial main
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main
deb http://mirrors.aliyun.com/ubuntu/ xenial universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe
deb http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main
deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe
deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe
EOF
#安装vim:
apt-get update
apt-get install vim

在这里插入图片描述

  1. 保存为新镜像
    查看运行容器 docker ps
    在这里插入图片描述
  • tender_murdock是docker为容器随机分配的名字
  1. 创建新镜像:
docker commit tender_murdock ubuntu-aliyun-vim

在这里插入图片描述

  • 总结:并不建议用户通过这种方式来构件镜像
  1. 这是一种手工创建镜像的方式,容易出错,效率低可重复性弱
  2. 使用者并不知道镜像是如何创建出来的,无法对镜像进行审计,存在安全隐患
    docker commit是能够帮助我们更深入的理解镜像构建过程和镜像的分层结构。

Dockerfile

  • 创建镜像的过程:
  1. 从base镜像中运行一个容器。
  2. 执行一条指令,对容器做修改。
  3. 执行类似docker commit的操作,生成一个新的镜像层。
  4. Docker在基于刚刚提交的镜像运行一个新的容器。
  5. 重复2-4步骤,直到Dockerfile中所有的指令执行完毕。

实验举例

  1. 创建Dockerfile:
 touch Dockerfile
 vim Dockerfile
FROM ubuntu
RUN mv /etc/apt/sources.list /etc/apt/sources.list.bak
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial main" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial main" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-updates main" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates main" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial universe" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial universe" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-updates universe" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial-updates universe" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-security main" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security main" >> /etc/apt/sources.list
RUN echo "deb http://mirrors.aliyun.com/ubuntu/ xenial-security universe" >> /etc/apt/sources.list
RUN echo "deb-src http://mirrors.aliyun.com/ubuntu/ xenial-security universe" >> /etc/apt/sources.list
RUN apt-get update && apt-get install vim -y
  1. 创建镜像
docker build -t ubuntu-aliyun-vim-dockerfile .
  • 创建成功查看镜像:
    在这里插入图片描述
  • 查看镜像构建历史:
    在这里插入图片描述

镜像的缓存特性

  • Docker会缓存已有镜像的镜像层,构建新镜像时,如果某镜像已经存在,就直接使用无需重新创建。
  • 在原有的Dockerfile里面添加COPY testfile /(testfile自行创建)
docker build -t ubuntu-aliyun-vim-dockerfile-2 .
  • ubuntu-aliyun-vim-dockerfile-2的创建就是直接在ubuntu-aliyun-vim-dockerfile上添加新的一层镜像层(COPY testfile /)
  • 如果在构建景象中不使用缓存,则可以在后面加上–no-cache的参数。
  • 如果调换COPY testfile / 的顺序,缓存就会失效。创建镜像的时间就会增长。因为镜像分层的结构特性。

Dockerfile基本指令

  • FROM → 指定base镜像

  • MAINTAINER → 设置镜像作者,可以是任意字符串

  • COPY → 将文件从build context复制文件到镜像
    两种形式:1 COPY src dest 2 COPY[“src”,”dest”]

  • ADD → 与COPY基本相同(不同的是如果src为归档文件,文件则会被自动解压到dest)

  • ENV → 设置环境变量,环境变量可以被后面的指令使用

  • EXPOSE → 指定容器中的进程会监听某个端口,Docker可以将端口暴露出来

  • VOLUME → 将文件或目录声明为volume

  • WORKDIR → 为后面的RUN,CMD,ENTRYPOINT,ADD或COPY指令设置镜像中的当前工作目录

  • RUN → 在容器中运行指定的命令

  • CMD → 容器启动时运行指定的命令

  • ENTRYPOINT → 设置容器启动时运行命令

一个简单的Dockerfile综合例子

#Description:My Dockerfile
FROM busybox
MAINTAINER 1072112053@qq.com
WORKDIR /testdir
RUN touch tmpfile1
COPY ["tmpfile2","."]
ADD ["nginx-1.12.2.tar.gz","."]
ENV WELCOME "You are in my container,welcome!"
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值