dokcer - 2 常用命令

image

1. docker 服务的操作

image

2. 镜像管理

image

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)

查看 配置 Docker Hub 到国内镜像

拉取指定版本

例如下载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

image

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

image

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. 容器操作

image

image

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: 容器的重启策略(如 noon-failurealwaysunless-stopped)。
  • -u: 指定用户。

示例1,首次启动镜像

docker run -d --name busybox-first busybox
-d 代表后台运行容器

示例2

image

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

dokcer 启动 nginx

NGINX Docker 镜像使用指南

示例 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。

image

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

image

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

image

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:必需参数,要在容器内执行的命令(如 lsbashcat /var/log/nginx/access.log 等)。
  • ARG...:可选参数,命令的附加参数。

2. 核心作用

  • 临时交互:进入容器内部的 shell 环境(如 bashsh),手动执行一系列命令。
  • 调试排查:查看容器内的日志文件、进程状态(如 ps aux)、网络配置(如 ifconfig)等。
  • 修改配置:临时修改容器内的配置文件(如 Nginx 配置、应用配置)。
  • 脚本自动化:在脚本中通过 docker exec 向容器内批量执行命令(如数据备份、状态检查)。

二、常用 OPTIONS 解析

docker exec -it 的选项决定了命令的执行模式,最常用的选项如下:

选项 作用说明 典型场景
-i / --interactive 保持标准输入(STDIN)打开,允许交互(即使没有附加终端) 配合 shbash 时,能输入命令但无终端特性(如光标移动)
-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(最常用)

通过 bashsh 进入容器内部,进行多命令交互操作(类似 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

image

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

image

配置修改好后,拷贝回去

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

image

image

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

image

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

image

5 分享镜像 (私人docker hub)

5.1) 创建私有 docker hub

image

因为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

image

5.3) 推送镜像到私有仓库

docker push 192.168.49.151:5000/nginx-repository:v1.0

image

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"]}

image

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 相关参数(需借助 registryheaders 配置),适合不想用 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:重启私有仓库(挂载自定义配置文件)

  1. 先停止旧的仓库容器:
docker rm -f my-docker-hub
  1. 重新启动仓库(挂载自定义配置文件):
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,跨域问题已解决,能正常加载镜像数据。

image

5.6) 总结

私有 Docker 仓库的核心价值是「团队镜像的集中分发与管理」,「让同事下载」是最基础的功能,但它解决了 docker save 手动传输的低效、版本混乱、协作麻烦等问题。

如果你们团队只有 2-3 人、偶尔传一次镜像,docker save 可能够用;但如果是经常协作、镜像版本更新频繁,私有仓库能节省大量时间,是团队 Docker 协作的必备工具~

posted @ 2025-09-07 21:43  【唐】三三  阅读(34)  评论(0)    收藏  举报