Docker常见命令使用

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容器生命周期

相关推荐
我叫啥都行2 分钟前
计算机基础知识复习9.7
运维·服务器·网络·笔记·后端
骅青6 分钟前
kubernetes调度2
容器·kubernetes
qq 1778036221 小时前
智能新时代,游戏盾守护顺畅体验
运维·服务器·网络·游戏·云计算·ddos·ip
Alone80462 小时前
K8s中HPA自动扩缩容及hml
云原生·容器·kubernetes
神秘的土鸡2 小时前
Linux中使用Docker容器构建Tomcat容器完整教程
linux·运维·服务器·docker·容器·tomcat
玖石书2 小时前
docker 数据管理
docker·容器
TravisBytes3 小时前
linux 系统是如何收发数据包
linux·运维·服务器
HoweWWW3 小时前
k8s-API 访问控制
云原生·容器·kubernetes
2420304 小时前
Docker笔记-容器数据卷
docker
德迅--文琪4 小时前
SCDN是服务器吗?SCDN防御服务器有什么特点?
运维·服务器