Docker镜像的创建、存出、载入

2015/6/4 posted in  Docker

创建镜像的方法有三种:基于已有镜像的容器创建、基于本地模板导入、基于Dockerfile创建。昨天csphere培训用的便是最后一种,不过Dockerfile文件是已经被写好的了,所以再还不会写Dockerfile的情况下,先不写这种方法创建镜像。

基于已有镜像的容器创建

该方法是使用docker commit命令,其命令格式为:

docker commit[OPTIONS] CONTAINER[REPOSITORY[:TAG]]

主要参数选项包括:

  • -a ,--author="" 作者信息
  • -m,--message="" 提交信息
  • -p,--pause=true 提交是暂停容器运行

比如,先创建一个运行bash的ubuntu容器:

docker run -it ubuntu /bin/bash
root@d8990fec2141:/# touch test
root@d8990fec2141:/# exit

然后根据创建的这个容器来提交一个新的镜像,提交时需要用到容器ID。

docker commit -m "test" -a "HypoChen" d8990fec2141 testimage

如果成功的话,就会返回新镜像的长ID号,然后可以查看看在本地已有的镜像:

docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
testimage           latest              baea98d5a437        About a minute ago   188.3 MB
ubuntu              14.04               fa81ed084842        3 days ago           188.3 MB
ubuntu              latest              fa81ed084842        3 days ago           188.3 MB

第三行就是刚刚创建的镜像。

基于本地模板导入

也可以从操作系统模板文件导入一个镜像,比如使用OpenVZ提供的模板创建,OPENVZ下载模板在:http://openvz.org/Download/template/precreated。 我尝试使用了Ubuntu14.04的模板,在vps里直接下载了:

wget http://download.openvz.org/template/precreated/ubuntu-14.04-x86_64-minimal.tar.gz

不过不得不说腾讯云下载东西好慢啊,75M的东西让我等了好久,差评。 下载完之后就可以导入了:

sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04

其实只是两个命令,不过很显而易见,就不加解释了。成功的话,就会返回根据模板建立的镜像的长ID 然后就可以查看本地的镜像:

sudo cat ubuntu-14.04-x86_64-minimal.tar.gz | docker import - ubuntu:14.04
ab80404d13d580965b9919b640169ccb585ea7884e6aa9de1ec043075c65fe35
docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               ab80404d13d5        56 seconds ago      215.4 MB
testimage           latest              baea98d5a437        29 minutes ago      188.3 MB
ubuntu              latest              fa81ed084842        3 days ago          188.3 MB

其实可以看出,虽然模板才75M,但创建的镜像并不小。

镜像的存出和载入

可以利用docker save和docker命令来存出和载入镜像。

存出镜像

如果想要把镜像存出到本地文件,可以使用docker save命令,例如,存出本地的刚才创建的testimage:lastest为镜像文件testimage.tar文件:

docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
testimage           latest              baea98d5a437        25 minutes ago      188.3 MB
ubuntu              latest              fa81ed084842        3 days ago          188.3 MB
ubuntu              14.04               fa81ed084842        3 days ago          188.3 MB
docker save -o /data/testimage.tar testimage:latest

上面的第6行就是存出代码,这时在/data下就有一个testimage.tar文件,这时我们把本地镜像rmi掉,然后尝试载入。

载入镜像

删除镜像之后的状态:

ubuntu@VM-223-238-ubuntu:/data$ docker rmi baea98d5a437
Untagged: testimage:latest
Deleted: baea98d5a4371a6abf9efc8c53a54a6fc5befd167bf91ce9fd4a28a6d1b7dc5b
ubuntu@VM-223-238-ubuntu:/data$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               ab80404d13d5        5 minutes ago       215.4 MB
ubuntu              latest              fa81ed084842        3 days ago          188.3 MB

然后载入镜像:

docker load --input testimage.tar 
docker images 
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
ubuntu              14.04               ab80404d13d5        6 minutes ago       215.4 MB
testimage           latest              baea98d5a437        35 minutes ago      188.3 MB
ubuntu              latest              fa81ed084842        3 days ago          188.3 MB

第一行就是载入镜像,还可以简化写成:

docker load 

载入操作将会导入镜像以及相关的元数据信息(包括标签等)。

镜像的上传

最后说点镜像的上传,镜像的管理方式非常像git,可以使用docker push命令上传自己本地镜像到仓库,默认上传到DockerHub官方仓库(需要登陆),命令格式:

docker push NAME[:TAG]

在上传之前一般会先为自己的镜像添加带自己名字(作者信息)的标签:

docker tag testimage:lastest hypochen/testimage:lastest
docker push hypochen/testimage:lastest

有利于上传之后的区分。 我觉得无论是运维团队还是开发团队还是一个实验室,都有必要有一个自己的Docker仓库,可以存放符合自己需求的环境或系统镜像,可以实现快速部署。 但是镜像和代码不一样,代码我们可以用github,但镜像动辄几十M,我觉得开源理工有必要做一个本地镜像站来代替DockerHub,并且提供校内的镜像托管服务,这将十分有利用代码的快速部署。