docker 常用命令

整理一下在使用 Docker 过程中经常会被使用到的一些命令

Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级、可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口, 更重要的是容器性能开销极低。

容器生命周期管理

创建容器

docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

因为创建命令涉及了容器运行时几乎所有的设置,所有 run 命令具有比其他任何 docker 命令更多的选项,接下来主要看一下具体的 [OPTIONS] 有哪些

  • -a stdin : 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
  • -d : 后台运行容器,并返回容器ID
  • -i : 以交互模式运行容器,通常与 -t 同时使用
  • -P : 随机端口映射,容器内部端口随机映射到主机的高端口
  • -p : 指定端口映射,格式为:主机(宿主)端口:容器端口
  • -t : 为容器重新分配一个伪输入终端,通常与 -i 同时使用
  • --name string : 为容器指定一个名称
  • --dns 8.8.8.8 : 指定容器使用的DNS服务器,默认和宿主一致
  • --dns-search example.com : 指定容器DNS搜索域名,默认和宿主一致
  • -h "mars" : 指定容器的hostname
  • -e username="ritchie" : 设置环境变量
  • --env-file=[] : 从指定文件读入环境变量
  • --cpuset-cpus string : 绑定容器到指定 CPU 运行(“0-2”/“0,1,2”)
  • -m : 设置容器使用内存最大值
  • --net="bridge" : 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
  • --link=[] : 添加链接到另一个容器
  • --expose=[] : 开放一个端口或一组端口
  • --volume , -v : 绑定一个卷

命令有点多,一般情况,启动一个服务,常用的几个参数

  • -d: 后台运行
  • -v:绑定卷 例如 -v /opt/server/logs:/opt/logs, 简单点说,就是将容器里的 /opt/logs 地址和宿主机 /opt/server/logs 的地址绑定,类似于挂载,用户就可以通过宿主机 /opt/server/logs 路径直接查看容器里生成的文件
  • --name string 声明容器的名称,建议启动的时候自己指定,便于后期启动停止可以通过容器名称直接控制
  • -p 8100:8000 端口映射,宿主机 8100,容器 8000, 这样发送到宿主机 8100 端口的消息,就会由 docker 转发到容器 8000 端口, 供容器里的服务监听
  • -e ENV_LOGLEVALE=info 声明一个可以让容器里识别到的环境变量,服务需要用户设置的一些信息,都可以通过定义成环境变量的形式在创建的时候传入容器

启动/停止/重启

docker start [OPTIONS] CONTAINER [CONTAINER...]
docker stop [OPTIONS] CONTAINER [CONTAINER...]
docker restart [OPTIONS] CONTAINER [CONTAINER...]

日常使用过程中,这3个命令里的 [OPTIONS] 都没有使用到,一般都是直接后接容器名,例如

docker start redis-server

暂停/恢复

  • docker pause : 暂停容器中所有的进程。
  • docker unpause : 恢复容器中所有的进程。
docker pause CONTAINER [CONTAINER...]
docker unpause CONTAINER [CONTAINER...]

删除容器

删除一个或多少容器。

docker rm [OPTIONS] CONTAINER [CONTAINER...]

OPTIONS 说明:

  • -f : 强制删除一个运行中的容器
  • -l : 移除容器间的网络连接,而非容器本身
  • -v : 删除与容器关联的卷
docker rm -f mysql

在运行的容器中执行命令

docker exec [OPTIONS] CONTAINER COMMAND [ARG...]

OPTIONS 说明:

  • -d : 分离模式: 在后台运行
  • -i : 即使没有附加也保持 STDIN 打开
  • -t : 分配一个伪终端

简单点说,可以进入容器里,在容器的环境下,输入一些命令,就类似于 ssh 到别人的机器上

其中 OPTIONS 的中 -d 的作用不详,但是输入命令需要 -t, 看到命令执行结果需要 -i, 所以在实际使用过程中,一般都是 -it 一起使用,也就是下面这样的

docker exec -it redis-server /bin/sh

容器操作

列出容器

docker ps [OPTIONS]

OPTIONS 说明:

  • -a : 显示所有的容器,包括未运行的
  • -f : 根据条件过滤显示的内容
  • --format : 指定返回值的模板文件
  • -l : 显示最近创建的容器
  • -n : 列出最近创建的n个容器
  • --no-trunc : 不截断输出(容器ID完整显示)
  • -q : 只显示容器编号
  • -s : 额外显示容器大小

列出所有在运行的容器信息。

docker ps

输出详情介绍:

  • CONTAINER ID : 容器 ID
  • IMAGE : 使用的镜像
  • COMMAND : 启动容器时运行的命令
  • CREATED : 容器的创建时间
  • STATUS : 容器状态。状态有 7 种
    • created(已创建)
    • restarting(重启中)
    • running(运行中)
    • removing(迁移中)
    • paused(暂停)
    • exited(停止)
    • dead(死亡)
  • PORTS : 容器的端口信息和使用的连接类型(tcp\udp)
  • NAMES : 自动分配的容器名称

查看容器详情

获取容器/镜像的元数据,元数据包括容器的 id、创建时间、运行状态、启动参数、目录挂载、网路配置等等。注意,该命令也可以用来查看镜像的信息。

docker inspect [OPTIONS] NAME|ID [NAME|ID...]

OPTIONS 说明:

  • -f (--format) : 指定返回值的 go 模板文件
  • -s : 显示总的文件大小。
  • --type : 指定类型,用于指定 docker 对象类型,如:containerimage。在容器与镜像同名时可以使用。默认返回容器信息

直接 docker inspect 容器名 会返回特别多的信息,这时候就需要使用 -f 来做一步筛选

格式如下, 这里的key 指的是 docker inspect 容器名 返回结果里的 key

docker inspect -f "{{json .key}}" 容器名
# 方便看json, 使用 jq
docker inspect -f "{{json .key}}" 容器名 | jq

举个例子

# 查看容器 redis-server 的容器ID
docker inspect -f "{{json .ID}}" redis-server

# 查看容器 redis-server 的挂载信息
docker inspect -f "{{json .Mounts}}" redis-server | jq

# 查看容器 redis-server 的网络设置中网络信息
docker inspect -f "{{json .NetworkSettings.Networks}}" redis-server | jq

获取日志

docker logs [OPTIONS] CONTAINER

OPTIONS 说明:

  • -f : 跟踪日志输出,实时显示
  • --since : 显示某个开始时间的所有日志
  • -t : 显示时间戳
  • --tail N : 仅列出最新 N 条容器日志

查看容器 redis-server 从 2020 年 12 月 30 日后的最新 10 条日志, 并且实时显示最新的日志输出。

docker logs -f --since="2020-12-30" --tail 10 redis-server

数据拷贝

用于容器与主机之间的数据拷贝。

# 从容器中拷贝出来
docker cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-

# 拷贝到容器中
docker cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH

OPTIONS 说明:

  • -L : 保持源目标中的链接

镜像管理

一般情况下很少涉及到对镜像管理,但是这里简单介绍一些

列出本地镜像

docker images [OPTIONS] [REPOSITORY[:TAG]]

OPTIONS 说明:

  • -a : 列出本地所有的镜像(含中间映像层,默认情况下,过滤掉中间映像层)
  • --digests : 显示镜像的摘要信息
  • -f : 显示满足条件的镜像
  • --format : 指定返回值的模板文件
  • --no-trunc : 显示完整的镜像信息
  • -q: 只显示镜像ID

列出本地镜像中 REPOSITORY 为 ubuntu 的镜像列表。

docker images ubuntu

删除镜像

删除本地一个或多少镜像。

docker rmi [OPTIONS] IMAGE [IMAGE...]

OPTIONS 说明:

  • -f: 强制删除
  • --no-prune : 不移除该镜像的过程镜像,默认移除

强制删除本地镜像 runoob/ubuntu:v4。

docker rmi -f runoob/ubuntu:v4

标记本地镜像/重命名

标记本地镜像,将其归入某一仓库。

docker tag [OPTIONS] IMAGE[:TAG] [REGISTRYHOST/][USERNAME/]NAME[:TAG]

将镜像 ubuntu:15.10 标记为 runoob/ubuntu:v3 镜像。

docker tag ubuntu:15.10 runoob/ubuntu:v3

导出镜像

将指定镜像保存成 tar 归档文件。

docker save [OPTIONS] IMAGE [IMAGE...]

OPTIONS 说明:

  • -o : 输出到的文件

将镜像 runoob/ubuntu:v3 生成 my_ubuntu_v3.tar 文档。

docker save -o my_ubuntu_v3.tar runoob/ubuntu:v3
docker save runoob/ubuntu:v3 > my_ubuntu_v3.tar

导入镜像

导入使用 docker save 命令导出的镜像。

docker load [OPTIONS]

OPTIONS 说明:

  • --input, -i : 指定导入的文件,代替 STDIN
  • --quiet, -q : 精简输出信息

busybox.tar.gz 导入镜像。

docker load < busybox.tar.gz

指定导入文件 busybox.tar 导入镜像。

docker load -i busybox.tar

小技巧

# 删除所有容器
docker rm -f $(docker ps -aq)

# 筛选出所有含有 k8s 字段的容器
docker ps -a | grep k8s

# 同理,删除满足条件 (含有 k8s 字段) 的容器
docker rm -f $(docker ps -a | grep k8s | awk -F ' ' '{print $1}')

Linux 下管道还是很强大的,前一个命令的输出作为后一个命令的输入,因此 grepawk 等等都是可以配合使用的
同时也可以将命令的输出结果作为变量,供另一个命令使用