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

相关推荐
zhd15306915625ff9 分钟前
化工厂主要涉及的自动化备件有哪些?
运维·自动化·化工厂
Jason-河山9 分钟前
利用API返回值实现商品信息自动化更新:技术与实践
运维·自动化
wowocpp1 小时前
查看 linux ubuntu 分区 和 挂载 情况 lsblk
linux·运维·ubuntu
_.Switch5 小时前
高级Python自动化运维:容器安全与网络策略的深度解析
运维·网络·python·安全·自动化·devops
2401_850410835 小时前
文件系统和日志管理
linux·运维·服务器
JokerSZ.5 小时前
【基于LSM的ELF文件安全模块设计】参考
运维·网络·安全
芯盾时代5 小时前
数字身份发展趋势前瞻:身份韧性与安全
运维·安全·网络安全·密码学·信息与通信
心灵彼岸-诗和远方6 小时前
DevOps业务价值流:架构设计最佳实践
运维·产品经理·devops
一只哒布刘6 小时前
NFS服务器
运维·服务器
南猿北者7 小时前
docker容器
docker·容器