Docker:Docker image常用命令使用及实操

Docker:Docker image常用命令使用及实操

Docker image 本质上是一个 read-only 只读文件, 这个文件包含了文件系统、源码、库文件、依赖、工具等一些运行 application 所必须的文件。

  • 我们可以把 Docker image 理解成一个模板, 可以通过这个模板实例化出来很多容器。
  • image 里面是一层层文件系统 Union FS。联合文件系统,可以将几层目录挂载到一起,形成一个虚拟文件系统。每一层文件系统我们叫做一层 layer,联合文件系统可以对每一层文件系统设置三种权限,只读(readonly)、读写(readwrite)和写出(whiteout-able),但是 docker镜像中每一层文件系统都是只读的。
  • 构建镜像的时候,从一个最基本的操作系统开始,每个构建的操作都相当于做一层的修改,增加了一层文件系统。一层层往上叠加,上层的修改会覆盖底层该位置的可见性,这也很容易理解,就像上层把底层遮住了一样。当你使用的时候,你只会看到一个完全的整体,你不知道里面有几层,也不清楚每一层所做的修改是什么。
  • 我们以日常的地板为例,开发商的房子提供给用户的时候一般是做好了地暖,而这些地暖其实是一层一层添加的,最底层的钢筋水泥层,然后添加保温层,采暖管,再铺设水泥层,到最后交付的时候家家户户都是水泥面,这一层一般是不可修改的,最上层用户一般会再铺设商木地板或者地板砖每家每户的选择不一样,相当于我们镜像的容器层。

镜像相当于我们 java 或者 C++中的类,相当于一个模板,可以很方便的构建出来不同的对象。

为什么需要镜像呢:

  • 在部署应用时,通过手工或写一些脚本的方式进行部署。这样部署面临问题就是云端和本地环境一致问题。用户为每个应用打包过程比较繁琐,需要配置和给中修改等操作,非常费劲。
  • 然而, Docker 镜像就是为了解决这个小小的打包功能,突然一夜之间成名。那么,你可能说 Docker 镜像就是个压缩包,是的,你猜对了,它就像一个压缩包文件。它是如何解决 Paas 时代所面临的云端和本地一致性问题?很简单,它是把一个镜像制作成一个完整的操作系统所有文件和对应的目录结构,这样的压缩包是跟你本地和测试环境用的操作系统一摸一样。
  • docker 最大的贡献就是定义了容器镜像的分层的存储格式, docker 镜像技术的基础是联合文件系统(UnionFS),其文件系统是分层的。这样既可以充分利用共享层,又可以减少存储空间占用。
  • docker 镜像提供了一种打包应用程序和预配置服务器环境的便捷方式,可以很方便的将其用于个人用途或与其他 Docker 用户公开共享。

下面看下docker镜像相关的常见命令(docker build与docker import放到后面制作镜像时在进行学习):

命令 别名 功能 备注
docker images docker image ls/docker image list 列出本地镜像 必须掌握
docker tag docker image tag 给镜像打标签,可用于推送镜像仓库 必须掌握
docker pull docker image pull 从镜像仓库拉取镜像 和镜像仓库命令相同,也可以归类为镜像操作命令;必须掌握,参考镜像命令此处不赘述
docker push docker image push 推送镜像到仓库 和镜像仓库命令相同,也可以归类为镜像操作命令;必须掌握,参考镜像命令此处不赘述
docker rmi docker image rmi/docker image remove 删除本地镜像 必须掌握
docker build docker image build 通过 dockerfile 制作镜像 必须掌握
docker save docker image save 将指定镜像保存成 tar 归档文件 必须掌握
docker load docker image load 导入使用 docker save 命令导出的镜像 必须掌握
docker image inspect 查看镜像详细信息 必须掌握
docker history docker image history 查看镜像历史
docker import docker image import 从归档文件中创建镜像
docker image prune 删除不使用的镜像

一.docker镜像常用命令认识与上手

1.1docker rmi

docker rmi
功能

删除镜像。
语法

bash 复制代码
docker rmi [OPTIONS] IMAGE [IMAGE...]

别名

bash 复制代码
docker image rm, docker image remove

关键参数

  • -f :强制删除;
  • --no-prune :不移除该镜像的过程镜像

过程镜像是在构建 Docker 镜像时产生的中间层。Docker 使用分层存储机制,每个 Dockerfile 指令都会创建一个新的镜像层。
特点

  • 不可见:默认情况下,docker images 不显示这些中间层镜像
  • 只读:所有中间层都是只读的
  • 可重用:如果其他镜像使用了相同的构建步骤,会重用这些中间层
  • 自动管理:Docker 会自动清理未被引用的中间层

--no-prune这里不好说,我们先演示下它的使用方法与-f选项,比如我们先通过run让docker自动拉取一个busybox的镜像到本地(1.34.0),分别使用无选项与-f对其进行删除:

bash 复制代码
knd@Nightcode:~$ sudo docker run -it --name=mybusybox busybox:1.34.0 sh
Unable to find image 'busybox:1.34.0' locally
1.34.0: Pulling from library/busybox
35dacafcdad5: Pull complete 
Digest: sha256:e8e5cca392e3cf056fcdb3093e7ac2bf83fcf28b3bcf5818fe8ae71cf360c231
Status: Downloaded newer image for busybox:1.34.0
/ # ifconfig
eth0      Link encap:Ethernet  HWaddr B2:94:AA:26:34:D1 
...
knd@Nightcode:~$ sudo docker ps -a
CONTAINER ID   IMAGE            COMMAND   CREATED          STATUS                      PORTS     NAMES
7c50e4441216   busybox:1.34.0   "sh"      36 seconds ago   Exited (0) 26 seconds ago             mybusybox 

这时我直接对其进行删除是不行的(因为有容器在使用):

bash 复制代码
knd@Nightcode:~$ sudo docker rmi busybox:1.34.0
Error response from daemon: conflict: unable to delete busybox:1.34.0 (must be forced) - container 7c50e4441216 is using its referenced image e8e5cca392e3

加上-f选项就可以对其进行强制删除:

bash 复制代码
knd@Nightcode:~$ sudo docker rmi -f busybox:1.34.0
Untagged: busybox:1.34.0
knd@Nightcode:~$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND   CREATED         STATUS                     PORTS     NAMES
7c50e4441216   e8e5cca392e3   "sh"      2 minutes ago   Exited (0) 2 minutes ago             mybusybox
knd@Nightcode:~$ sudo docker images
                                                                                                                                                                                                                                                        i Info →   U  In Use
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA
centos:7             be65f488b776        301MB         76.1MB        
hello-world:latest   d4aaab6242e0       25.9kB         9.52kB  

但是-f对镜像删除了容器不会删除,这点需要注意。

1.2docker save

docker save
功能

将指定镜像保存成 tar 归档文件。
语法

bash 复制代码
docker save [OPTIONS] IMAGE [IMAGE...]

别名

bash 复制代码
docker image save

关键参数

  • -o :输出到的文件。

实际上就是把我们的镜像进行打包成一个压缩包,它和下面的load是一对的:

bash 复制代码
knd@Nightcode:~/dockertest$ sudo docker images
                                                                                                                                                                                                                                                        i Info →   U  In Use
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA
busybox:1.35.0       98ad9d1a2be3       6.55MB         2.15MB        
busybox:1.36.0       9e2bbca07938       7.58MB         2.59MB  

比如我现在有两个busybox的镜像,不加参数情况下对其进行打包:

bash 复制代码
knd@Nightcode:~/dockertest$ sudo docker save busybox:1.35.0 busybox:1.36.0
cowardly refusing to save to a terminal. Use the -o flag or redirect

不给用哈哈,必须要±o选项去使用:

bash 复制代码
knd@Nightcode:~/dockertest$ sudo docker save -o mybusyboxs busybox:1.35.0 busybox:1.36.0
knd@Nightcode:~/dockertest$ sudo docker save -o mybusyboxs1 busybox:1.35.0
knd@Nightcode:~/dockertest$ ll -h
total 6.7M
drwxrwxr-x  3 knd  knd  4.0K Dec 21 15:03 ./
drwxr-x--- 15 knd  knd  4.0K Dec 19 19:28 ../
-rw-------  1 root root 4.6M Dec 21 15:03 mybusyboxs
-rw-------  1 root root 2.1M Dec 21 15:03 mybusyboxs1

1.3docker load

docker load
功能

导入使用 docker save 命令导出的镜像。
语法

bash 复制代码
docker load [OPTIONS]

别名Shell

bash 复制代码
docker image load

关键参数

  • --input , -i : 指定导入的文件,代替 STDIN。
  • --quiet , -q : 精简输出信息。

当然这个-i选项也是必须的哈,你不告诉我导入那个文件难道我给你导入滚木吗?我们先看打包了一个镜像的压缩包的load(记得把本地的镜像先删除一下,不然本地有了就看不到效果了)

bash 复制代码
knd@Nightcode:~/dockertest$ sudo docker load -i mybusyboxs1
Loaded image: busybox:1.35.0
knd@Nightcode:~/dockertest$ sudo docker images
                                                                                                                                                                                                                                                        i Info →   U  In Use
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA
busybox:1.35.0       98ad9d1a2be3       6.55MB         2.15MB  

如果我们不加-q参数时,导入带有两个镜像的压缩包会给我们显示进度条等详细信息(我做的时候显示不出来,我这里换成了一个nginx镜像的压缩包进行实验,可能是包太小的缘故):

bash 复制代码
ena@NightCode:~/dockertest$ sudo docker load -i ./mynginx
77a2b55fbe8b: Loading layer [==================================================>]  81.04MB/81.04MB
20cf308e6957: Loading layer [==================================================>]  74.46MB/74.46MB
69f56ce8c461: Loading layer [==================================================>]  3.584kB/3.584kB
6898c33749d5: Loading layer [==================================================>]  4.608kB/4.608kB
6e32bc56a725: Loading layer [==================================================>]   2.56kB/2.56kB
08ba9962589f: Loading layer [==================================================>]   5.12kB/5.12kB
8921786c2de3: Loading layer [==================================================>]  7.168kB/7.168kB
Loaded image: nginx:1.29.4
ena@NightCode:~/dockertest$ sudo docker images
REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
nginx                      1.29.4    576306625d79   11 days ago     152MB

要是不想看这些信息,可以加上-q选项:

bash 复制代码
ena@NightCode:~/dockertest$ sudo docker load -i ./mynginx -q
Loaded image: nginx:1.29.4
ena@NightCode:~/dockertest$ sudo docker images
REPOSITORY                 TAG       IMAGE ID       CREATED         SIZE
nginx                      1.29.4    576306625d79   11 days ago     152MB

1.4docker history

docker history
功能

显示镜像历史,更准确些说应该是查看构建过程中的中间层
语法

Shelldocker history [OPTIONS] IMAGE
别名

docker image history
关键参数

  • -H , --human :大小和日期采用人容易读的格式展现
  • --no-trunc :显示全部信息,不要隔断;
  • -q, --quiet: 只显示镜像 id 信息;

这里我们可以瞅一眼nginx的构建过程中间层

bash 复制代码
ena@NightCode:~/dockertest$ sudo docker history nginx:1.29.4
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
576306625d79   11 days ago   CMD ["nginx" "-g" "daemon off;"]                0B        buildkit.dockerfile.v0
<missing>      11 days ago   STOPSIGNAL SIGQUIT                              0B        buildkit.dockerfile.v0
...

加上-H选项没变化,因为原本就是人类比较易读的形式了。后面两个选项大家可以自己尝试下。

1.5docker image prune

docker image prune

功能

删除不使用的镜像。

语法

bash 复制代码
docker image prune [OPTIONS]

关键参数

  • -a , --all : 删除全部不使用的镜像;
  • --filter filter:指定过滤条件;
  • -f, --force :不提示是否删除;

--filter有兴趣的读者可以参考官方文档:
docker image prune --filter

这里不再做介绍。-f没啥说的,我们主要看看-a:

比如我们这里有一个nginx容器(无论运行或不运行):

bash 复制代码
knd@Nightcode:~/dockertest$ sudo docker images
                                                                                                                                                                                                                                                        i Info →   U  In Use
IMAGE                ID             DISK USAGE   CONTENT SIZE   EXTRA
busybox:1.35.0       98ad9d1a2be3       6.55MB         2.15MB        
busybox:1.36.0       9e2bbca07938       7.58MB         2.59MB        
centos:7             be65f488b776        301MB         76.1MB        
hello-world:latest   d4aaab6242e0       25.9kB         9.52kB        
nginx:1.29.4         fb01117203ff        228MB         62.6MB        
knd@Nightcode:~/dockertest$ sudo docker run -d --name=mynginx -p 8080:80  nginx:1.29.4
c702207d7d975d2a0d0f8c5e2b17eab780c678f770cdc68e488efa10f6f345fd
knd@Nightcode:~/dockertest$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND                  CREATED         STATUS         PORTS                                     NAMES
c702207d7d97   nginx:1.29.4   "/docker-entrypoint...."   7 seconds ago   Up 6 seconds   0.0.0.0:8080->80/tcp, [::]:8080->80/tcp   mynginx

这时我使用sudo docker image prune -a会把除了nginx之外的镜像全部删除:

bash 复制代码
knd@Nightcode:~/dockertest$ sudo docker image prune -a
WARNING! This will remove all images without at least one container associated to them.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: sha256:98ad9d1a2be345201bb0709b0d38655eb1b370145c7d94ca1fe9c421f76e245a
...
knd@Nightcode:~/dockertest$ sudo docker images
                                                                                                                                                                                                                                                        i Info →   U  In Use
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
nginx:1.29.4   fb01117203ff        228MB         62.6MB    U   

可以看到只剩nginx的镜像了。

二.用于上手的操作案例

啊因为这里毕竟是镜像操作,所以我们还是对镜像进行拉取上传那一套操作作为上手操作案例,不过会基于我们这里新学的命令加点新东西:
拉取一个busybox镜像到本地:

bash 复制代码
ena@NightCode:~$ sudo docker pull busybox:1.36.0
...
ena@NightCode:~$ sudo docker images busybox
REPOSITORY   TAG       IMAGE ID       CREATED         SIZE
busybox      1.37.0    08ef35a1c3f0   15 months ago   4.43MB
busybox      1.36.0    af2c3e96bcf1   2 years ago     4.86MB

查看镜像的构建过程中的中间层

bash 复制代码
ena@NightCode:~$ sudo docker history busybox:1.36.0
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
af2c3e96bcf1   2 years ago   /bin/sh -c #(nop)  CMD ["sh"]                   0B        
<missing>      2 years ago   /bin/sh -c #(nop) ADD file:c22c6617fa9a85e0d...   4.86MB  

也可以从docker hub上看:
busybox:1.36.0

查看列表存储位置

默认是在/var/lib/docker/image/overlay2/repositories.json下的:

docker是没有mysql的,overlay2 是 Docker 目前默认推荐的文件系统存储驱动,它使用 Linux 内核的 OverlayFS 文件系统,提供了联合文件系统(UnionFS) 功能。后面我们会再详细介绍它:

进入文件查看,该文件记录已拉取镜像文件的信息

bash 复制代码
{
    "Repositories": {
        "busybox": {
            "busybox:1.36.0": "sha256:af2c3e96bcf1a80da1d9b57ec0adc29f73f773a4a115344b7e06aec982157a33",
            "busybox:1.37.0": "sha256:08ef35a1c3f050afbbd64194ffd1b8d5878659f5491567f26d1c814513ae9649",
            "busybox@sha256:9e2bbca079387d7965c3a9cee6d0c53f4f4e63ff7637877a83c4c05f2a666112": "sha256:af2c3e96bcf1a80da1d9b57ec0adc29f73f773a4a115344b7e06aec982157a33",
            "busybox@sha256:d80cd694d3e9467884fcb94b8ca1e20437d8a501096cdf367a5a1918a34fc2fd": "sha256:08ef35a1c3f050afbbd64194ffd1b8d5878659f5491567f26d1c814513ae9649"
        },
        "nginx": {
            "nginx:1.29.4": "sha256:576306625d797a52045ad158b601d5a011f7a7f16e4ccc909809f02dd6047c37"
        },
        "xiu114514/testrepository": {
            "xiu114514/testrepository:v1.0": "sha256:08ef35a1c3f050afbbd64194ffd1b8d5878659f5491567f26d1c814513ae9649",
            "xiu114514/testrepository@sha256:755d9ce09782b2f60fd3321878e611f871817aa8a726e8c605f2f67ae6ffa9e2": "sha256:08ef35a1c3f050afbbd64194ffd1b8d5878659f5491567f26d1c814513ae9649"
        }
    }
}

注意看这和我们刚刚拉取时的信息是一样的

bash 复制代码
        "busybox": {
            "busybox:1.36.0": "sha256:af2c3e96bcf1a80da1d9b57ec0adc29f73f773a4a115344b7e06aec982157a33",

ena@NightCode:~$ sudo docker images --no-trunc
REPOSITORY                 TAG       IMAGE ID                                                                  CREATED         SIZE
busybox                    1.36.0    sha256:af2c3e96bcf1a80da1d9b57ec0adc29f73f773a4a115344b7e06aec982157a33   2 years ago     4.86MB

再看下它的镜像详情信息(这里只挂出了我们这里需要关注的部分):

bash 复制代码
        "Config": {
            "Hostname": "",
            "Domainname": "",
            "User": "",
            "AttachStdin": false,
            "AttachStdout": false,
            "AttachStderr": false,
            "Tty": false,
            "OpenStdin": false,
            "StdinOnce": false,
            "Env": [
                "PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
            ],
            "Cmd": [
                "sh"
            ],
            "Image": "sha256:88a81060478e63800a509aeca29e72bacbef4fa21e600901c10d51d277e35f8a",
            "Volumes": null,
            "WorkingDir": "",
            "Entrypoint": null,
            "OnBuild": null,
            "Labels": null
        }

可以看到它默认执行的命令是sh。
打标签上传私人仓库

这里为了和之前进行区分,我们打多个标签对同一个容器然后进行上传:

记得先登录!!!

bash 复制代码
ena@NightCode:~$ sudo docker tag busybox:1.36.0 xiu114514/testrepository:v2.0
ena@NightCode:~$ sudo docker tag busybox:1.36.0 xiu114514/testrepository:v3.0
ena@NightCode:~$ sudo docker push xiu114514/testrepository:v3.0
The push refers to repository [docker.io/xiu114514/testrepository]
1f1d08b81bbe: Mounted from library/busybox 
v3.0: digest: sha256:086417a48026173aaadca4ce43a1e4b385e8e62cc738ba79fc6637049674cac0 size: 528
ena@NightCode:~$ sudo docker push xiu114514/testrepository:v2.0
The push refers to repository [docker.io/xiu114514/testrepository]
1f1d08b81bbe: Layer already exists 
v2.0: digest: sha256:086417a48026173aaadca4ce43a1e4b385e8e62cc738ba79fc6637049674cac0 size: 528

拉取刚刚上传的多个版本镜像并运行容器再进行删除

先把原来的删了再拉取:

bash 复制代码
ena@NightCode:~$ sudo docker images
REPOSITORY                 TAG       IMAGE ID       CREATED       SIZE
busybox                    1.36.0    af2c3e96bcf1   2 years ago   4.86MB
xiu114514/testrepository   v2.0      af2c3e96bcf1   2 years ago   4.86MB
xiu114514/testrepository   v3.0      af2c3e96bcf1   2 years ago   4.86MB

这里我们起两个容器:

bash 复制代码
ena@NightCode:~$ sudo docker ps -a
CONTAINER ID   IMAGE                           COMMAND   CREATED              STATUS                      PORTS     NAMES
0ae9d60bf4fb   xiu114514/testrepository:v2.0   "sh"      47 seconds ago       Exited (0) 43 seconds ago             mybusybox2
6b521ab1c168   xiu114514/testrepository:v2.0   "sh"      About a minute ago   Exited (0) 56 seconds ago             mybusybox1

不过这次我们删除容器不再通过id删除,我们用标签删除看下情况:

bash 复制代码
ena@NightCode:~$ sudo docker rmi xiu114514/testrepository:v2.0
Untagged: xiu114514/testrepository:v2.0
ena@NightCode:~$ sudo docker ps -a
CONTAINER ID   IMAGE          COMMAND   CREATED         STATUS                     PORTS     NAMES
0ae9d60bf4fb   af2c3e96bcf1   "sh"      3 minutes ago   Exited (0) 3 minutes ago             mybusybox2
6b521ab1c168   af2c3e96bcf1   "sh"      3 minutes ago   Exited (0) 3 minutes ago             mybusybox1

可以看到它仅仅只是去了个标签,并没有出现deleted。同时原本ps -a显示镜像名称的位置变成了镜像id。

我们只有到删除此镜像id的最后一个标签时因为他是此镜像的最后一个标签了,才会进行报错需要我们使用-f选项进行强制删除:

bash 复制代码
ena@NightCode:~$ sudo docker rmi xiu114514/testrepository:v3.0
Untagged: xiu114514/testrepository:v3.0
Untagged: xiu114514/testrepository@sha256:086417a48026173aaadca4ce43a1e4b385e8e62cc738ba79fc6637049674cac0
ena@NightCode:~$ sudo docker rmi busybox:1.36.0
Error response from daemon: conflict: unable to remove repository reference "busybox:1.36.0" (must force) - container 6b521ab1c168 is using its referenced image af2c3e96bcf1
ena@NightCode:~$ sudo docker rmi -f busybox:1.36.0
Untagged: busybox:1.36.0
Untagged: busybox@sha256:9e2bbca079387d7965c3a9cee6d0c53f4f4e63ff7637877a83c4c05f2a666112
Deleted: sha256:af2c3e96bcf1a80da1d9b57ec0adc29f73f773a4a115344b7e06aec982157a33

三.较为综合的操作案例

3.1离线迁移镜像

因为有的时候我们可能处于一个不允许联网的环境,比如政企或军工方面隐密性比较高的单位是不允许你联网的,这时候就需要离线的迁移镜像进行使用。

在此之前我们先来了解一个命令scp(不是某个基金会啊别串门了):

SCP(Secure Copy Protocol) 是基于 SSH 的安全文件传输命令,用于在本地和远程系统之间安全地复制文件。
基本语法:

bash 复制代码
scp [选项] [源文件] [目标路径]

完整语法格式:

bash 复制代码
# 从本地复制到远程
scp [options] source_file user@remote_host:destination_path

# 从远程复制到本地
scp [options] user@remote_host:source_file destination_path

# 远程复制到远程
scp [options] user1@remote_host1:source_file user2@remote_host2:destination_path

关键参数:

选项 说明 示例 适用场景
-r 递归复制整个目录 scp -r dir/ user@host:/path/ 复制文件夹及其所有内容
-P 指定 SSH 端口(默认22) scp -P 2222 file user@host:/path 使用非标准 SSH 端口时
-p 保留文件修改时间、访问时间和权限 scp -p file user@host:/path 备份文件时需要保留原始属性
-C 启用压缩(传输时压缩) scp -C file user@host:/path 传输文本文件或可压缩文件时
-q 静默模式,不显示进度/警告 scp -q file user@host:/path 脚本中不希望输出干扰信息时
-v 详细模式,显示调试信息 scp -v file user@host:/path 调试连接或传输问题时
-l 限制带宽(单位 Kbit/s) scp -l 100 file user@host:/path 限制带宽以避免影响其他服务
-i 使用指定的私钥文件 scp -i ~/.ssh/id_rsa file user@host:/path 使用非默认 SSH 密钥认证时
-4 强制使用 IPv4 scp -4 file user@host:/path 解决 IPv6 连接问题
-6 强制使用 IPv6 scp -6 file user@host:/path 强制使用 IPv6 地址
-c 指定加密算法 scp -c aes128-gcm@openssh.com file user@host:~ 需要特定加密算法时
-B 批处理模式,不询问密码 scp -B file user@host:/path 脚本中自动传输(需配置密钥)
-o 传递 SSH 选项 scp -o "StrictHostKeyChecking=no" file user@host:~ 需要特殊 SSH 配置时

我们这里只是简单用用,想要详细进行了解的读者可以自行查阅相关文档。下面我们用两台服务器演示下,首先我在A服务器上对我的nginx镜像进行tar压缩包的save:

bash 复制代码
miku@Nightcode:~/dockertest$ sudo docker images
[sudo] password for miku:                                            
                                                                                                                                                                                                                                                        i Info →   U  In Use
IMAGE          ID             DISK USAGE   CONTENT SIZE   EXTRA
nginx:1.29.4   fb01117203ff        228MB         62.6MB   
miku@Nightcode:~/dockertest$ sudo docker save -o nginx.tar nginx:1.29.4
miku@Nightcode:~/dockertest$ ls
nginx.tar
bash 复制代码
knd@Nightcode:~/dockertest$ sudo docker images
                                                                                                                                                                                                                                                        i Info →   U  In Use
IMAGE   ID             DISK USAGE   CONTENT SIZE   EXTRA
knd@Nightcode:~/dockertest$ ll
total 12
drwxrwxr-x  3 knd knd 4096 Dec 21 17:43 ./
drwxr-x--- 16 knd knd 4096 Dec 21 17:35 ../
drwxrwxr-x  3 knd knd 4096 Dec 16 13:23 namespacets/

接下来我把这个tar压缩包传到我的另一台服务器的指定目录下:

bash 复制代码
miku@Nightcode:~/dockertest$ sudo scp ./nginx.tar knd@[你自己的公网ip]:/home/knd/dockertest
The authenticity of host '[你自己的公网ip] ([你自己的公网ip])' can't be established.
ED25519 key fingerprint is SHA256:6IDpFwRmkfFSn8K1mPSaXNE5pMhoafn8/0P/Ycq9OwU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[你自己的公网ip]' (ED25519) to the list of known hosts.
knd@[你自己的公网ip]'s password: 
nginx.tar   

这时可以看到另一台云服务器下已经有对应文件了:

bash 复制代码
knd@Nightcode:~/dockertest$ ls
namespacets  nginx.tar

我们给他运行起来看中不中:

bash 复制代码
knd@Nightcode:~/dockertest$ sudo docker load -i ./nginx.tar
Loaded image: nginx:1.29.4
knd@Nightcode:~/dockertest$ sudo docker run --name=nginx -d -p 8080:80 nginx:1.29.4
b99ccae8039fcf95fb2847de73a110a366de064997ad7c6266e634dffab01a00
knd@Nightcode:~/dockertest$ curl 127.0.0.1:8080
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
html { color-scheme: light dark; }
body { width: 35em; margin: 0 auto;
font-family: Tahoma, Verdana, Arial, sans-serif; }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

访问对应端口发现中的很,测试结束。

补充镜像存储的压缩与共享

实际上如果人家docker hub在服务端时找到了你上传的这个容器镜像,他是不会对你的容器镜像在多进行一次保存的,就像引用一样:

bash 复制代码
ena@NightCode:~/dockertest$ sudo docker tag nginx:1.29.4 xiu114514/nginx:1.29.4
ena@NightCode:~/dockertest$ sudo docker push xiu114514/nginx:1.29.4
The push refers to repository [docker.io/xiu114514/nginx]
8921786c2de3: Mounted from library/nginx 
08ba9962589f: Mounted from library/nginx 
6e32bc56a725: Mounted from library/nginx 
6898c33749d5: Mounted from library/nginx 
69f56ce8c461: Mounted from library/nginx 
20cf308e6957: Mounted from library/nginx 
77a2b55fbe8b: Mounted from library/nginx 
1.29.4: digest: sha256:24843e71676f1952557461871fd09298e43d873cee2b0d429bebc7e137cfb347 size: 1778

注意看这一行 Mounted from library/nginx表示它实际上已经在云端找到了对应的文件,所以我们上传的文件实际上并没有被实际保存。

还有一点云端实际上保存的是压缩包,从本地镜像大小和仓库看到的大小对比就能看出来:

bash 复制代码
ena@NightCode:~/dockertest$ sudo docker images
REPOSITORY        TAG       IMAGE ID       CREATED       SIZE
nginx             1.29.4    576306625d79   11 days ago   152MB

差这么大肯定云端存储的是压缩包,也是为了减少传输时间和存储空间的权益之计。

相关推荐
可爱又迷人的反派角色“yang”2 小时前
docker基本概念(一)
linux·运维·docker·容器
CHINAHEAO2 小时前
Docker 安装Bagisto详细过程
运维·docker·容器
西瓜和拾月2 小时前
Ubuntu Server 24.04 LVM 分区扩容
linux·运维·ubuntu
RisunJan2 小时前
Linux命令-help命令(查看 Shell 内置命令帮助信息)
linux·运维·服务器
RemainderTime2 小时前
(十)Spring Cloud Alibaba 2023.x:生产级 CI/CD 全链路实战(从 Dockerfile 到 Jenkins)
运维·spring cloud·ci/cd·docker·jenkins
yenggd2 小时前
华为SRv6 BE跨域配置案例
运维·网络·计算机网络·华为
梁正雄2 小时前
linux服务-Kibana8原理与安装
linux·运维·服务器
专业开发者2 小时前
楼宇自动化如何提升运营效率
运维·物联网·自动化
Radan小哥2 小时前
Docker学习笔记—day013
笔记·学习·docker