Docker:Docker image常用命令使用及实操
- 一.docker镜像常用命令认识与上手
-
- [1.1docker rmi](#1.1docker rmi)
- [1.2docker save](#1.2docker save)
- [1.3docker load](#1.3docker load)
- [1.4docker history](#1.4docker history)
- [1.5docker image prune](#1.5docker image prune)
- 二.用于上手的操作案例
- 三.较为综合的操作案例
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
显示镜像历史,更准确些说应该是查看构建过程中的中间层
语法
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
功能
删除不使用的镜像。
语法
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

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