整理一下在使用 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
等等都是可以配合使用的
同时也可以将命令的输出结果作为变量,供另一个命令使用