这个章节涉及到 Docker 最核心的知识,也是在使用过程中最常使用到的,需要重点学习。
什么是Docker镜像、容器、仓库?
- Docker镜像:镜像是一个只读的模板,其中包含了创建 Docker 容器的说明,可以用来创建 Docker 容器。镜像可以包含操作系统、应用程序、依赖库、配置文件等。
- Docker容器:容器是代码的隔离环境。这意味着容器并不直接在操作系统上运行。容器是 Docker 镜像的一个运行实例,可以理解为一个轻量级的虚拟机,用面向对象的思想来看,其就是一个镜像的运行对象。容器包含了运行应用程序所需的所有组件,包括操作系统、应用程序、依赖库等。
- Docker仓库:仓库是用来存储和管理 Docker 镜像的地方,类似于代码仓库。Docker 官方提供了 Docker Hub 仓库,可以在其中存储和分享 Docker 镜像。用户也可以自建私有仓库来存储和管理自己的 Docker 镜像。
镜像、容器、仓库之间的关系

- 从仓库拉取 Docker 镜像
- 使用 Docker 镜像实例化一个 Docker 容器
- 运行 Docker 容器
Docker镜像
当运行容器时,使用的 Docker 镜像不在本地仓库中,Docker 就会从默认的 Docker 仓库中下载该镜像。一般是从 Docker 官方提供的 Docker Hub 仓库中下载。 下面来学习关于 Docker 镜像的相关操作。镜像列表

- REPOSITORY:表示镜像的仓库源
- TAG:镜像的标签, 同一仓库源可以有多个 TAG,代表这个仓库源的不同个版本
- IMAGE ID:镜像ID
- CREATED:镜像创建时间
- SIZE:镜像大小
查找镜像
- 在 Docker Hub查找


- 使用 Docker Search查找

- NAME: 镜像仓库源的名称
- DESCRIPTION: 镜像的描述
- OFFICIAL: 是否 docker 官方发布
- STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思。
- AUTOMATED: 自动构建。
- 使用 Docker Desktop 查找

拉取镜像
拉取镜像即从 Docker 仓库中拉取 Docker 镜像,本质上就是从远程的仓库中下载镜像到本地。 > 这里仍以 Redis 为样例进行编写,其他镜像的拉取同理。

删除镜像
这里我们演示删除之前下载的那个 Hello-World 镜像

- 先查看 Docker 容器

- 然后删除 Docker 容器

- 删除 Docker 镜像

如果一个镜像创建了多个容器,那么在删除该镜像之前,必须删除所有使用该镜像的容器,才能够删除该镜像。
更新镜像
Dokcer 镜像的更新就是在目前运行的 Docker 容器上进行修改,然后将更新后的 Docker 容器的所有内容,导出为一个 Docker 镜像,随后就可以使用该镜像创建 Docker 容器。- 先下载一个 Ubuntu20.04 镜像

- 创建一个该镜像的容器

- 在该容器内运行
apt-get update指令,更新 ubuntu 系统,更新后exit退出这个容器到我们本地的命令控制端。

- 提交容器副本

- -m: 提交的描述信息
- -a: 指定镜像作者
- 13999fa6f4f6:容器 ID
- codermast/ubuntu:latest: 指定要创建的目标镜像名
- 查看镜像列表

- 使用该镜像创建一个容器

生成镜像
镜像标签
我们可以使用docker tag 命令为镜像添加一个新的标签。
- e650c5f208da:为镜像的 ID
- codermast/ubuntu:v1:Tag 名

codermast/ubuntu:latest 也可以使用 codermast/ubuntu:v1。
Tag 可以看做是给镜像起别名,其本质的镜像 ID 不变,具体底层就是同一个镜像的不同引用而已。
镜像导入和导出
- 镜像导出
- codermast-ubuntu-latest.tar:要导出的文件名
- e650c5f208da:要导出的镜像 ID

- 镜像导入
- codermast-ubuntu-latest.tar:为要导入的文件名。

Docker容器
在上面的 Docker 镜像的相关操作中,我们或多或少的了解和学习了一些 Docker 容器的相关操作。容器启动
- -it 可以连写的,表示 -i -t
- -t: 在新容器内指定一个伪终端或终端。
- -i: 允许你对容器内的标准输入 (STDIN) 进行交互
- codermast/ubuntu:latest:镜像名称

容器查看
- -a 表示 all,即查看所有容器

容器再启动
我们看到,刚才codermast/ubuntu:latest 的实例d3a11e669e88 已经停止了Exited (0) 4 seconds ago,我们重启这个实例

容器停止和重启
- 容器停止
- 容器重启

后台模式与进入
在使用 -d 参数创建容器时,容器启动后会进入后台,那么此时我们怎么进入容器呢?- 使用 `docker attach [容器ID]

docker exec -i -t [容器ID] /bin/bash

容器导出和导入
- 容器的导出
- 246b23d5d5a5:容器 ID
- redis-latest-codermast.tar:导出文件名

- 容器的导入
- redis-latest-codermast.tar:配置文件名
- codermast/redis:latest:导入的镜像名称

强制删除容器
我们知道,当容器在运行的时候是无法直接删除的,需要先将容器先停止运行,随后才能删除该容器,那么能不能直接删除正在运行中的容器呢? 答案是可以的,我们只需要在其中加上-f 的选项即可,代表 force 强制的意思。
- b234f112186d:为 正在运行 Docker 容器的 ID

清理停止的容器
在容器停止运行后,并不会自动被删除,需要手动清除。该指令一次性清除所有的停止状态的容器。
容器别名及操作
上述对容器的操作都是针对容器 ID,这个 ID 是随机的,为了方便起见,我们可以设置一个自定义的 name 来进行操作。仅需在指令中设置name 选项即可。
- codermast-redis-001:自定义的名称
- redis:latest:镜像名称

容器错误日志
- 实时查看docker容器名为user-uat的最后10行日志
docker logs -f -t --tail 10 user-uat
- 查看指定时间后的日志,只显示最后100行:
docker logs -f -t --since="2024-01-14" --tail=100 user-uat
- 查看最近30分钟的日志:
docker logs --since 30m user-uat
- 查看某时间之后的日志:
docker logs -t --since="2024-01-14T21:00:00" user-uat
- 查看某时间段日志:
docker logs -t --since="2024-01-14T21:00:00" --until "2018-02-09T12:23:37" user-uat
- 将错误日志写入文件:
docker logs -f -t --since="2024-01-14" user-uat | grep error >> logs_error.txt
Docker仓库
Docker 仓库是集中存放 Docker 镜像的地方。默认使用的仓库为 Docker Hub,也可以更改为自己的想使用的仓库。类似于 Github 的仓库,只不过 Github 管理的是代码,Docker Hub 管理的是 Docker 镜像。 这里以 Docker Hub 为例进行说明。- 登录仓库
- 将准备好的镜像推送至仓库
- codermast/redis:latest:Docker 镜像名