Docker 入门系列(2)- Docker 镜像、获取查看、修改镜像标签、查找删除创建镜像、导入导出镜像

Docker 运行容器前需要本地存在对应的镜像,如果镜像没保存在本地,Docker 会尝试先从默认镜像仓库下载 https://hub.docker.com/,用户也可以通过配置,使用自定义的镜像仓库。

1. 获取镜像

docker  pull NAME[:TAG]

其中,NAME 是镜像仓库的名称(用来区分镜像),TAG 是镜像的标签 ( 往往用来表示版本信息) 。如果不显式指定 TAG,则默认会选择 latest 标签,这会下载仓库中最新版本的镜像。

~/docker$ docker pull ubuntu:16.04
16.04: Pulling from library/ubuntu
7b8b6451c85f: Pull complete 
ab4d1096d9ba: Pull complete 
e6797d1788ac: Pull complete 
e25c5c290bde: Pull complete 
Digest: sha256:e547ecaba7d078800c358082088e6cc710c3affd1b975601792ec701c80cdd39
Status: Downloaded newer image for ubuntu:16.04

2. 查看镜像

docker  images

列出本地主机上已有的镜像,各个字段信息分别为来自于哪个仓库(REPOSITORY)、镜像的标签信息(TAG )、镜像的唯一ID号(IMAGE ID)、创建时间(CREATED)、镜像大小(SIZE)。

~/docker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               a51debf7e1eb        2 weeks ago         116MB
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB

3. 修改本地镜像标签

docker tag

为本地镜像添加新的标签:

~/docker$ docker tag ubuntu:16.04 ubuntu:test
~/docker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               a51debf7e1eb        2 weeks ago         116MB
ubuntu              test                a51debf7e1eb        2 weeks ago         116MB
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB

不同标签的镜像 ID 完全一致,说明它们实际上指向了同一个镜像文件,只是别名不同而已。

4. 查看镜像详细信息

docker inspect

docker inspect 命令可以获取该镜像的详细信息,详情如下:

~/docker$ docker inspect ubuntu
[]
Error: No such object: ubuntu
~/docker$ docker inspect ubuntu:16.04
[
    {
        "Id": "sha256:a51debf7e1eb2018400cef1e4b01f2e9f591f6c739de7b5d6c142f954f3715a7",
        "RepoTags": [
            "ubuntu:16.04",
            "ubuntu:test"
        ],
        "RepoDigests": [
            "ubuntu@sha256:e547ecaba7d078800c358082088e6cc710c3affd1b975601792ec701c80cdd39"
        ],
        ....
    }
]

要查看具体某一项时可以使用 -f 来指定,格式必须按照JSON的层次结构来,例如

wohu@wohu-pc:~$ docker inspect --format='{{.NetworkSettings.Networks.carla_0911_default.IPAddress}}' 1112
172.19.0.2
wohu@wohu-pc:~$ docker inspect -f '{{.NetworkSettings.Networks.carla_0911_default.IPAddress}}' 1112
172.19.0.2
wohu@wohu-pc:~$ docker inspect -f {{".NetworkSettings.Networks.carla_0911_default.IPAddress"}} 1112
172.19.0.2
wohu@wohu-pc:~$

5. 查找镜像

docker search

docker search 命令可以搜索远端仓库中共享的镜像,默认搜索官方仓库中的镜像。用法为 docker search TERM,支持的参数主要包括:

  • –automated=true| false: 仅显示自动创建的镜像,默认为否;

  • –no-trunc=true| false: 输出信息不截断显示,默认为否;

  • -s,–stars=X: 指定仅显示评价为指定星级以上的镜像,默认为0,即输出所有镜像。

~/docker$ docker search mysql
NAME                                                   DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
mysql                                                  MySQL is a widely used, open-source relation…   7465                [OK]                
mariadb                                                MariaDB is a community-developed fork of MyS…   2407                [OK]                
...

6. 删除镜像

docker rmi IMAGE[IMAGE...]

docker rmi 命令可以删除镜像,命令格式为 docker rmi IMAGE[IMAGE…],其中 IMAGE 可以为标签或ID。

~/docker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               a51debf7e1eb        2 weeks ago         116MB
ubuntu              test                a51debf7e1eb        2 weeks ago         116MB
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB
~/docker$ docker rmi ubuntu:test
Untagged: ubuntu:test
~/docker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
ubuntu              16.04               a51debf7e1eb        2 weeks ago         116MB
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB

当同一个镜像拥有多个标签的时候,docker rmi 命令只是删除该镜像多个标签中的指定标签而已,并不影响镜像文件。因此上述操作相当于只是删除了镜像 a51debf7e1eb 的标签而已。

当使用 docker rmi 命令,并且后面跟上镜像的 ID ( 也可以是能进行区分的部分 ID 串前缀 ) 时,会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。

注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的。

  • 先创建一个容器:
~/docker$ docker run ubuntu:16.04 echo "Hello, world"
Hello, world
  • 使用 docker ps -a 命令可以看到本机上存在的所有容器:
~/docker$ docker ps -a
CONTAINER ID        IMAGE               COMMAND                 CREATED             STATUS                      PORTS               NAMES
f632ff0305aa        ubuntu:16.04        "echo 'Hello, world'"   46 seconds ago      Exited (0) 45 seconds ago                       eloquent_swartz
33197473a278        hello-world         "/hello"                3 days ago          Exited (0) 3 days ago                           frosty_galileo
  • 试图删除该镜像,Docker 会提示有容器正在运行,无法删除:
~/docker$ docker rmi ubuntu:16.04
Error response from daemon: conflict: unable to remove repository reference "ubuntu:16.04" (must force) - container f632ff0305aa is using its referenced image a51debf7e1eb
  • 先删除依赖该镜像的所有容器,再使用ID 来删除镜像:
:~/docker$ docker rm f6
f6
:~/docker$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                  PORTS               NAMES
33197473a278        hello-world         "/hello"            3 days ago          Exited (0) 3 days ago                       frosty_galileo

7. 创建镜像

创建镜像有三种方法:

  1. 基于已有镜像的容器创建
  2. 基于本地模板导入
  3. 基于 Dockerfile 创建

基于已有镜像的容器创建:
该方法主要是使用 docker commit 命令。命令格式为

docker commit [OPTIONS]CONTAINER[REPOSITORY[:TAG]]

主要选项包括:

  • -a,–author=“”:作者信息
  • c,–change=[]:提交的时候执行 Dockerfile指令,包括CMD|
    ENTRYPOINT|ENV|EXPOSE|LABEL|ONBUILD|USER|VOLUME|WORKDIR等;
  • -m,–message=“”:提交消息
  • p,–pause=true:提交时暂停容器运行

创建新镜像示例

先启动一个镜像,并在其中进行修改操作,例如创建一个 test 文件,之后退出。

~/docker$ docker run -ti ubuntu:16.04
root@c53b34da8804:/# touch test.sh
root@c53b34da8804:/# pwd
/
root@c53b34da8804:/# ls
bin   dev  home  lib64  mnt  proc  run   srv  test.sh  usr
boot  etc  lib   media  opt  root  sbin  sys  tmp      var
root@c53b34da8804:/# exit
exit
~/docker$

容器 ID 为 c53b34da8804,该容器跟原来的 ubuntu 镜像相比已发生变化。使用 docker commit 命令提交为一个新的镜像,提交时使用 ID 或者名称来指定容器。

~/docker$ docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                      PORTS               NAMES
c53b34da8804        ubuntu:16.04        "/bin/bash"         16 minutes ago      Exited (0) 16 minutes ago                       mystifying_sanderson
33197473a278        hello-world         "/hello"            3 days ago          Exited (0) 3 days ago                           frosty_galileo
~/docker$ docker commit -m "add new file" -a "wohu1104" c53b34da8804  test_image
sha256:1cd880207b3efc2ce140237803672344fe3ec7ed3970dffc63c113cac262ed50
~/docker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test_image          latest              1cd880207b3e        18 seconds ago      116MB
ubuntu              16.04               a51debf7e1eb        2 weeks ago         116MB
ubuntu              latest              93fd78260bd1        2 weeks ago         86.2MB
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB

8. 导出和导入镜像

  • 使用 docker save 命令用来将镜像导出到本地文件
~/docker$ docker save -o ubuntu.tar ubuntu:16.04
~/docker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test_image          latest              1cd880207b3e        9 minutes ago       116MB
ubuntu              16.04               a51debf7e1eb        2 weeks ago         116MB
ubuntu              latest              93fd78260bd1        2 weeks ago         86.2MB
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB
~/docker$ ls
ubuntu.tar

其中 -o 和 > 表示输出到文件,ubuntu.tar 为目标文件,ubuntu:16.04 是源镜像名(name:tag)

  • 使用 docker load 将导出本地文件再导入到本地镜像库
~/docker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test_image          latest              1cd880207b3e        14 minutes ago      116MB
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB
~/docker$ docker load -i ubuntu.tar
Loaded image: ubuntu:16.04
~/docker$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
test_image          latest              1cd880207b3e        15 minutes ago      116MB
ubuntu              16.04               a51debf7e1eb        2 weeks ago         116MB
hello-world         latest              4ab4c602aa5e        2 months ago        1.84kB

其中 -i 和 < 表示从文件输入。会成功导入镜像及相关元数据,包括tag信息

9. 上传镜像

使用 docker push 命令上传镜像到仓库,默认上传到 Docker Hub官方仓库 ( 需要登录 )。命令格式为:

docker push NAME[:TAG] |[REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]

10. 清理镜像

使用 Docker 一段时间后,系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过下面命令进行清理

docker image prune -f 

参考:
https://www.cnblogs.com/lsgxeva/p/8746644.html

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值