看啥

导航

五、构建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 载入

posted on 2021-08-17 18:42  看啥  阅读(137)  评论(0编辑  收藏  举报