Docker 镜像使用

当运行容器时,使用的镜像如果在本地中不存在,docker 就会自动从 docker 镜像仓库中下载,默认是从 Docker Hub 公共镜像源下载。

下面我们来学习:

  • 1、管理和使用本地 Docker 主机镜像
  • 2、创建镜像

如果从 Docker Hub 下载镜像非常缓慢,可以参照 镜像加速器 一节配置加速器。


列出镜像列表

我们可以使用 docker images 来列出本地主机上的镜像。

$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             SIZE
docker101tutorial   latest              b523871e4ae1        7 days ago          26.5MB
<none>              <none>              b484ee413c68        7 days ago          121MB
<none>              <none>              1c8c919ad635        7 days ago          108MB
<none>              <none>              5142b6d09eae        7 days ago          224MB
node                12-alpine           057fa4cc38c2        7 days ago          89.3MB
python              alpine              8ecf5a48c789        4 weeks ago         78.9MB
nginx               alpine              7d0cdcc60a96        5 weeks ago         21.3MB
php                 7.2                 1be809f883fc        10 months ago       400MB
php                 latest              d1d1e483ba07        10 months ago       401MB
mysql               5.7                 a1aa4f76fab9        13 months ago       373MB
nginx               latest              2bcb04bdb83f        15 months ago       109MB
centos              latest              9f38484d220f        16 months ago       202MB
php                 5.6-fpm             3458979c7744        17 months ago       344MB
duckll/lnmp         latest              6615486e0480        17 months ago       2.62GB
hello-world         latest              fce289e99eb9        18 months ago       1.84kB
tutum/mysql         5.6                 ffe19c282aec        4 years ago         472MB
mikesplain/telnet   latest              16a7ed249fe6        4 years ago         4.79MB

各个选项说明:

  • REPOSITORY:表示镜像的仓库源
  • TAG:镜像的标签
  • IMAGE ID:镜像ID
  • CREATED:镜像创建时间
  • SIZE:镜像大小

同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本,如 ubuntu 仓库源里,有 15.10、18.04 等多个不同的版本,我们使用 REPOSITORY:TAG 来定义不同的镜像。

所以,我们如果要使用版本为18.04的ubuntu系统镜像来运行容器时,命令如下:

$ docker run -t -i ubuntu:18.04 /bin/bash
Unable to find image 'ubuntu:18.04' locally
18.04: Pulling from library/ubuntu
a1125296b23d: Pull complete
3c742a4a0f38: Pull complete
4c5ea3b32996: Pull complete
1b4be91ead68: Pull complete
Digest: sha256:e5b0b89c846690afe2ce325ac6c6bc3d686219cfa82166fc75c812c1011f0803
Status: Downloaded newer image for ubuntu:18.04
root@38ca57ac26bd:/#

参数说明:

  • -i: 交互式操作。
  • -t: 终端。
  • ubuntu:18.04: 这是指用 ubuntu 18.04 版本镜像为基础来启动容器,如果docker无此镜像会先下载镜像。
  • /bin/bash:放在镜像名后的是命令,这里我们希望有个交互式 Shell,因此用的是 /bin/bash。

如果要使用版本为 19.10 的 ubuntu 系统镜像来运行容器时,命令如下:

docker run -t -i ubuntu:19.10 /bin/bash

如果你不指定一个镜像的版本标签,例如你只使用 ubuntu,docker 将默认使用 ubuntu:latest 镜像。


获取一个新的镜像

当我们在本地主机上使用一个不存在的镜像时 Docker 就会自动下载这个镜像。如果我们想预先下载这个镜像,我们可以使用 docker pull 命令来下载它

docker pull ubuntu:19.10

下载完成后,我们可以直接使用这个镜像来运行容器。


查找镜像

我们可以从 Docker Hub 网站来搜索镜像,Docker Hub 网址为: https://hub.docker.com/

我们也可以使用 docker search 命令来搜索镜像。比如我们需要一个nginx 的镜像来作为我们的 web 服务。我们可以通过 docker search 命令搜索 nginx 来寻找适合我们的镜像。

$ docker search nginx
NAME                               DESCRIPTION                                     STARS               OFFICIAL            AUTOMATED
nginx                              Official build of Nginx.                        13440               [OK]
jwilder/nginx-proxy                Automated Nginx reverse proxy for docker con…   1833                                    [OK]
richarvey/nginx-php-fpm            Container running Nginx + PHP-FPM capable of…   780                                     [OK]
linuxserver/nginx                  An Nginx container, brought to you by LinuxS…   119
bitnami/nginx                      Bitnami nginx Docker Image                      86                                      [OK]
tiangolo/nginx-rtmp                Docker image with Nginx using the nginx-rtmp…   81                                      [OK]
alfg/nginx-rtmp                    NGINX, nginx-rtmp-module and FFmpeg from sou…   70                                      [OK]
jc21/nginx-proxy-manager           Docker container for managing Nginx proxy ho…   69
nginxdemos/hello                   NGINX webserver that serves a simple page co…   55                                      [OK]
jlesage/nginx-proxy-manager        Docker container for Nginx Proxy Manager        50                                      [OK]
...

NAME: 镜像仓库源的名称

DESCRIPTION: 镜像的描述

OFFICIAL: 是否 docker 官方发布

stars: 类似 Github 里面的 star,表示点赞、喜欢的意思。

AUTOMATED: 自动构建。


拖取镜像

我们决定使用上图中的 nginx 官方版本的镜像,使用命令 docker pull 来下载镜像。

docker pull nginx

下载完成后,我们就可以使用这个镜像了。

docker run nginx

删除镜像

镜像删除使用 docker rmi 命令,比如我们删除 hello-world 镜像:

$ docker rmi hello-world
Untagged: hello-world:latest
Untagged: hello-world@sha256:2557e3c07ed1e38f26e389462d03ed943586f744621577a99efb77324b0fe535
Deleted: sha256:fce289e99eb9bca977dae136fbe2a82b6b7d4c372474c9235adc1741675f587e
Deleted: sha256:af0b15c8625bb1938f1d7b17081031f649fd14e6b233688eea3c5483994a66a3

创建镜像

当我们从 docker 镜像仓库中下载的镜像不能满足我们的需求时,我们可以通过以下两种方式对镜像进行更改。

  • 1、从已经创建的容器中更新镜像,并且提交这个镜像
  • 2、使用 Dockerfile 指令来创建一个新的镜像

更新镜像

更新镜像之前,我们需要使用镜像来创建一个容器,并在运行的容器内使用 apt-get update 命令进行更新。

$ docker run -t -i ubuntu:18.04 /bin/bash
root@be1b263ca341:/# apt-get update
Get:1 http://security.ubuntu.com/ubuntu bionic-security InRelease [88.7 kB]
Get:2 http://archive.ubuntu.com/ubuntu bionic InRelease [242 kB]
Get:3 http://security.ubuntu.com/ubuntu bionic-security/universe amd64 Packages [869 kB]
Get:4 http://archive.ubuntu.com/ubuntu bionic-updates InRelease [88.7 kB]
...

在完成操作之后,输入 exit 命令来退出这个容器。

此时 ID 为 be1b263ca341 的容器,是按我们的需求更改的容器。我们可以通过命令 docker commit 来提交容器副本。

$ docker commit -m="has update" -a="runoops" be1b263ca341 runoops/ubuntu:v2
sha256:5839031c7f15eb2d3d387eaae89fa91ff334a3c89becf9d5b4f1768af4c31493

各个参数说明:

  • -m: 提交的描述信息
  • -a: 指定镜像作者
  • be1b263ca341:容器 ID
  • runoops/ubuntu:v2: 指定要创建的目标镜像名

我们可以使用 docker images 命令来查看我们的新镜像 runoops/ubuntu:v2

localhost:~ changeluo$ docker images
REPOSITORY          TAG                 IMAGE ID            CREATED              SIZE
runoops/ubuntu      v2                  5839031c7f15        About a minute ago   93.2MB
ubuntu              18.04               d27b9ffc5667        39 hours ago         64.2MB
docker101tutorial   latest              b523871e4ae1        7 days ago           26.5MB
<none>              <none>              b484ee413c68        7 days ago           121MB
<none>              <none>              1c8c919ad635        7 days ago           108MB
...

使用我们的新镜像 runoops/ubuntu 来启动一个容器:

localhost:~ changeluo$ docker run -t -i runoops/ubuntu:v2 /bin/bash
root@dadde30d9998:/#