Docker命令是使用Docker的基础。这里记录下Docker日常运维过程中经常使用到的一些命令,更全面的命令还请参考Docker官网。
docker用法概述
Docker命令可以通过CLI工具实现与服务器的交互。Docker命令的语法如下:
bash
docker [DOCKER-COMMAND] [OPTIONS] [IMAGE-NAME|CONTAINER-NAME] [COMMAND] [ARG...]
其中,DOCKER-COMMAND、OPTIONS、IMAGE-NAME、CONTAINER-NAME等表示的含义如下:
(1) DOCKER-COMMAND:表示Docker支持的子命令,如container表示容器管理,image表示镜像管理,login/logout表示登入/登出镜像注册中心,等等。
(2) OPTIONS:表示命令执行时需要的参数,不同子命令,根据其功能差异,OPTIONS的参数各有不同。
(3) IMAGE-NAME|CONTAINER-NAME:指定需要操作的镜像名或容器名。对于某些子命令支持同时操作多个对象。
(4) COMMAND:需要执行的指令,主要用于容器场景,表示在容器内执行的命令。
(5) ARG:指令参数,配合COMMAND使用。
docker容器操作命令
Docker使用过程中,最经常接触的、使用频率最高的就是Docker容器操作相关的命令。如
容器生命周期管理
Docker容器的生命周期包括以下关键阶段:
docker create
可以使用docker create命令或docker container create命令来新建一个容器。docker create是docker container create的简写形式。其语法表示如下:
text
docker container create [OPTIONS] IMAGE [COMMAND] [ARG...]
使用docker create命令创建的容器处于Created状态,还未运行起来,可以使用docker start命令来启动它。使用示例如下:
bash
$ docker create -it ubuntu:latest
上述示例中新建了一个容器,对应的镜像名称是ubuntu,对应的镜像版本选用最新版本。
docker create命令支持的选项十分复杂,需要读者在实践中不断体会。具体来说,主要包括如下几大类:与容器运行模式相关、与容器环境配置相关、与容器资源限制和安全保护相关等。更多docker create命令介绍可以参考官网docker container create一文。
docker run
除了使用docker create命令创建容器后通过docker start命令来启动,也可以使用docker run命令直接新建并启动容器。docker run是docker container run的简写形式。其语法表示如下:
text
docker container run [OPTIONS] IMAGE [COMMAND] [ARG...]
使用示例如下:
bash
$ docker run -it ubuntu:latest /bin/bash
上述示例中,启动并运行一个容器,对应的镜像名称是ubuntu,对应的镜像版本选用最新版本。容器启动后,启用bin/bash这个shell。其中,-t选项让Docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。用户使用exit命令退出bash后,容器也会自动退出。这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要。
更多docker run命令介绍可以参考官网docker container run一文。
docker start
使用 docker [container] start 命令来启动一个已经创建的容器。例如,启动刚创建的 ubuntu容器:
bash
$ docker start ubuntu
通过 docker ps命令,可以查看到一个运行中的容器:
bash
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
ubuntu af8f4f922daf ubuntu:latest "/bin/bash" 2 minutes ago Up silly_euler
docker stop
可以使用 docker [container] stop 来终止一个运行中的容器。该命令的格式如下:
bash
docker [container] stop [-t | --time [=10]] [CONTA工NER...]
该命令会首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为 10 秒),再发送 SIGK工LL 信号来终止容器。示例如下:
bash
$ docker stop docker-name-or-docker-id
此时再执行 docker container prune 命令,会自动清除掉所有处于停止状态的容器。
此外,还可以通过 docker [container] kill 直接发送 SIGKILL 信号来强行终止容器。
当 Docker 容器中指定的应用终结时,容器也会自动终止。 例如,对于只启动了一个bash终端的容器,用户通过 exit 命令或 Ctrl+d 来退出终端时,所创建的容器也会立刻终止,处于停止状态。
处于终止状态的容器,可以通过 docker [container] start 命令来重新启动。
而 docker [container] restart 命令会将一个运行态的容器先终止,然后再重新启动。
docker pause
可以使用 docker [container] pause CONTAINER [CONTAINER ... ]命令来暂停一个运行中的容器。示例如下:
bash
docker pause docker-name-or-docker-id
处于 paused 状态的容器,可以使用 docker [container] unpause CONTAINER [CONTAINER ...] 命令来恢复到运行状态。
docker rm
可以使用 docker [container] rm命令来删除处于终止或退出状态的容器,命令格式如下:
bash
docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
主要支持的选项包括:
(1) -f,--force=false:是否强行终止并删除一个运行中的容器
(2) -l,--link=false:删除容器的连接,但保留容器
(3) -v,--volumes=false:删除容器挂载的数据卷。
默认情况下, docker rm 命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。
如果要直接删除一个运行中的容器,可以添加 -f 参数。 在强制删除时,Docker会先发送 SIGKILL信号给容器,终止其中的应用,之后强行删除。
容器操作
docker logs
要获取容器的输出信息,可以通过 docker 该命令支持的选项包括:
(1) -details: 打印详细信息
(2) -f, -follow:持续保持输出
(3) -since string:输出从某个时间开始的日志
(4) -tail string:输出最近的若干日志
(5) -t, -timestamps:显示时间戳信息
(6) -until string: 输出某个时间之前的日志。
如需持续保持容器输出,可以使用如下命令:
bash
$ docker logs -f ce554267d7a4
hello world
进入容器
在使用-d 参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。这个时候如果需要进入容器进行操作,推荐使用官方的 attach 命令(不推荐使用) 或 exec 命令(推荐使用)。
1、attach命令
attach是 Docker 自带的命令,命令格式如下:
docker
docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]]
CONTAINER
这个命令支持三个主要选项:
(1) --detach-keys [=[]]: 指定退出 attach 模式的快捷键序列,默认是 CTRL + p,CTRL + q
(2) --no-stdin=true|false: 是否关闭标准输入,默认是保持打开
(3) --sig-proxy=true|false: 是否代理收到的系统信号给应用进程,默认为 true
然而使用 attach 命令有时候并不方便。当多个窗口同时 attach 到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
2、exec命令
从 Docker 的 1.3.0 版本起, Docker 提供了一个更加方便的工具 exec 命令,可以在运行中容器内直接执行任意命令。该命令的基本格式为:
bash
docker [container] exec [-d|--detach] [ detach-keys[=[]]] [-i|--interactive] [--piivileged] [-t|--tty] [u|--user[=USER]] CONTAINER COMMAND [ARG...]
比较重要的参数有:
(1) -d, --detach: 在容器中后台执行命令
(2) -e, --env=[]:指定环境变量列表
(3) -i, --interactive=true | false:打开标准输入接受用户输入命令, 默认值为false
(4) -t, --tty=true|false: 分配伪终端,默认值为 false
(5) -u, --user="":执行命令的用户名或 ID
示例如下:
bash
$ docker exec -it 243c32535da7 /bin/bash
root@243c32535da7:/#
上述命令可以进入到容器中,并启动一个 bash。这样,就可在不影响容器内其他应用的前提下,用户与容器进行交互。
导入和导出容器
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用 Docker 的导人和导出功能。
1、导出容器
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用 docker [container] export命令,该命令格式如下:
bash
docker [container] export [-o|--output [=""]] CONTAINER
其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现。
之后,可将导出的 tar 文件传输到其他机器上,然后再通过导入命令导入到系统中,实现容器的迁移。
2、导入容器
导出的文件又可以使用 docker [container] import命令导入变成镜像,该命令格式如下:
bash
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY [:TAG]]
用户可以通过 -c,--change=[]选项在导入的同时执行对容器进行修改的 Dockerfile 指令。
除了使用 docker [container] import导入容器快照文件到本地镜像库,还可以通过 docker load 命令来导入一个镜像文件到本地镜像库。这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。 此外,从容器快照文件导入时可以重新指定标签等元数据信息。
查看容器
1、查看容器详情
查看容器详情可以使用 docker container inspect,命令格式如下:
bash
docker container inspect [OPTIONS] CONTAINER [CONTAINER ...]
2、查看容器内进程
查看容器内进程可以使用 docker [container] top,命令格式如下:
bash
docker [container] top [OPTIONS] CONTAINER [CONTAINER...]
这个命令类似于 Linux 系统中的 top 命令,会打印出容器内的进程信息,包括 PID、 用户、时间、命令等 。
3、查看统计信息
查看统计信息可以使用 docker [container] stats 显示 CPU、内存、存储、网络等使用情况的统计信息,命令格式如下:
bash
docker [container] stats [OPTIONS] [CONTAINER ...]
支持选项包括:
(1) -a, -all:输出所有容器统计信息,默认仅在运行中
(2) -format string:格式化输出信息
(3) -no-stream:不持续输出,默认会自动更新持续实时结果
(4) -no-trunc:不截断输出信息
其他容器命令
1、复制文件
Docker支持在容器和主机之间复制文件,对应的命令是 docker container cp命令,该命令的格式如下:
bash
docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
如将本地的路径 data 复制到 test 容器的/tmp 路径下的命令是:
bash
docker [container] cp data test:/tmp/
反之,将 test 容器的/tmp 路径复制到本地的路径 /data的命令是:
bash
docker [container] cp test:/tmp/ /data
3、查看端口映射
Docker支持查看端口映射,对应的命令是 docker container port 命令。该命令格式如下:
bash
docker container port CONTAINER [PRIVATE_PORT[/PROTO]]
如需要查看 test 容器的端口映射情况,可以使用如下的命令:
bash
$ docker container port test
9000/tcp - > 0.0.0.0:9000
4、更新配置
Docker支持更新容器的一些运行时配置,对应的命令是 docker container update 命令。该命令格式如下:
bash
docker [container] update [OPTIONS] CONTAINER [CONTAINER ...]
由于支持的命令比较多,这里仅列举几个常用的参数:
(1) -c, -cpu-shares int: 限制CPU使用份额
(2) -cpus decimal:限制CPU个数
(3) -cpuset-cpus string:允许使用的 CPU核,如 0-3,0,1
(4) -cpuset-mems string:允许使用的内存块,如 0-3,0,1
(5) -kernel-memory bytes:限制使用的内核内存
(6) -m,-memory bytes:限制使用的内存
(7) -memory-reservation bytes:内存软限制
docker镜像操作命令
Docker通过一种打包和分发的软件,完成传统容器的封装。这个用来充当容器分发角色的组件被称为镜像。Docker镜像是一个容器中运行程序的所有文件的捆绑快照。当使用Docker分发软件,其实就是分发这些镜像,并在接收的机器上创建容器。镜像在Docker生态系统中是可交付的基本单位。
Docker提供了一组简化分发镜像的基础设置组件。这些组件包括注册服务器和索引服务器。Docker运行容器前,需要本地存在对应的镜像,如果镜像不存在,Docker会尝试先从默认镜像仓库下载,用户也可以通过配置,使用自定义的镜像仓库。
获取镜像
镜像是运行容器的前提。可以使用docker pull命令从镜像仓库下载或者使用docker load加载本地镜像。接下来将分别介绍这两种方式。
方式一:将镜像推送到镜像仓库,然后在需要的时候,从镜像仓库拉取镜像到本地,然后启动接口。从镜像仓库拉取镜像的示例代码如下:
bash
$ docker pull [REGISTRYHOST/][USERNAME/]NAME][:TAG]
其中,NAME是镜像仓库名称(用来区分镜像),TAG是镜像的标签(用来表示版本信息)。通常情况下,描述一个镜像需要包括"名称+标签"信息。如果不显式指定TAG,则默认会选择lastest标签,这会下载仓库中最新版本的镜像。示例如下:
bash
$ docker pull ubuntu:18.04
严格地讲,镜像的仓库名称中还应该添加仓库地址(即registry,镜像仓库注册服务器)作为前缀,只是默认使用的是官方DockerHub服务 ,该前缀可以忽略。
如果从非官方的仓库下载,则需要在仓库名称前指定完整的仓库地址。例如从网易蜂巢的镜像源来下载ubuntu:18.04镜像,可以使用如下命令,此时下载的镜像名称 为hub.c.163.com/public/ubuntu:18.04:
bash
$ docker pull hub.c.163.com/public/ubuntu:18.04
方式二:镜像文件已经存在本地,直接将镜像由文件加载到Docker。示例代码如下:
bash
$ docker load -i xxx.filetype
查看镜像信息
这里介绍images、inspect、history等命令查看镜像信息。
1、使用images命令列出镜像
使用docker images或docker image ls 命令可以列出本地主机上已有镜像的基本信息。
bash
$ docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
ubuntu 18.04 452a96d8lc30 2 weeks ago 79.6MB
ubuntu latest 452a96d8lc30 2 weeks ago 79.6MB
需要说明的是,镜像大小信息只是表示了该镜像的逻辑体积大小,实际上由于相同的镜像层本地只会存储一份,物理上占用的存储空间会小于各镜像逻辑体积之和。
2、使用inspect命令查看详细信息
使用docker [image] inspect命令可以获取该镜像的详细信息,包括制作者、 适应架构、各层的数字摘要等。查询示例如下:
bash
$ docker [image) inspect ubuntu:18.04
[
{
"Id": "sha256:452a96d81c30ale426bc250428263ac9ca3f47c9bf086f876dllcb39cf57aeec",
"RepoTags": [
"ubuntu: 18.04",
"ubuntu:latest"
],
"RepoDigests": [ "ubuntu@sha256:c8c275751219dadad8fa56b3ac41ca6cb22219ff117ca98fe82b42f24elba64e"],
"Parent": "",
"Comment": "",
"Created" : "2018-04- 2 7T23 : 28:3 6. 3 19694807Z",
...
}
]
3、使用history命令查看镜像历史
既然镜像文件由多个层组成,那么怎么知道各个层的内容具体是什么呢?这时候可以使用history命令,该命令将列出各层的创建信息。如查看 ubuntu: 18. 04 镜像的创建过程,可以使用如下命令:
bash
$ docker history ubuntu:18.04
IMAGE CREATED CREATED BY SIZE COMMENT
452a96d8lc30 5 weeks ago /bin/sh -c #(nop) CMD ["/bin/bash"] OB xxx
注意,过长的命令被自动截断了,可以使用--no-trunc选项来输出完整命令。
查找镜像
使用 docker search 命令可以搜索 Docker Hub 官方仓库中的镜像。 语法为:
bash
docker search [option] keyword
删除和清理镜像
1、使用标签删除镜像
使用 docker rmi 或 docker image rm 命令可以删除镜像,命令格式如下:
bash
docker rmi IMAGE [IMAGE ... ]
其中 IMAGE 可以为标签或 ID。
当同一个镜像拥有多个标签的时候,docker rmi 命令只是删除了该镜像多个标签中的指定标签而巳,并不影响镜像文件。相当于只是删除了镜像的一个标签副本而已。但当镜像只剩下一个标签时,再使用 docker rm命令会彻底删除镜像。
2、使用镜像ID来删除镜像
当使用 docker rmi 命令, 并且后面跟上镜像的 ID (也可以是能进行区分的部分 ID 串前缀)时, 会先尝试删除所有指向该镜像的标签,然后删除该镜像文件本身。
注意,当有该镜像创建的容器存在时,镜像文件默认是无法被删除的,Docker会提示有容器正在运行,无法删除。如果要想强行删除镜像,可以使用-f参数。注意,通常并不推荐使用-f参数来强制删除一个存在容器依赖的镜像。正确的做法是,先删除依赖该镜像的所有容器,再来删除镜像。
3、清理镜像
使用Docker一段时间后, 系统中可能会遗留一些临时的镜像文件,以及一些没有被使用的镜像,可以通过docker image prune命令来进行清理。命令如下:
bash
docker image prune -f
创建镜像
构建Docker镜像主要有以下三方法:(1) 使用docker commit创建新镜像;(2)使用docker import 导入本地模板;(3) 使用docker build 命令和Dockerfile文件。
1、使用docker commit创建新镜像
可以使用docker commit命令从被修改的容器上创建新镜像。docker commit的本质是向版本控制系统里提交变更。命令格式如下:
bash
docker [container] commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
当使用docker commit 命令时,就向镜像提交了一个新的文件层。但这并不是只有文件系统快照被提交。每一层都包含描述执行上下文的元数据。其中包括一些容器启动时设置的参数,下面罗列的内容会被记录进新镜像:
(1) 所有的环境变量;
(2) 工作目录;
(3) 开放端口集合;
(4) 所有的卷定义;
(5) 容器入口点;
(6) 命令和参数;
如果这些值没有被明确地指定,那么这些值会从原始镜像继承。
可以使用docker inspect命令来查看新创建的镜像的详细信息。
2、使用docker import 导入本地模板
也可以直接从一个操作系统模板文件导人一个镜像,主要使用 docker [container] import命令。 命令格式如下:
bash
docker [image] import [OPTIONS] file|URL|-[REPOSITORY[:TAG]]
3、使用docker build 命令和Dockerfile文件
并不推荐使用docker commit的方法来构建镜像,相反,推荐使用被称为Dockerfile的定义文件和docker build命令来构建镜像。Dockerfile使用基本的基于DSL语法的指令来构建一个Docker镜像,之后使用docker build命令基于该Dockerfile中指令构建一个新的镜像。
将保存Dockerfile文件的目录称为"构建环境"。Docker会在构建镜像中将构建上下文和该上下文中的文件和目录上传到Docker守护进程。这样,Docker守护进程就能直接访问想在镜像中存储的任何代码、文件或者其他数据。
存出和载入镜像
用户可以使用 docker [image] save和docker [image] load命令来存出和载人镜像。
1、存出镜像
如果要导出镜像到本地文件,可以使用 docker [image] save命令。 该命令支持 -o -output string等参数,导出镜像到指定的文件中。示例如下:
bash
$ docker save -o ubuntu_18.04.tar ubuntu:18.04
2、载入镜像
可以使用 docker [image] load将导出的镜像压缩文件再导人到本地镜像库。支持 -i、-input string 参数,从指定文件中读人镜像内容。示例如下:
bash
$ docker load -i ubuntu_18.04.tar
上传镜像
可以使用 docker [image] push命令上传镜像到仓库,默认上传到 DockerHub 官方仓库(需要登录)。命令格式如下:
bash
$ docker [image] push NAME[:TAG] | [REGISTRY_HOST[:REGISTRY_PORT]/]NAME[:TAG]
参考
https://blog.csdn.net/chenmozhe22/article/details/113850238 Docker/Podman使用入门---基础命令篇
https://www.runoob.com/docker/docker-command-manual.html Docker 命令大全
https://haicoder.net/docker/docker-command.html Docker命令
https://www.lvbibir.cn/posts/tech/docker-commands/ docker | 常见命令
https://docs.docker.com/engine/reference/commandline/cli/ Use the Docker command line
https://github.com/wsargent/docker-cheat-sheet docker-cheat-sheet
https://docs.docker.com/reference/cli/docker/ docker (base command)
https://juejin.cn/post/7338717224435531826 docker init
https://zhuanlan.zhihu.com/p/644429693 一文带你了解 Docker 容器生命周期
https://www.devopsschool.com/blog/lifecycle-of-docker-containers/ Lifecycle of Docker Containers
https://blog.csdn.net/succing/article/details/122393565 Docker容器生命周期