通过commit的方式制作docker镜像

1,919 阅读3分钟

镜像的制作方式

我们知道镜像有两种制作方式:
  1. 以Dockerfile的方式
    
  2. commit的方式
    

    我们一般会用Dockerfile的方式来制作自己的服务镜像,在Dockerfile中我们会用FROM来指定基础镜像, 然后在基础镜像的基础上或是安装一些需要用到的软件,或者做一些其他的改动, 然后将自己打包好的项目添加到这个镜像中。

    而commit制作镜像的方式一般用来定制自己的镜像。 比如说我们要在基础镜像上做一些改动,装一些软件,那我们就可以使用commit的方式来为自己做一个自定义的基础镜像。 这样做的好处是这些改动只用在我们制作这个基础镜像时做一次,以后我们使用Dockfile来制作服务镜像时,FROM后面就可以用我们定制化的基础镜像。 这样就可以省去通过网络下载软件的等操作,大大减少构造服务镜像的时间。我们的Dockerfile看起来也会更简单,行数更少。

    在使用commit方式来制作镜像的过程中,用到的docker命令(根据需要,可能不会全部用到)如下:

  • docker images
    
  • docker pull
    
  • docker run
    
  • docker ps
    
  • docker start
    
  • docker attach
    
  • docker commit
    
  • docker start
    
  • docker push
    

查看本地镜像

首先我们使用docker images来查看自己的本地镜像,例如我们要在openjdk:8-jre-alpine的基础上制作镜像,那我们先看看本地有没有jdk镜像。

$ docker images
REPOSITORY                                                       TAG                 IMAGE ID            CREATED             SIZE
testwx                                                           latest              49729fc355e3        6 days ago          106MB

从仓库拉取镜像

如果我们本地没有需要的镜像,就需要从镜像仓库拉取

docker pull  仓库地址/openjdk:8-jdk-alpine

将镜像run起来

接下来我们要将jdk镜像run起来,一个镜像run起来之后,就成为了一个有生命周期的容器。

docker run -ti openjdk:8-jdk-alpine

当我们使用exit退出容器时,容器就stop了。

查看容器状态

我们可以通过ps命令来查看容器的状态。

$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
10c9e8af6359        testwx              "/bin/sh"           6 days ago          Exited (0) 23 seconds ago                       nostalgic_euclid
f4c501780d5a        testwx              "/bin/sh"           6 days ago          Exited (0) 20 hours ago                         sleepy_fermat

启动容器

我们可以使用start命令来启动容器,需要注意的是,start命令后面接的是容器的名字或者id,而不是镜像的,要通过镜像来启动容器的话,要使用RUN命令。

$ docker start 10c9
10c9

接入容器,做一些改变

我们可以通过attach命令来接入容器,注意这个命令接的也是容器的名字或id。

$ docker attach 10c
/ # apk update
fetch https://mirrors.aliyun.com/alpine/v3.9/main/x86_64/APKINDEX.tar.gz
fetch https://mirrors.aliyun.com/alpine/v3.9/community/x86_64/APKINDEX.tar.gz
v3.9.6-44-g3992359a2b [https://mirrors.aliyun.com/alpine/v3.9/main]
v3.9.6-42-g88b6599af0 [https://mirrors.aliyun.com/alpine/v3.9/community]
OK: 9789 distinct packages available
/ # apk add tini
  0%
K: 103 MiB in 55 packages
/ #

以上是要安装一个tini软件,不过之前这个容器已经装过tini了,所以没有重复装。

保存容器的变化

接下来就是要通过commit命令来制作镜像,将刚才对容器变化保存起来。 commit命令的含义是从容器创建一个新的镜像,所以需要注意commit接的也是容器的名字或id。

$ docker commit -a "wenxue" -m "test" 10c testimage
sha256:1b8a4c6421a38da7a73837deb819735ed329472a7fcd64760b67898717032ce1

这样定制化镜像就完成了。

最后,我们可以使用images命令来查看自己刚刚做好的镜像。

我们还可以使用push命令将我们制作好的镜像推送到仓库上去。

另外,建议只在学习阶段使用commit方式了解镜像,在实际中永远用Dockerfile去制作镜像,因为commit的制作出的镜像是个黑盒,使用的人不知道里面执行了哪些命令,每一层都做了什么操作,而用Dockerfile制作出的镜像是可以通过docker history命令来查到Dockerfile中的每一条命令。