前言

上一篇我们讲解了 Docker镜像、容器、仓库三大核心概念,本篇继续深入,详解三者之间的完整流转关系,同时整理 Docker 日常最常用的镜像操作、容器操作全套命令,附带实操示例,零基础也能快速上手,适合直接用于生产环境。

一、镜像、容器、仓库三者完整关系

Docker 的核心工作流程可以概括为:构建镜像 → 拉取 / 推送镜像 → 运行容器 → 管理容器,三者完整交互关系如下:

  1. 镜像:静态只读模板,可通过Dockerfile构建、容器提交生成;
  2. 仓库:镜像存储分发平台,可从仓库pull拉取镜像,也可将本地镜像push推送到仓库;
  3. 容器:镜像运行的动态实例,可通过镜像run创建,支持启动、停止、进入、导出删除等操作。

三者完整流转示意图:

简单理解:

  • 仓库负责存放镜像
  • 镜像负责提供环境模板
  • 容器负责运行应用服务

二、Docker 镜像操作命令

2.1 获取镜像:docker pull

Docker 运行容器前,本地必须存在对应镜像,本地无镜像时会自动从仓库下载。

命令格式
docker pull [选项] [Docker Registry地址[:端口号]/]仓库名[:标签]
  • 仓库地址:默认是 Docker Hub 官方仓库;
  • 仓库名:<用户名>/<软件名>,官方镜像默认用户名library
  • 标签:镜像版本,不指定默认拉取latest最新版。
实操示例

拉取 Nginx 1.20.2 版本镜像:

[root@localhost ~]# docker pull nginx:1.20.2
1.20.2: Pulling from library/nginx
214ca5fb9032: Pull complete 
50836501937f: Pull complete 
d838e0361e8e: Pull complete 
fcc7a415e354: Pull complete 
dc73b4533047: Pull complete 
e8750203e985: Pull complete 
Digest: sha256:38f8c1d9613f3f42e7969c3b1dd5c3277e635d4576713e6453c6193e66270a6d
Status: Downloaded newer image for nginx:1.20.2
docker.io/library/nginx:1.20.2

下载过程采用分层下载,和镜像分层存储原理一致,下载完成后通过 sha256 摘要校验镜像完整性。

2.2 列出本地镜像:docker image ls /docker images

查看本地已下载的所有镜像:

# 列出所有镜像
docker image ls
# 简写
docker images

# 过滤查看指定仓库镜像
docker image ls centos
# 查看指定版本镜像
docker image ls centos:7.9.2009
# 仅输出镜像ID
docker image ls -q
输出字段说明
字段含义
REPOSITORY仓库名
TAG镜像版本标签
IMAGE ID镜像唯一 ID
CREATED创建时间
SIZE镜像大小

一个镜像可以对应多个标签,相同镜像 ID 代表是同一个镜像。

2.3 删除本地镜像:docker image rm

删除不需要的本地镜像,支持镜像 ID、镜像名、镜像摘要删除。

命令格式
docker image rm [选项] <镜像1> [<镜像2> ...]
实操示例
# 查看redis镜像
docker image ls redis
# 通过短ID删除镜像
docker image rm 595
# 通过镜像名:标签删除
docker image rm redis:latest

三、Docker 容器基础操作命令

3.1 运行容器:docker run

基于镜像创建并启动容器,是最核心的容器命令。

常用参数
  • -it:交互式运行,分配伪终端,可进入容器内部;
  • -d:后台守护进程运行容器;
  • --rm:容器退出后自动删除,避免占用空间;
  • -p:端口映射,宿主机端口:容器端口。
示例 1:交互式运行 CentOS 容器
[root@localhost home]# docker run -it --rm centos:7.6.1810 bash
# 进入容器后查看系统版本
[root@1a2a0cf43289 /]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
# 退出容器
exit

示例 2:后台运行容器
# 后台循环输出hello world
docker run -d centos:7.6.1810 /bin/sh -c "while true; do echo hello world; sleep 1; done"
# 查看容器日志
docker logs 容器ID

docker run 后台执行流程:

  1. 检查本地镜像,不存在则自动拉取;
  2. 创建容器,挂载可读写层;
  3. 配置网络、分配 IP;
  4. 执行指定应用;
  5. 应用终止则容器自动停止。

3.2 查看容器状态

# 查看正在运行的容器
docker ps
# 查看所有容器(包含已停止)
docker ps -a
# 仅输出容器ID
docker ps -q

3.3 容器启停操作

# 启动已停止的容器
docker container start 容器ID
# 停止运行中的容器
docker container stop 容器ID
# 重启容器
docker container restart 容器ID

3.4 进入容器

后台运行的容器,需要进入内部操作,推荐使用docker exec,退出不会停止容器。

两种进入方式对比
  1. docker attach:退出容器时,容器会同步停止,不推荐;
  2. docker exec:独立终端,退出不影响容器运行,生产首选。
实操示例
# 后台启动容器
docker run -it -d centos:7.6.1810
# 进入容器
docker exec -it 容器ID bash
# 退出容器(容器不会停止)
exit

3.5 容器导出与导入

用于容器跨服务器迁移,导出容器快照,导入为镜像。

# 导出容器快照为tar文件
docker export 容器ID > centos-7.6.1810.tar
# 导入快照为本地镜像
cat centos-7.6.1810.tar | docker import - centos:7.6.1810

3.6 删除容器

# 删除已停止的容器
docker container rm 容器ID
# 强制删除运行中的容器
docker container rm -f 容器ID
# 批量清理所有停止的容器
docker container prune

四、核心总结

  1. 镜像:核心命令pull拉取、ls查看、rm删除,是容器的运行模板;
  2. 容器:核心命令run创建、start/stop启停、exec进入、rm删除,是镜像的运行实例;
  3. 仓库:镜像的存储分发中心,实现镜像的拉取与推送;
  4. 实操重点:优先掌握docker pulldocker rundocker psdocker execdocker rm,可覆盖 90% 日常使用场景。

更多推荐