镜像的制作方式
我们知道镜像有两种制作方式:
复制代码
-
以Dockerfile的方式 复制代码
-
以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中的每一条命令。