站内链接:

本篇文章主要讲解除了仓库,镜像,容器之外的 docker 命令, 上述三者命令说明见 docker 基础知识文章介绍

logs

格式

批量获取当前正在执行的容器中的日志信息, 命令格式: docker logs [OPTIONS] CONTAINER, 其中命令 options:

1
2
3
4
5
6
7
--details: 			除了显示正常的日志信息之外, 还会添加环境变量, 标签等信息
--follow/-f: 持续的获取容器的stdout/stderr输出
--timestamps/-t:输出日志的时候显示每一行的时间戳信息, 该选项常常配合后面的since使用
--tail/-n: 显示末尾的 N 行数据

--since: 获取某一个时间戳之后的日志(例如: 2021-03-01), 或者相对时间(12h, 42m, 3s)
--until: 获取给定时间之前的日志信息

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1. 获取末尾的 N 行数据, 同时打印时间戳
docker logs -t -n 10 cid
docker logs -t --tail=10 cid

# 2. 获取某一个时间点之后的所有信息, 注意, 这时间为 UTC 时区
docker logs -t --since="2021-04-17T06:00:00" cid
docker logs -f --since="2021-04-17T06:00:00" cid
docker logs -t --since="30m" cid

# 3. 获取指定时间戳范围内的日志信息
docker logs -t --since="2021-04-17" --until="2021-04-20" cid

# 4. follow信息
docker logs -t -f cid
docker logs -t -n 10 -f cid

# 5. 过滤日志输出(但是会输出非常多)
dockr logs -f cid 2>&1 |grep --line-buffered XX
docker logs 2>/dev/null | grep hello
# 6. 直接获取末尾行并过滤
docker logs -f --tail 0 container_id 2>&1 | grep "something"

cp

格式

在 container 和本地文件系统之间进行文件/目录的拷贝.

1
2
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

注意, -可以作为标准输入输入相应路径信息. 另外, 命令 options:

1
2
--archive/-a:       不仅拷贝文件还拷贝uid/gid等信息
--follow-link/-L: 仅仅创建软链接

实例

1
2
3
4
# 1. 文件
docker cp a.txt ec049b7:/tmp/
# 2. 目录
docker cp dir1 ec049b7:/tmp/

diff And history

diff

检查当前容器相比于其image, 文件系统中的文件和目录所做的改动信息, 命令格式:

1
docker diff container-ID

输出信息头部代表含义:

1
2
3
A           添加一个新的文件或者目录
D 删除
C 更改

例子:

1
docker diff ec049b7

history

展示一个image而不是容器的构建历史信息, 命令格式: docker history [OPTIONS] IMAGE

1
2
--quiet/-q:             仅仅显示image id信息
--no-trunc: 不截断输出

实例:

1
docker history bifeng_blog:10

其输出如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
IMAGE          CREATED        CREATED BY                                      SIZE      COMMENT
<missing> 3 months ago /bin/sh -c #(nop) CMD ["node"] 0B
<missing> 3 months ago /bin/sh -c #(nop) ENTRYPOINT ["docker-entry… 0B
<missing> 3 months ago /bin/sh -c #(nop) COPY file:238737301d473041… 116B
<missing> 3 months ago /bin/sh -c set -ex && for key in 6A010… 8.47MB
<missing> 3 months ago /bin/sh -c #(nop) ENV YARN_VERSION=1.22.5 0B
<missing> 3 months ago /bin/sh -c ARCH= && dpkgArch="$(dpkg --print… 66.5MB
<missing> 3 months ago /bin/sh -c #(nop) ENV NODE_VERSION=10.23.1 0B
<missing> 3 months ago /bin/sh -c groupadd --gid 1000 node && use… 333kB
<missing> 3 months ago /bin/sh -c set -ex; apt-get update; apt-ge… 561MB
<missing> 3 months ago /bin/sh -c apt-get update && apt-get install… 142MB
<missing> 3 months ago /bin/sh -c set -ex; if ! command -v gpg > /… 7.81MB
<missing> 3 months ago /bin/sh -c set -eux; apt-get update; apt-g… 23.2MB
<missing> 3 months ago /bin/sh -c #(nop) CMD ["bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:166cd044a29ad501c… 101MB

export And load

export

将一个容器文件系统导出为归档文件, 命令格式: docker export [OPTIONS] CONTAINER

1
--output/-o             写入一个指定的文件, 代替标准输出

实例:

1
2
3
4
# 1. 标准输出(完成之后发现a.tar大小接近 1G)
docker export ec049b7 > a.tar
# 2. 指定
docker export --output="a.tar" ec049b7

load

从标准输出或者指定的 tar 文件中加载镜像信息, 命令格式: docker load [OPTIONS]

1
2
--input/-i:     指定文件或者从标准输入中获取
--quiet/-q: 仅仅输出较少信息

实例:

1
2
3
4
# 1. 从压缩文件中获取镜像
docker load < a.tar
# 2. 指定
docker load --input a.tar

exec And attach

exec

容器中运行某个命令, 其命令格式: docker exec [OPTIONS] container cmd [args]

1
2
3
4
5
6
7
8
--detach/-d:                后台运行某个命令
--env/-e: 设置环境变量
--env-file 从指定文件中读取并设置环境变量
--interactive/-i: 确保交互式标准输入开启
--privileged: 对所执行命令赋予额外的权限
--tty/-t: 运行一个终端
--user/-u: 用户名/uid
--workdir/-w: 工作目录, 默认情况下使用启动容器的工作目录

实例如下:

1
2
3
4
5
6
7
8
9
# 1. 启动一个实例并运行交互式bash
docker run --name ubuntu_bash --rm -i -t ubuntu bash
# 2. 后台运行某个命令
docker exec -d ubuntu_bash touch /tmp/execWorks
# 3. 设置环境变量
docker exec -it -e VAR=1 ubuntu_bash bash
# 4. 设置工作目录
docker exec -it -w /root ubuntu_bash pwd

attach

attach一个运行中的容器的标准输出, 标准输入, 标准错误流信息, 另外 attach 不会在容器中创建进程进行额外的命令, 仅仅是附着在命令上. 对于 bash 命令启动的容器, 使用 attach 命令附着的效果类似 exec, 但是对于不是 bash 命令启动的容器, 则需要使用 exec.attach 命令格式: docker attach [OPTIONS] CONTAINER

1
2
3
--no-stdin          不附着标准输入
--sig-proxy=true 接收所有信号到容器中
--detach-keys 覆盖退出容器的按键, 一旦设置, 某些退出键按住不会生效

实例:

1
2
3
4
5
6
7
8
9
# 1. 启动容器
docker restart ec049b7a2c34
# 2. 进入容器中运行某些真正的功能
docker exec -it ec049b7a2c34 bash

# 3. 在新的终端attach, 并输入exit
docker attach ec049b7a2c34
exit
# 会发现整个容器直接关闭

stats

格式

持续性显示实时的容器使用资源统计信息, 命令格式: docker stats [options] [container..]

1
2
3
4
--all , -a		显示所有的容器统计信息
--format 使用go模板来更加优雅的输出
--no-stream 不需要持续性显示信息流程, 仅显示第一个信息流即可
--no-trunc 不截断输出信息

其中--all各列输出信息说明如下:

1
2
3
4
5
6
COMMAND ID/NAME:    容器ID或者名字
CPU%, MEM%: CPU和内存占用百分比
MEM USAGE / LIMIT: 容器当前使用的总内存/容器可以使用的最高内存上限
NET I/O: 容器从网卡接口发送/接收的数据量
BLOCK I/O: 磁盘 I/O 数据
PIDS: PID号

实例

  1. 获取当前所有容器资源占用(ubuntu): docker stats
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CONTAINER ID   NAME              CPU %     MEM USAGE / LIMIT     MEM %     NET I/O           BLOCK I/O         PIDS
c9d34ba2852f app-web_1 0.00% 31.8MiB / 15.37GiB 0.20% 23.1MB / 270MB 143kB / 16.4MB 19
e35a920cf7d0 app-backend_1 2.11% 3.319GiB / 15.37GiB 21.59% 12GB / 5.5GB 19.8MB / 3.13MB 56
22316e423a78 app-collector_1 1.74% 2.791GiB / 15.37GiB 18.16% 3.46GB / 1.25GB 496kB / 0B 186
b91c6ac00609 app-flower_1 0.38% 131.5MiB / 15.37GiB 0.84% 8.59GB / 904MB 6.98MB / 12.3kB 10
4dfe71e26d0a app-redis_1 0.50% 27.32MiB / 15.37GiB 0.17% 42.2GB / 77.8GB 2.81MB / 0B 4
e88929929cd6 app-db_1 0.08% 487.8MiB / 15.37GiB 3.10% 36.9GB / 86.3GB 31.3MB / 15.5GB 84
8acb8df6b150 notice-web_1 0.00% 18.24MiB / 15.37GiB 0.12% 758kB / 82.9kB 6.56MB / 0B 21
41f84a753998 notice_1 3.11% 629.9MiB / 15.37GiB 4.00% 86.5GB / 24.9GB 4.32MB / 328kB 24
7f67a3c5af5c notice-redis_1 0.44% 2.375MiB / 15.37GiB 0.02% 24.9GB / 86.5GB 283kB / 0B 4
cf60aeb8a06a notice-db_1 0.07% 192.7MiB / 15.37GiB 1.22% 1.37MB / 772kB 10.9MB / 30.1MB 30
718401c2b600 cmdb_1 0.05% 62.98MiB / 15.37GiB 0.40% 6.06MB / 4.94MB 1.21MB / 328kB 4
9325e866139a cmdb-db_1 0.08% 198.3MiB / 15.37GiB 1.26% 4.72MB / 4.55MB 12MB / 170MB 30
7b125ffd861f idaas_1 0.16% 675MiB / 15.37GiB 4.29% 1.77GB / 4.01GB 12.9MB / 303kB 50
b4c63e8d8236 idaas-db_1 0.08% 192MiB / 15.37GiB 1.22% 727MB / 1.64GB 610kB / 871MB 38
  1. 某些系统可能未显示 name 等字段, 则可以通过--format来指定输出列:
1
2
3
4
5
# 1. 输出自定义列: .Container--容器ID, .Name--容器名, .ID--容器ID, .CPUPerc--CPU使用率
# .MemUsage--内存使用量, .NetIO--网络IO, .BlockIO--磁盘IO, .MemPerc--内存使用率, .PID--pid号
docker stats --format "table {{.Name}}\t{{.CPUPerc}}\t{{.MemUsage}}"
# 2. 将名称替代Container id列
docker stats $(docker ps --format={{.Names}})
  1. 非持续性的监控输出: docker stats --no-stream

  2. 指定容器名称或者容器 ID: docker stats app-web_1 22316

参考