整理一下在使用 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: 容器 IDIMAGE: 使用的镜像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对象类型,如:container、image。在容器与镜像同名时可以使用。默认返回容器信息
直接 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 下管道还是很强大的,前一个命令的输出作为后一个命令的输入,因此 grep , awk 等等都是可以配合使用的
同时也可以将命令的输出结果作为变量,供另一个命令使用