dokcer - 2 常用命令

1. docker 服务的操作

2. 镜像管理

2.1) 拉取镜像 dokcer pull
docker pull busybox
如果失败了
docker pull nginx Using default tag: latest Error response from daemon: Get "https://registry-1.docker.io/v2/": net/http: request canceled while waiting for connection (Client.Timeout exceeded while awaiting headers)
拉取指定版本
例如下载nginx https://1ms.run/r/library/nginx
# docker pull nginx:1.29 用冒号
# 1ms 镜像
docker pull docker.1ms.run/library/nginx:1.29
# 2 轩辕镜像,这个好像要密码?
docker pull docker.xuanyuan.run/library/nginx:1.29

2.2) 检索镜像 docker search
docker search docker.1ms.run/nginx
# 或者
docker search docker.xuanyuan.cloud/nginx
# docker search nginx 配置了 daemon.json 也不能直接搜,可以加站点

2.3) 查看镜像 docker images
# 查看所有已下载的镜像(推荐,输出清晰)
docker images
# 等价命令(Docker 官方推荐的规范写法,功能相同)
docker image ls
[root@node01 docker]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
docker.1ms.run/library/nginx 1.29 d261fd19cb63 7 days ago 152MB
nginx latest ad5708199ec7 2 months ago 192MB
2.4) 删除镜像 docker rmi
docker rmi [OPTIONS] IMAGE [IMAGE...]
参数说明:
IMAGE: 要删除的镜像的名称或 ID。可以是镜像名、镜像 ID 或镜像摘要。
OPTIONS: 可选参数,用来控制命令的行为。
# 删除 REPOSITORY
[root@node01 docker]# docker rmi docker.1ms.run/library/nginx:1.29
# 删除IAMGE ID
[root@node01 docker]# docker rmi d261fd19cb63
3. 容器操作


3.1) 启动镜像 docker run
语法
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
常用参数说明:
- -d: 后台运行容器并返回容器 ID。
- -it: 交互式运行容器,分配一个伪终端。
- --name: 给容器指定一个名称。
- -p: 端口映射,格式为
host_port:container_port。 - -v: 挂载卷,格式为
host_dir:container_dir。 --rm: 容器停止后自动删除容器。--env或-e: 设置环境变量。--network: 指定容器的网络模式。- --restart: 容器的重启策略(如
no、on-failure、always、unless-stopped)。 -u: 指定用户。
示例1,首次启动镜像
docker run -d --name busybox-first busybox
-d 代表后台运行容器
示例2

docker images
- 作用:列出本地 Docker 主机上的所有镜像。
- 输出解读:会显示镜像的仓库名(
REPOSITORY)、标签(TAG)、镜像 ID(IMAGE ID)、创建时间(CREATED)和大小(SIZE)等信息,帮助用户了解当前本地有哪些可用的 Docker 镜像。
docker run --name nginx-container ad5708199ec7
- 作用:基于指定的镜像(这里是 ID 为
ad5708199ec7的镜像)创建并启动一个容器,并为该容器命名为nginx-container。 - 参数说明:
--name nginx-container:指定容器的名称为nginx-container,方便后续通过名称管理容器。ad5708199ec7:是要使用的 Docker 镜像的 ID,Docker 会根据这个 ID 找到对应的镜像来创建容器。
- 执行结果:启动容器后,会输出容器启动过程中的日志信息,比如截图中显示的 Nginx 启动相关的日志,表明 Nginx 服务在容器内开始运行。
docker ps -a
- 作用:列出所有的 Docker 容器,包括正在运行的和已经停止的容器。
- 输出解读:显示容器的 ID(
CONTAINER ID)、镜像(IMAGE)、启动命令(COMMAND)、创建时间(CREATED)、状态(STATUS)、端口(PORTS)和名称(NAMES)等信息,能让用户全面了解容器的运行情况。
docker rm 97e1a730ec2f
- 作用:删除指定的 Docker 容器,这里要删除的容器 ID 是
97e1a730ec2f。 - 使用场景:当容器不再需要时,通过该命令可以清理容器,释放资源。需要注意的是,删除容器时,容器必须处于停止状态(如果容器在运行,需要先使用
docker stop命令停止容器)。
docker run -d --name nginx-container ad5708199ec7
- 作用:基于 ID 为
ad5708199ec7的镜像,以后台( daemon)模式创建并启动一个名为nginx-container的容器。 - 参数说明:
-d:表示以守护进程方式运行容器,即容器在后台运行,不会占用当前终端。--name nginx-container:同样是指定容器名称。ad5708199ec7:镜像 ID。
- 执行结果:容器在后台启动,会返回容器的 ID,用户可以通过
docker ps命令查看该后台运行的容器状态。
dokcer 启动 nginx
示例 1
[root@node01 docker]# docker run -d --name nginx-container1 nginx
5f68e25e59539cd6d5142770c624b55311af8eb28b40e0caf23337e656b0bdb6
[root@node01 docker]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
5f68e25e5953 nginx "/docker-entrypoint.…" 14 seconds ago Up 13 seconds 80/tcp nginx-container1
示例 2
docker run -d -p 8080:80 --name nginx-container ad5708199ec7
或者
docker run -d -p 8080:80 --name nginx-container nginx:latest
[root@node01 ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
89a8987defcb ad5708199ec7 "/docker-entrypoint.…" 5 seconds ago Up 4 seconds 0.0.0.0:8080->80/tcp, :::8080->80/tcp nginx-container
ad5708199ec7 是nginx的 image ID。

3.2) 运行中的容器 docker ps
docker ps 命令只显示运行中的容器,但也可以通过指定选项来显示所有容器,包括停止的容器。
docker ps [OPTIONS]
OPTIONS说明:
- -a, --all: 显示所有容器,包括停止的容器。
-q, --quiet: 只显示容器 ID。-l, --latest: 显示最近创建的一个容器,包括所有状态。-n: 显示最近创建的 n 个容器,包括所有状态。--no-trunc: 不截断输出。-s, --size: 显示容器的大小。--filter, -f: 根据条件过滤显示的容器。--format: 格式化输出。
示例:
# 列出所有的 Docker 容器,包括正在运行的和已经停止的容器。
docker ps -a
3.3) 开始、暂停、重启 docker start/stop/restart
docker start 启动一个或多个已经创建的容器。
语法
docker start [OPTIONS] CONTAINER [CONTAINER...]
参数
-a: 附加到容器的标准输入输出流。-i: 附加并保持标准输入打开。
docker stop 停止一个运行中的容器。
语法
docker stop [OPTIONS] CONTAINER [CONTAINER...]
参数
-t, --time: 停止容器之前等待的秒数,默认是 10 秒。
docker restart 重启容器。
语法
docker restart [OPTIONS] CONTAINER [CONTAINER...]
参数
-t, --time: 重启容器之前等待的秒数,默认是 10 秒。
docker start <容器 ID/Name>
docker restart 容器id1 [容器id2] [...] #重启
3.4) 监视资源 docker stats
docker stats 命令用于实时显示 Docker 容器的资源使用情况,包括 CPU、内存、网络 I/O 和块 I/O。
docker stats 似于 Linux 系统中的 top 命令,但它专门针对 Docker 容器。通过 docker stats,用户可以监控容器的资源使用情况,帮助优化性能和进行故障排除。
docker stats [OPTIONS] [CONTAINER...]
OPTIONS 说明:
- --all , -a :显示所有的容器,包括未运行的。
- --format :指定返回值的模板文件。
- --no-stream :展示当前状态就直接退出了,不再实时更新。
- --no-trunc :不截断输出。
示例:
# 运行的容器
docker stats
# 指定容器的资源使用情况:
docker stats 22b
# 所有容器(包括未运行的容器)
docker stats --all

3.5) 打印日志 docker logs
docker logs 命令用于获取和查看容器的日志输出。
docker logs 命令非常有用,可以帮助用户调试和监控运行中的容器。
常用选项:
- -f, --follow: 跟随日志输出(类似于
tail -f)。 - --since: 从指定时间开始显示日志。
- -t, --timestamps: 显示日志时间戳。
--tail: 仅显示日志的最后部分,例如--tail 10显示最后 10 行。--details: 显示提供给日志的额外详细信息。--until: 显示直到指定时间的日志。
[root@node01 ~]# docker logs 22b5bc2c0eb7
# 显示最后 10 行日志
docker logs --tail 10 my_container
# 从指定时间开始显示日志
docker logs --since="2023-07-22T15:00:00" my_container
3.6) 删除容器 docker rm
docker rm [OPTIONS] CONTAINER [CONTAINER...]
CONTAINER [CONTAINER...]: 一个或多个要删除的容器的名称或 ID。
OPTIONS说明:
- -f,
--force: 强制删除正在运行的容器(使用SIGKILL信号)。 -l,--link: 删除指定的连接,而不是容器本身。-v,--volumes: 删除容器挂载的卷。
[root@node01 ~]# docker rm 22b5bc2c0eb7
Error response from daemon: cannot remove container "/nginx-container": container is running: stop the container before removing or force remove
# 错误信息来自守护进程:无法删除容器“/nginx-container”:该容器正在运行,请先停止该容器再进行删除操作,或者强制删除。
# 强制删除
[root@node01 ~]# docker rm -f 22b5bc2c0eb7
3.7) 获取对象(容器、镜像、卷、网络等) docker inspacet
docker inspect 是 Docker 命令行工具中用于获取容器、镜像、网络、数据卷等 Docker 对象底层详细信息的核心命令。它返回的是结构化的 JSON 数据,包含了对象的配置、状态、网络、存储等几乎所有关键元数据,是排查问题、自动化脚本编写和深入理解 Docker 工作原理的重要工具。
1.基本语法
docker inspect [OPTIONS] NAME|ID [NAME|ID...]
OPTIONS:可选参数,用于过滤、格式化输出等(下文重点讲解)。NAME|ID:必需参数,指定要查询的 Docker 对象(容器、镜像、网络、数据卷等)的名称或 ID(支持完整 ID 或前几位缩写,如容器 ID 前 6 位)。- 支持同时查询多个对象,用空格分隔名称 / ID 即可。
2. 核心作用
- 查看容器的启动配置(如命令、环境变量、端口映射、挂载目录)。
- 获取镜像的构建信息(如基础镜像、构建步骤、暴露端口、默认命令)。
- 排查网络问题(如容器的 IP 地址、网关、DNS 配置、网络连接状态)。
- 分析存储挂载(如数据卷 / 绑定挂载的源路径、目标路径、权限)。
- 提取对象元数据用于自动化脚本(如通过
--format过滤出特定字段)。
常用 OPTIONS 解析
docker inspect 的默认输出是完整的 JSON 结构,内容繁多。通过选项可以简化输出,只获取需要的信息,常用选项如下:
| 选项 | 作用说明 | 示例 |
|---|---|---|
--format / -f |
按指定格式输出(支持 Go 模板语法),可提取单个字段或自定义格式 | docker inspect -f '{{.Config.Image}}' mycontainer(获取容器使用的镜像) |
--type / -t |
指定要查询的对象类型(避免名称冲突,如容器和镜像同名时) | docker inspect -t container myapp(明确查询名为 myapp 的容器) |
--size / -s |
仅对容器有效,在输出中额外显示容器的文件系统大小(SizeRw 可写大小、SizeRootFs 只读层大小) |
docker inspect -s mycontainer |
--pretty |
以格式化的、易读的方式输出 JSON(适合人工查看,默认是紧凑的 JSON) | docker inspect --pretty myimage |

docker inspect 89a8987defcb | grep "IPAddress"
输出
[root@node01 ~]# docker inspect 89a8987defcb | grep "IPAddress"
"SecondaryIPAddresses": null,
"IPAddress": "172.17.0.2",
"IPAddress": "172.17.0.2",
3.8) Docker Exec 详解:在运行中的容器内执行命令
docker exec 是 Docker 命令行工具中用于在运行中的容器内部执行命令的核心命令。它允许用户在不中断容器运行的情况下,与容器进行交互、调试程序、查看日志或修改配置,是容器运维和问题排查的重要工具。
一、基本语法与核心作用
1. 基本语法
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
OPTIONS:可选参数,控制命令执行的方式(如是否交互、是否分配终端等)。CONTAINER:必需参数,指定目标容器的名称或 ID(支持完整 ID 或前几位缩写)。COMMAND:必需参数,要在容器内执行的命令(如ls、bash、cat /var/log/nginx/access.log等)。ARG...:可选参数,命令的附加参数。
2. 核心作用
- 临时交互:进入容器内部的 shell 环境(如
bash或sh),手动执行一系列命令。 - 调试排查:查看容器内的日志文件、进程状态(如
ps aux)、网络配置(如ifconfig)等。 - 修改配置:临时修改容器内的配置文件(如 Nginx 配置、应用配置)。
- 脚本自动化:在脚本中通过
docker exec向容器内批量执行命令(如数据备份、状态检查)。
二、常用 OPTIONS 解析
docker exec -it 的选项决定了命令的执行模式,最常用的选项如下:
| 选项 | 作用说明 | 典型场景 |
|---|---|---|
-i / --interactive |
保持标准输入(STDIN)打开,允许交互(即使没有附加终端) | 配合 sh 或 bash 时,能输入命令但无终端特性(如光标移动) |
-t / --tty |
分配一个伪终端(TTY),模拟终端环境 | 与 -i 结合使用,获得完整的交互式 shell 体验 |
-d / --detach |
后台执行命令,不阻塞当前终端 | 执行耗时命令(如 sleep 30),无需等待其完成 |
-u / --user |
指定执行命令的用户(用户名或 UID) | 以非 root 用户执行命令(如 docker exec -u nginx <容器> whoami) |
-w / --workdir |
指定命令执行的工作目录(容器内路径) | 在容器内的 /app 目录执行命令:docker exec -w /app <容器> pwd |
三、典型使用场景与示例
以下场景基于你之前的 Nginx 容器(ID:89a8987defcb,名称:nginx-container)展开,覆盖日常运维的核心需求。
场景 1:进入容器的交互式 shell(最常用)
通过 bash 或 sh 进入容器内部,进行多命令交互操作(类似 SSH 登录服务器)。
# 推荐:-it 组合(交互式 + 伪终端),获得完整 shell 体验
docker exec -it nginx-container bash
# 若容器内无 bash(如 Alpine 系统),用 sh 替代
docker exec -it nginx-container sh
执行效果:
进入容器后,终端提示符会变为容器内的环境(如 root@89a8987defcb:/#),可直接执行容器内的命令:
# 查看容器内的目录结构
ls /etc/nginx
# 查看 Nginx 进程状态
ps aux | grep nginx
# 查看容器内的 IP 地址
ip addr
退出容器:
执行 exit 命令即可返回宿主机终端,容器会继续运行(不会因退出 shell 而停止)。
场景 2:非交互式执行单条命令
无需进入容器,直接在宿主机终端执行容器内的单个命令,适合快速查询信息。
示例 2.1:查看容器内的文件内容
# 查看 Nginx 配置文件
docker exec nginx-container cat /etc/nginx/nginx.conf
# 查看 Nginx 访问日志
docker exec nginx-container tail /var/log/nginx/access.log
示例 2.2:查看容器内的进程或网络状态
# 查看容器内运行的进程
docker exec nginx-container ps aux
# 查看容器内的网络连接(需容器内有 netstat 工具)
docker exec nginx-container netstat -tulpn
示例 2.3:在容器内创建文件或目录
# 在容器内的 /tmp 目录创建 test.txt
docker exec nginx-container touch /tmp/test.txt
# 向文件写入内容
docker exec nginx-container echo "hello from host" > /tmp/test.txt
编辑nginx配置文件
docker exec -it 89a8987defcb bash

docker cp 89a8987defcb:/etc/nginx/conf.d/default.conf ./

配置修改好后,拷贝回去
docker cp ./default.conf 89a8987defcb:/etc/nginx/conf.d/default.conf
4 保存镜像
4.1) 提交 dokcer commit
docker commit 命令用于将容器的当前状态保存为一个新的 Docker 镜像。
docker commit 命令通常用于创建镜像来保存容器的状态,以便在将来可以重用或分发该镜像。
语法
docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
docker commit [容器] [仓库名:标签]
OPTIONS说明:
- -a :提交的镜像作者。
- -c :使用 Dockerfile 指令来创建镜像。
- -m :提交时的说明文字。
- -p :提交镜像前暂停容器(默认为 true)。
[root@node01 ~]# docker commit -m "update index.html" nginx-container nginx-repository:v1.0
sha256:1e5f018276a39f52253b1314c97a35fe90e50422107cbd6f46f043a54fcbc0f9


4.2) 保存 dokcer save
docker save 命令用于将一个或多个 Docker 镜像保存到一个 tar 归档文件中,以便在其他环境中分发或备份。
语法
docker save [OPTIONS] IMAGE [IMAGE...]
# 镜像标识 = 仓库名:标签
docker save -o [导出文件名.tar] [仓库名:标签]
IMAGE: 要保存的一个或多个镜像名称或 ID。
OPTIONS 说明:
-o, --output: 指定输出文件的路径。
# 写法1 [仓库名:标签]
docker save -o nginx-v1.0.tar nginx-repository:v1.0
# 写法2 IMAGE
docker save -o nginx-v1.0.tar 1e5f018276a3
# 写法3:多个镜像
docker save -o nginx-all.tar nginx-repository:v1.0 nginx:latest

4.3) 加载 dokcer load
docker load 命令用于从由 docker save 命令生成的 tar 文件中加载 Docker 镜像。它可以将存档中的镜像和所有层加载到 Docker 中,使其可以在新环境中使用。
语法
docker load [OPTIONS]
OPTIONS 说明:
- -i, --input: 指定输入文件的路径。
-q, --quiet: 安静模式,减少输出信息。
docker load -i nginx-all.tar

5 分享镜像 (私人docker hub)
5.1) 创建私有 docker hub

因为docker hub国内不能访问,创建自己的 Hub
# 拉取官方 registry 镜像(registry:2稳定版,支持配置文件)
docker pull registry:2
# 或者 docker pull docker.1ms.run/library/registry:2
# 启动仓库(-v 挂载数据目录,避免容器删除后镜像丢失;--restart 开机自启)
docker run -d \
--name my-docker-hub \
-p 9000:5000 \
-v /data/docker-registry:/var/lib/registry \
--restart always \
registry:2
- 解释:
--name my-docker-hub:给仓库容器命名(自定义)。-p 9000:5000:端口映射(主机 9000 端口 → 容器 5000 端口)。容器内 registry 默认端口是 5000,主机映射 9000 端口(你要的外部端口)-v /data/docker-registry:/var/lib/registry:挂载仓库数据到主机/data/docker-registry(后续镜像都存在这里,需确保目录权限)。registry:2:使用 V2 版本(推荐,兼容新版本 Docker)。
vim /etc/docker/daemon.json
改一下
{
"registry-mirrors": ["https://docker.xuanyuan.me","https://docker.1ms.run"],
"insecure-registries":["192.168.49.151:5000"]
}
5.2) 给本地镜像打标签 dokcer tag(必须步骤)
# 格式:docker tag 本地镜像名:本地标签 远程仓库地址:端口/镜像名:版本标签
docker tag nginx-repository:v1.0 192.168.49.151:9000/nginx-repository:v1.0

5.3) 推送镜像到私有仓库
docker push 192.168.49.151:5000/nginx-repository:v1.0

5.4) 验证推送结果
# 查看仓库中的镜像列表(HTTP 场景)
curl http://192.168.49.151:9000/v2/_catalog
# 成功响应
{"repositories":["nginx-repository"]}
# 查看镜像的版本标签
curl http://192.168.49.151:9000/v2/nginx-repository/tags/list
# 成功响应
{"name":"nginx-repository","tags":["v1.0"]}

5.5)同事如何使用你的私有仓库
(HTTP 仓库必做)配置 Docker 允许 insecure 仓库(和你之前配置客户端的步骤一致):
sudo vim /etc/docker/daemon.json
# 添加:{"insecure-registries": ["192.168.49.151:5000"]}
sudo systemctl daemon-reload && sudo systemctl restart docker
拉取镜像
docker pull 192.168.49.151:5000/nginx-repository:v1.0
5.6)安装简易版 registry UI
docker pull docker.1ms.run/joxit/docker-registry-ui:master
docker run -d \
--name registry-ui \
-p 8080:80 \
-e REGISTRY_URL=http://192.168.49.151:9000 \
-e DELETE_ENABLED=true \
-e REGISTRY_TITLE="我的私有 Docker 仓库" \
--restart always \
docker.1ms.run/joxit/docker-registry-ui:master
跨域问题
An error occured: Check your connection and your registry must have Access-Control-Allow-Origin header set to [http://192.168.49.151:8080](http://192.168.49.151:8080/)
这个错误是 跨域访问限制(CORS) 导致的:Web UI(http://192.168.49.151:8080)要访问私有仓库(http://192.168.49.151:9000),但仓库没有返回允许跨域的响应头 Access-Control-Allow-Origin,浏览器出于安全限制会阻断请求。
核心解决思路
给私有仓库(registry 容器)配置 CORS 响应头,允许 UI 地址跨域访问。由于官方 registry 镜像本身不支持直接配置 CORS,需通过「反向代理(Nginx)」或「修改仓库启动参数(用自定义配置文件)」实现。
方案:修改私有仓库配置(自定义配置文件,需重启仓库)
通过自定义 registry 配置文件,添加 CORS 相关参数(需借助 registry 的 headers 配置),适合不想用 Nginx 的场景。
步骤 1:创建仓库自定义配置文件
# 创建配置文件目录和文件
mkdir -p /etc/docker/registry/conf
vim /etc/docker/registry/conf/config.yml
步骤 2:写入配置(添加 CORS 响应头)
version: 0.1
log:
fields:
service: registry
storage:
filesystem:
rootdirectory: /var/lib/registry # 仓库数据存储目录(和之前挂载的一致)
http:
addr: :5000 # 容器内监听端口(固定 5000)
headers:
# 核心:添加 CORS 响应头,允许 UI 地址跨域
Access-Control-Allow-Origin: ['http://192.168.49.151:8080']
Access-Control-Allow-Methods: ['GET', 'POST', 'PUT', 'DELETE', 'OPTIONS']
Access-Control-Allow-Headers: ['Authorization', 'Content-Type']
Access-Control-Allow-Credentials: ['true']
步骤 3:重启私有仓库(挂载自定义配置文件)
- 先停止旧的仓库容器:
docker rm -f my-docker-hub
- 重新启动仓库(挂载自定义配置文件):
docker run -d \
--name my-docker-hub \
-p 9000:5000 \
-v /data/docker-registry:/var/lib/registry \ # 数据目录(不变)
-v /etc/docker/registry/conf/config.yml:/etc/docker/registry/config.yml \ # 挂载自定义配置
--restart always \
registry:2 # 用 registry:2 版本(支持配置文件)
上面的要报错,复制下面
# 复制这里
docker run -d \
--name my-docker-hub \
-p 9000:5000 \
-v /data/docker-registry:/var/lib/registry \
-v /etc/docker/registry/conf/config.yml:/etc/docker/registry/config.yml \
--restart always \
registry:2
步骤 4:重启 UI 容器(无需修改 REGISTRY_URL)
docker restart registry-ui
验证:访问 UI 界面
打开 http://192.168.49.151:8080,跨域问题已解决,能正常加载镜像数据。

5.6) 总结
私有 Docker 仓库的核心价值是「团队镜像的集中分发与管理」,「让同事下载」是最基础的功能,但它解决了 docker save 手动传输的低效、版本混乱、协作麻烦等问题。
如果你们团队只有 2-3 人、偶尔传一次镜像,docker save 可能够用;但如果是经常协作、镜像版本更新频繁,私有仓库能节省大量时间,是团队 Docker 协作的必备工具~

浙公网安备 33010602011771号