先感受下图, 几乎所有命令分布都在里面。
登录退出 - 镜像仓库
登陆到一个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-D
或CTRL-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
评论一下?