侧边栏壁纸
  • 累计撰写 47 篇文章
  • 累计收到 0 条评论

Docker 宝典|常用命令

2022-11-13 / 0 评论 / 168 阅读
温馨提示:
本文最后更新于 2022-11-13,已超过半年没有更新,若内容或图片失效,请留言反馈。

先感受下图, 几乎所有命令分布都在里面。




登录退出 - 镜像仓库

登陆到一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

docker login [OPTIONS] [SERVER]

# OPTIONS 说明
#   -u: 登录的用户名
#   -p: 登录的密码
# 
# docker login -u 用户名 -p 密码
登出一个Docker镜像仓库,如果未指定镜像仓库地址,默认为官方仓库 Docker Hub

docker logout

镜像相关操作

Docker Hub查找镜像

docker search [OPTIONS] TERM

# OPTIONS 说明
#   --automated: 只列出 automated build类型的镜像
#   --no-trunc: 显示完整的镜像描述
#   -f <过滤条件>: 列出收藏数不小于指定值的镜像
#
# 从 Docker Hub 查找所有镜像名包含 php, 并且收藏数大于 10 的镜像
# docker search -f stars=10 php

参数说明:
NAME: 镜像仓库源的名称
DESCRIPTION: 镜像的描述
OFFICIAL: 是否 docker 官方发布
STARS: 类似 Github 里面的 star,表示点赞、喜欢的意思
AUTOMATED: 自动构建

从镜像仓库中拉取或者更新指定镜像

docker pull [OPTIONS] NAME[:TAG|@DIGEST]

# OPTIONS 说明
#   -a: 拉取所有 tagged 镜像
#   --disable-content-trust: 忽略镜像的校验, 默认开启
#
# docker pull raylin666/golang:1.17
列出本地镜像

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

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

删除本地一个或多个镜像

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

# OPTIONS 说明
#   -f: 强制删除
#   --no-prune: 不移除该镜像的过程镜像,默认移除
#  
# 强制删除本地镜像 
# docker rmi -f raylin666/php:v7.3
标记本地镜像,将其归入某一仓库

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

# 将镜像 openresty:latest 标记为 raylin666/openresty:1.19.9.1 镜像
# docker tag openresty:latest raylin666/openresty:1.19.9.1
使用 Dockerfile 创建镜像

docker build [OPTIONS] PATH | URL | -

# OPTIONS 说明
#   --build-arg=[]: 设置镜像创建时的变量
#   --cpu-shares: 设置 cpu 使用权重
#   --cpu-period: 限制 CPU CFS周期
#   --cpu-quota: 限制 CPU CFS配额
#   --cpuset-cpus: 指定使用的CPU ID
#   --cpuset-mems: 指定使用的内存 ID
#   --disable-content-trust: 忽略校验,默认开启
#   -f: 指定要使用的 Dockerfile 路径
#   --force-rm: 设置镜像过程中删除中间容器
#   --isolation: 使用容器隔离技术
#   --label=[]: 设置镜像使用的元数据
#   -m: 设置内存最大值
#   --memory-swap: 设置Swap的最大值为内存+swap,"-1"表示不限swap
#   --no-cache: 创建镜像的过程不使用缓存
#   --pull: 尝试去更新镜像的新版本
#   --quiet, -q: 安静模式,成功后只输出镜像 ID
#   --rm: 设置镜像成功后删除中间容器
#   --shm-size: 设置 /dev/shm 的大小,默认值是 64M
#   --ulimit: Ulimit 配置
#   --squash: 将 Dockerfile 中所有的操作压缩为一层
#   --tag, -t: 镜像的名字及标签,通常 name:tag 或者 name 格式;可以在一次构建中为一个镜像设置多个标签
#   --network: 默认 default。在构建期间设置 RUN 指令的网络模式
#
# 1. 使用当前目录的 Dockerfile 创建镜像,标签为 raylin666/php:7.4
# docker build -t raylin666/php:7.4 . 
#
# 2. 使用URL github.com/creack/docker-firefox 的 Dockerfile 创建镜像
# docker build github.com/creack/docker-firefox
#
# 3. 也可以通过 -f Dockerfile 文件的位置
# docker build -f /path/to/php/Dockerfile .
将本地的镜像上传到镜像仓库,要先登陆到镜像仓库。可以通过 docker build 构建自己的镜像再上传, 也可以通过 docker tag 标记本地镜像到某个仓库后再上传。

docker push [OPTIONS] NAME[:TAG]

# OPTIONS 说明
#   --disable-content-trust: 忽略镜像的校验, 默认开启
#
# docker push raylin666/php:v7.4.26
查看指定镜像的创建历史

docker history [OPTIONS] IMAGE

# OPTIONS 说明
#   -H: 以可读的格式打印镜像大小和日期,默认为TRUE
#   --no-trunc: 显示完整的提交记录
#   -q: 仅列出提交记录ID
#
# 查看本地镜像 raylin666/mysql:8.0.27 的创建历史
# docker history raylin666/mysql:8.0.27

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

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

# OPTIONS 说明
#   -o: 输出到的文件
#
# 将镜像 raylin666/php:7.4 生成 my_php74.tar 文档
# docker save -o my_php74.tar raylin666/php:7.4
导入使用 docker save 命令导出的镜像

docker load [OPTIONS]

# OPTIONS 说明
#   --input, -i: 指定导入的文件,代替 STDIN
#   --quiet, -q: 精简输出信息
#
# docker load < busybox.tar.gz
# docker load --input fedora.tar
将文件系统作为一个 tar 归档文件导出到 STDOUT

docker export [OPTIONS] CONTAINER

# OPTIONS 说明
#   -o: 将输入内容写到文件
#
# 将ID为 a404c6c174a2 的容器按日期保存为tar文件
# docker export -o mysql-`date +%Y%m%d`.tar a404c6c174a2
从归档文件中创建镜像

docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

# OPTIONS 说明
#   -c: 应用 docker 指令创建镜像
#   -m: 提交时的说明文字
#
# 从镜像归档文件 my_php74.tar 创建镜像,命名为 raylin666/php:7.4
# docker import my_php74.tar raylin666/php:7.4

容器相关操作

创建一个新的容器并运行一个命令

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

# OPTIONS 说明
#   -a stdin: 指定标准输入输出内容类型,可选 STDIN/STDOUT/STDERR 三项
#   -d: 后台运行容器,并返回容器ID
#   -i: 以交互模式运行容器,通常与 -t 同时使用
#   -P: 随机端口映射,容器内部端口随机映射到主机的端口
#   -p: 指定端口映射,格式为: 主机(宿主)端口:容器端口, 例如: 8080:80
#   -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用
#   --name="nginx": 为容器指定一个名称
#   --dns 8.8.8.8: 指定容器使用的DNS服务器,默认和宿主一致
#   --dns-search example.com: 指定容器DNS搜索域名,默认和宿主一致
#   -h "bars": 指定容器的 hostname
#   -e username="raylin666": 设置环境变量
#   --env-file=[]: 从指定文件读入环境变量
#   --cpuset="0-2" or --cpuset="0,1,2": 绑定容器到指定CPU运行
#   -m: 设置容器使用内存最大值
#   --net="bridge": 指定容器的网络连接类型,支持 bridge/host/none/container: 四种类型
#   --link=[]: 添加链接到另一个容器
#   --expose=[]: 开放一个端口或一组端口
#   --volume, -v: 绑定一个卷
#
# 1. 使用 docker 镜像 nginx:latest 以后台模式启动一个容器, 并将容器命名为 mynginx
# docker run --name mynginx -d nginx:latest
#
# 2. 使用镜像 nginx:latest 以后台模式启动一个容器, 并将容器的 80 端口映射到主机随机端口
# docker run -P -d nginx:latest
#
# 3. 使用镜像 nginx:latest,以后台模式启动一个容器, 将容器的 80 端口映射到主机的 80 端口, 主机的目录 /www/data 映射到容器的 /data
# docker run -p 80:80 -v /www/data:/data -d nginx:latest
#
# 4. 绑定容器的 8080 端口,并将其映射到本地主机 127.0.0.1 的 80 端口上
# docker run -p 127.0.0.1:80:8080/tcp ubuntu bash
#
# 5. 使用镜像 nginx:latest 以交互模式启动一个容器, 在容器内执行 /bin/bash 命令
# docker run -it nginx:latest /bin/bash
启动一个或多个已经被停止的容器

docker start [OPTIONS] CONTAINER [CONTAINER...]

停止一个运行中的容器

docker stop [OPTIONS] CONTAINER [CONTAINER...]

重启容器

docker restart [OPTIONS] CONTAINER [CONTAINER...]

杀掉一个运行中的容器

docker kill [OPTIONS] CONTAINER [CONTAINER...]

# OPTIONS 说明
#   -s: 向容器发送一个信号
#
# 杀掉运行中的容器 mynginx
# docker kill -s KILL mynginx
删除一个或多个容器

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

# OPTIONS 说明
#   -f: 通过 SIGKILL 信号强制删除一个运行中的容器
#   -l: 移除容器间的网络连接,而非容器本身
#   -v: 删除与容器关联的卷
#
# 1. 强制删除容器 db01、db02
# docker rm -f db01 db02
#
# 2. 移除容器 nginx01 对容器 db01 的连接,连接名 db
# docker rm -l db 
#
# 3. 删除容器 nginx01, 并删除容器挂载的数据卷
# docker rm -v nginx01
#
# 4. 删除所有已经停止的容器
# docker rm $(docker ps -a -q)
暂停容器中所有的进程 (暂停容器提供服务)

docker pause CONTAINER [CONTAINER...]

恢复容器中所有的进程 (恢复容器提供服务)

docker unpause CONTAINER [CONTAINER...]

创建一个新的容器但不启动它 [用法同 docker run 一样]

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

在运行的容器中执行命令

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

# OPTIONS 说明
#   -d: 分离模式 - 在后台运行
#   -i: 即使没有附加也保持 STDIN 打开
#   -t: 分配一个伪终端
#
# 1. 在容器 mynginx 中以交互模式执行容器内 /root/runoob.sh 脚本
# docker exec -it mynginx /bin/sh /root/runoob.sh
#
# 2. 在容器 mynginx 中开启一个交互模式的终端
# docker exec -i -t [容器名称或容器ID] /bin/bash
列出容器列表

docker ps [OPTIONS]

# OPTIONS 说明
#   -a: 显示所有的容器,包括未运行的
#   -f: 根据条件过滤显示的内容
#   --format: 指定返回值的模板文件
#   -l: 显示最近创建的容器
#   -n: 列出最近创建的n个容器, 比如 docker ps -n 3
#   --no-trunc: 不截断输出
#   -q: 静默模式,只显示容器编号
#   -s: 显示总的文件大小
#
# docker ps

输出详情介绍:
CONTAINER ID: 容器 ID
IMAGE: 使用的镜像
COMMAND: 启动容器时运行的命令
CREATED: 容器的创建时间
STATUS: 容器状态 - 状态有7种

  • 已创建: created
  • 重启中: restarting
  • 运行中: running
  • 迁移中: removing
  • 暂停中: paused
  • 已停止: exited
  • 已死亡: dead

PORTS: 容器的端口信息和使用的连接类型(tcp\udp)
NAMES: 自动分配的容器名称

获取容器/镜像的元数据

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

# OPTIONS 说明
#   -f: 指定返回值的模板文件
#   -s: 显示总的文件大小
#   --type: 为指定类型返回JSON
#
# 1. 获取镜像 raylin666/openresty:1.19.9.1 的元信息
# docker inspect raylin666/openresty:1.19.9.1
#
# 2. 获取正在运行的容器 openresty 的 IP
# docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' openresty

查看容器中运行的进程信息,支持 ps 命令参数

docker top [OPTIONS] CONTAINER [ps OPTIONS]

容器运行时不一定有 /bin/bash 终端来交互执行 top 命令,而且容器还不一定有top命令,可以使用docker top来实现查看container中正在运行的进程。

查看容器 php 的进程信息

查看所有运行容器的进程信息

连接到正在运行中的容器

docker attach [OPTIONS] CONTAINER

attach上去的容器必须正在运行,可以同时连接上同一个container来共享屏幕(与screen命令的attach类似)。

官方文档中说attach后可以通过CTRL-C来 detach,但实际上经过我的测试,如果 container 当前在运行 bash,CTRL-C 自然是当前行的输入,没有退出; 如果 container 当前正在前台运行进程,如输出 nginx 的 access.log 日志,CTRL-C 不仅会导致退出容器,而且还 stop 了。这不是我们想要的,detach 的意思按理应该是脱离容器终端,但容器依然运行。好在 attach 是可以带上--sig-proxy=false来确保CTRL-DCTRL-C不会关闭容器。

从服务器获取实时事件

docker events [OPTIONS]

# OPTIONS 说明
#   -f: 根据条件过滤事件
#   --since: 从指定的时间戳后显示所有事件
#   --until: 流水时间显示到指定的时间为止
#
# 1. 显示 docker 2021年11月28日后的所有事件
# docker events --since="1638091082"
#
# 2. 显示 docker 镜像为 mysql:8.0 2021年11月28日后的相关事件
# docker events -f "image"="mysql:8.0" --since="1638091082"
#
# 如果指定的时间是到秒级的,需要将时间转成时间戳。如果时间为日期的话,可以直接使用,如--since="2021-11-28"。

获取容器的日志

docker logs [OPTIONS] CONTAINER

# OPTIONS 说明
#   -f: 跟踪日志输出
#   --since: 显示某个开始时间的所有日志
#   -t: 显示时间戳
#   --tail: 仅列出最新N条容器日志
#
# 1. 跟踪查看容器 mysql 的日志输出
# docker logs -f mysql
#
# 2. 查看容器 php 从2021年11月27日后的最新10条日志
# docker logs --since="2021-11-27" --tail=10 php

阻塞运行直到容器停止,然后打印出它的退出代码

docker wait [OPTIONS] CONTAINER [CONTAINER...]

列出指定的容器的端口映射,或者查找将 PRIVATE_PORT NAT到面向公众的端口

docker port [OPTIONS] CONTAINER [PRIVATE_PORT[/PROTO]]

➜  test docker port openresty
80/tcp -> 0.0.0.0:19100
从容器创建一个新的镜像

docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]

# OPTIONS 说明
#   -a: 提交的镜像作者
#   -c: 使用 Dockerfile 指令来创建镜像
#   -m: 提交时的说明文字
#   -p: 在 commit 时,将容器暂停
#
# 将容器 a404c6c174a2 保存为新的镜像, 并添加提交人信息和说明信息
# docker commit -a "raylin666" -m "my openresty" a404c6c174a2  raylin666/openresty:1.19.9.1 
用于容器与主机之间的数据拷贝

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

# OPTIONS 说明
#   -L: 保持源目标中的链接
#
# 1. 将主机 /www/html 目录拷贝到容器 96f7f14e99ab 的 /www 目录下
# docker cp /www/html 96f7f14e99ab:/www/
#
# 2. 将主机 /www/html 目录拷贝到容器 96f7f14e99ab 中,目录重命名为 www
# docker cp /www/html 96f7f14e99ab:/www
#
# 3. 将容器 96f7f14e99ab 的 /www 目录拷贝到主机的 /tmp 目录中
# docker cp 96f7f14e99ab:/www /tmp/
检查容器里文件结构的更改

docker diff [OPTIONS] CONTAINER

➜  test docker diff openresty
C /run
C /run/openresty
A /run/openresty/nginx-uwsgi
A /run/openresty/nginx-client-body
A /run/openresty/nginx-fastcgi
A /run/openresty/nginx-proxy
A /run/openresty/nginx-scgi

评论一下?

OωO
取消