docker镜像构建
构建镜像
构建镜像一般有三种情况,基于容器导入、基于本地模板导入、基于 Dockerfile 创建,本章主讲基于容器保 存镜像和本地保存镜像导入。
基于容器保存
主要格式:docker commit -a '作者' -m "描述" [container id] [输出镜像名]:[版本]
[root@chensir ~]# docker commit -m "filename" -a "chen" 820a17fe3935 mycentos:v1
主要参数
-a 作者信息
-m 提交信息(相当于描述信息)
-p 提交时, 暂停容器运行
构建镜像需要先先启动镜像, 然后通过容器id构建镜像
启动容器, 修改并保存
启动
[root@laser ~]# docker run -d -it centos /bin/bash
查看容器是否启动
[root@laser ~]# docker ps -q
820a17fe3935
给容器内添加一点内容
[root@laser ~]# docker exec 820a17fe3935 echo "chenshao" test
构建镜像
[root@laser ~]# docker commit -m "file" -a "chen" 820a17fe3935 mycentos:1.0
构建完成后查看镜像, 如果存在mycengos则完成
[root@laser ~]# docker images
保存镜像
有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一 个文件,再拷贝到另一台电脑上导入使用。打包成tar包或zip包进行共享
对于镜像的导出和导入,Docker 提供了两种方案,下面分别进行介绍。
使用 export 和 import
export 和 import 的针对点是容器
,将本机的容器导出为镜像包。
使用 export 保存容器为镜像
格式 : docker export 镜像id > 镜像名称.tar
查看自己生产的镜像
docker image -q
820a17fe3935
[root@laser ~]# docker export 820a17fe3935 > centos.tar
查看镜像
[root@laser ~]# ll | grep nginx.tar
-rw-r--r-- 1 root root 135117824 12 月 2 20:51 centos.tar
使用 import 导入包为镜像
格式 : docker import 本地镜像.tar 镜像名称:版本
版本是可选, 也可以不写
[root@laser ~]# docker import centos.tar centos:1.0
查看, 没抛异常都会成功
[root@laser ~]# docker images
使用 save 和 load
save 和 load 的针对的点是镜像
,将本机的镜像导入、导出为镜像包。
使用 save 保存镜像
格式: docker save 镜像ID > nginx.tar
[root@laser ~]# docker save 7e4d58f0e5f3 > nginx.tar
[root@laser ~]# ls
nginx.tar
使用 save 保存多个镜像
-o参数: 保存多个镜像,指定在一个压缩包内保存多个镜像
格式: docker save -o 到处包名.tar 镜像1 镜像2 ...
[root@laser ~]# docker save -o all.tar mysql:5.7 redis:6.0
[root@laser ~]# ll
总用量 104812
-rw-------. 1 root root 489012736 12月 2 19:27 all.tar
使用 load 导入镜像
-i 参数
格式 : docker load < 包名.tar
或 docker load -i 包名.tar
导入后如果docker内存在导入镜像, 则会覆盖当前镜像,
[root@laser ~]# docker load < centos.tar
导入多个,
[root@laser ~]# docker load -i all.tar
Loaded image: redis:6.0
Loaded image: mysql:5.7
save和load 与 export和import 区别?
1、save保存比较完整,export仅仅保存镜像。
2、save保存的体积大于export保存的体积
3、import可以重命名,load不能重命名
4、save可以保存多个镜像,export只能保存一个容器。
save和export 使用场景?
1、打包镜像一般用save, 打包容器一般用export
2、需要构建历史信息的,可以使用save。
需要注意的是
当使用export到处时, 使用load是导不进容器的, 就算导进去也使用不了, 因为export针对的是容器, 而load导入镜像, 所以会抛出异常, 为导入的不是镜像, 反之也是一样的, 当使用save导出, 使用import导入也是使用不了的, 必须要严格按照导入导出的格式进行, 否则镜像无法正常运行
两种方案的差别
- 文件大小不同
export 导出的镜像文件体积小于 save 保存的镜像, 因为export不保存历史记录和其他信息, save保留历史记录, 后- 续使用save比较多,
- 是否可以对镜像重命名
docker import 可以为镜像指定新名称,docker load 不能对载入的镜像重命名。
- 是否可以同时将多个镜像打包到一个文件中
docker export 不支持,docker
- 是否包含镜像历史
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅 保存容器当时的快照状态),所以无法进行回滚操作。
save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)
使用export导出
[root@laser ~]# docker history 8652b9f0cb4c
IMAGE CREATED CREATED BY SIZE COMMENT
8652b9f0cb4c 2 weeks ago from import - 不知从何而来
使用 save导出
[root@laser ~]# docker history ae0658fdbad5
IMAGE CREATED CREATED BY SIZE COMMENT
ae0658fdbad5 11 days ago /bin/sh -c #(nop) CMD ["mysqld"] 0B
<missing> 11 days ago /bin/sh -c #(nop) EXPOSE 3306 33060 0B
<missing> 11 days ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 11 days ago /bin/sh -c ln -s usr/local/bin/docker-entryp… 34B
<missing> 11 days ago /bin/sh -c #(nop) COPY file:f9202f6b715c0e78… 13.1kB
<missing> 11 days ago /bin/sh -c #(nop) VOLUME [/var/lib/mysql] 0B
<missing> 11 days ago /bin/sh -c { echo mysql-community-server m… 313MB
<missing> 11 days ago /bin/sh -c echo 'deb http://repo.mysql.com/a… 55B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV MYSQL_VERSION=5.7.32-… 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ENV MYSQL_MAJOR=5.7 0B
<missing> 2 weeks ago /bin/sh -c set -ex; key='A4A9406876FCBD3C45… 2.61kB
<missing> 2 weeks ago /bin/sh -c apt-get update && apt-get install… 52.2MB
<missing> 2 weeks ago /bin/sh -c mkdir /docker-entrypoint-initdb.d 0B
<missing> 2 weeks ago /bin/sh -c set -eux; savedAptMark="$(apt-ma… 4.17MB
<missing> 2 weeks ago /bin/sh -c #(nop) ENV GOSU_VERSION=1.12 0B
<missing> 2 weeks ago /bin/sh -c apt-get update && apt-get install… 9.34MB
<missing> 2 weeks ago /bin/sh -c groupadd -r mysql && useradd -r -… 329kB
<missing> 2 weeks ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 2 weeks ago /bin/sh -c #(nop) ADD file:d2abb0e4e7ac17737… 69.2MB
应用场景不同
docker export 的应用场景:主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安 装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用, 比如作为基础的开发环境。
docker save 的应用场景:如果我们的应用是使用 docker-compose.yml 编排的多个镜像组合,但我们要部 署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使 用 docker load 载入。
容器!