五、构建docker镜像
构建镜像一般有三种情况,基于容器导入、基于本地模板导入、基于 Dockerfile 创建,本章主讲基于容器保 存镜像和本地保存镜像导入。
1、基于容器保存
主要格式:docker [container id] commit
主要参数:
-a: 作者信息
-m: 提交信息
-p: 提交时,暂停容器运行
启动一个容器、修改并保存
[root@master ~]# docker run -d -it centos /bin/bash
Unable to find image 'centos:latest' locally
latest: Pulling from library/centos
7a0437f04f83: Already exists
Digest: sha256:5528e8b1b1719d34604c87e11dcd1c0a20bedf46e83b5632cdeac91b8c04efc1
Status: Downloaded newer image for centos:latest
4becc5ce9f177b8e2ba2a254c9466fa94f13fe50555a56e7ab144e31c7909acb
[root@master ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
4becc5ce9f17 centos "/bin/bash" 48 seconds ago Up 46 seconds unruffled_hopper
[root@master ~]# docker exec 4becc5ce9f17 touch 123.txt
[root@master ~]# docker commit -m "Add a file" -a "tom" 4becc5ce9f17 centos:v1
sha256:9be0f060daf3d86842b7973371c9eb9d704f4ce0b9edd71a989f005c5af26524
[root@master ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
centos v1 9be0f060daf3 18 seconds ago 209MB
mysql 8.0.23 cbe8815cbea8 4 months ago 546MB
tom-mysql latest cbe8815cbea8 4 months ago 546MB
centos latest 300e315adb2f 8 months ago 209MB
nginx 1.17 9beeba249f3e 15 months ago 127MB
2、基于本地模板导入
用户也可以将保存的镜像传到另一台机器上,另一台机器就可以直接导入。
cat ubuntu-18.04-x86_64-minimal.tar.gz | docker import - ubuntu:18.04
3、保存镜像(commit)
有时我们需要将一台电脑上的镜像复制到另一台电脑上使用,除了可以借助仓库外,还可以直接将镜像保存成一 个文件,再拷贝到另一台电脑上导入使用。
对于镜像的导出和导入,Docker 提供了两种方案:
- 使用 export 和 import
# 保存正在运行的容器为镜像压缩包
## 保存容器为镜像
docker export [容器的ID] > [包名称]
# 实例
[root@Centos7 ~]# docker export be3b92e2886b > redis.tar
[root@Centos7 ~]# ll | grep redis
-rw-r--r--. 1 root root 104178688 Mar 18 17:30 redis.tar
#使用 import 导入包为镜像
## docker import [包名称] [自定义镜像名称]
# 实例
[root@Centos7 ~]# docker import redis.tar test:v3
sha256:7776db3402fb8d59f6121a3b1977b5e7016f4064cf59218fd1b06637cb0fca87
[root@Centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
test v3 7776db3402fb 6 seconds ago 101MB
- 保存镜像(save/load)
save 和 load 的针对的点是镜像,将本机的镜像导入、导出为镜像包。
# 保存镜像为压缩包
# 保存镜像的格式:
docker save [镜像名称|镜像ID] > [包名称]
[root@Centos7 ~]# docker save 7731472c3f2a > apline.tar
[root@Centos7 ~]# ll
-rw-r--r--. 1 root root 5888000 Mar 18 17:36 apline.tar
[root@Centos7 ~]# docker save -o apline-two.tar 7731472c3f2a
[root@Centos7 ~]# ll
total 148692
-rw-r--r--. 1 root root 5888000 Mar 18 17:36 apline.tar
-rw-------. 1 root root 5888000 Mar 18 17:37 apline-two.tar
# 导入镜像的格式:
docker load < [包名称]
[root@Centos7 ~]# docker load < apline.tar
c04d1437198b: Loading layer [========================================>] 5.88MB/5.88MB
Loaded image ID: sha256:7731472c3f2a25edbb9c085c78f42ec71259f2b83485aa60648276d408865839
[root@Centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
<none> <none> 7731472c3f2a 2 months ago 5.61MB
# 注:save/load保存镜像无法自定义镜像名称,save保存镜像时如果使用ID保存则load导入镜像无名称,使用名称导入时才有名称。
[root@Centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest b97242f89c8a 2 months ago 1.23MB
[root@Centos7 ~]# docker save busybox:latest > busybox.tar
[root@Centos7 ~]# ll
total 150120
-rw-r--r--. 1 root root 1459200 Mar 18 17:43 busybox.tar
[root@Centos7 ~]# docker rmi b97242f89c8a
Untagged: busybox:latest
Untagged: busybox@sha256:c5439d7db88ab5423999530349d327b04279ad3161d7596d2126dfb5b02bfd1f
Deleted: sha256:b97242f89c8a29d13aea12843a08441a4bbfc33528f55b60366c1d8f6923d0d4
Deleted:
sha256:0064d0478d0060343cb2888ff3e91e718f0bffe9994162e8a4b310adb2a5ff74
[root@Centos7 ~]# docker images
#使用 save 保存多个镜像,busybox、nginx打包一起。
docker save -o test.tar busybox nginx:1.18.0
REPOSITORY TAG IMAGE ID CREATED SIZE
[root@Centos7 ~]# docker load < busybox.tar
0064d0478d00: Loading layer [==================================================>] 1.45MB/1.45MB
Loaded image: busybox:latest
[root@Centos7 ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
busybox latest b97242f89c8a 2 months ago 1.23MB
- 保存镜像三种方式的区别
1、export保存的镜像体积要小于save(save保存更完全,export保存会丢掉一些不必要的数据)
2、export可以重命名镜像名称而save则不行
3、save可以同时保存多个镜像而export则不行
export 导出(import 导入)是根据容器拿到的镜像,再导入时会丢失镜像所有的历史记录和元数据信息(即仅 保存容器当时的快照状态),所以无法进行回滚操作。
save 保存(load 加载)的镜像,没有丢失镜像的历史,可以回滚到之前的层(layer)。 - 应用场景不同
docker export 的应用场景:主要用来制作基础镜像,比如我们从一个>主要用来制作基础镜像,比如我们从一个 ubuntu 镜像启动一个容器,然后安 装一些软件和进行一些设置后,使用 docker export 保存为一个基础镜像。然后,把这个镜像分发给其他人使用, 比如作为基础的开发环境。
docker save 的应用场景:如果我们的应用是使用 docker-compose.ymldocker-compose.yml 编排的多个镜像组合,但我们要部 署的客户服务器并不能连外网。这时就可以使用 docker save 将用到的镜像打个包,然后拷贝到客户服务器上使 用 docker load 载入
本文来自博客园,作者:看啥,转载请注明原文链接:https://www.cnblogs.com/jykn92/p/15153704.html