美文网首页IT@程序员猿媛
Docker 技术之容器

Docker 技术之容器

作者: 柳厌之 | 来源:发表于2019-04-30 20:58 被阅读22次

简介

容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。
如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用。那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。

操作 Docker 容器

创建容器:create/ start/ run/ wait/ logs

新建容器:docker [container] create [OPTIONS] IMAGE [COMMAND] [ARG...]

可以使用docker[container]create命令新建一个容器
使用docker[container]create命令新建的容器处于停止状态,可以使用docker[container]start命令来启动它。

选项主要包括如下几大类:与容器运行模式相关、与容器环境配置相关、与容器资源限制和安全保护相关。

create命令与容器运行模式相关的选项 create命令与容器环境和配置相关的选项 create命令与容器资源限制和安全保护相关的选项 create命令与容器资源限制和安全保护相关的选项(续表)

其他选项还包括:
·-l,--label=[]:以键值对方式指定容器的标签信息;
·--label-file=[]:从文件中读取标签信息。

启动容器:docker [container] start [OPTIONS] CONTAINER [CONTAINER...]

该命令可以 “Start one or more stopped containers”。

docker start选项 描述
-a, --attach Attach STDOUT/STDERR and forward signals
--detach-keys string Override the key sequence for detaching a container
-i, --interactive Attach container's STDIN

这个命令不仅是在容器停止运行后有用,当将 一个容器从暂停状态(暂停时你关掉了终端),变为运行态后,使用docker start -i test还能进入到与容器的交互中。

新建并启动容器:docker [container] run [OPTIONS] IMAGE [COMMAND] [ARG...]

除了创建容器后通过start命令来启动,也可以直接新建并启动容器,所需要的命令主要为docker[container]run
当利用docker[container]run来创建并启动容器时,Docker在后台运行的标准操作包括:

  • 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
  • 利用镜像创建一个容器,并启动该容器;
  • 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
  • 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
  • 从网桥的地址池配置一个IP地址给容器;
  • 执行用户指定的应用程序;
  • 执行完毕后容器被自动终止。

例如,docker run -it debian:stretch-slim /bin/bash
其中,-t选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。
用户可以按Ctrl+d或输入exit命令来退出容器。
对于所创建的bash容器,当用户使用exit命令退出bash进程之后,容器也会自动退出。这是因为对于容器来说,当其中的应用退出后,容器的使命完成,也就没有继续运行的必要了
可以使用docker [container] wait CONTAINER[CONTAINER……]子命令来等待容器退出,并打印退出返回结果。
某些时候,执行docker[container]run时候因为命令无法正常执行容器会出错直接退出,此时可以查看退出的错误代码。
默认情况下,常见错误代码包括:

  • 125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;
  • 126:所指定命令无法执行,例如权限出错;
  • 127:容器内命令无法找到。

start 子命令的选项比较少,而run子命令的选项和create子命令的选项几乎差不多。

守护态运行

更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。

查看容器输出

要获取容器的输出信息,可以通过docker[container]logs命令。
该命令支持的选项包括:

  • --details:打印详细信息;
  • -f,--follow:持续保持输出;
  • --since string:输出从某个时间开始的日志;
  • --tail string:输出最近的若干日志;
  • --t,-timestamps:显示时间戳信息;
  • --until string:输出某个时间之前的日志。

不得不说该日志记载的真的是详细的很。

停止容器

暂停容器:docker [container] pause CONTAINER [CONTAINER...]

可以使用docker[container]pause CONTAINER[CONTAINER……]命令来暂停一个运行中的容器。

例如:docker run --name test --rm -it debian:stratch bash ,然后再打开一个终端输入docker pause test,通过docker ps可查看容器的状态。

-rm 容器退出后是否自动删除,不能跟-d同时使用。

--rm Automatically remove the container when it exits
--name string Assign a name to the container

处于paused状态的容器,可以使用docker[container]unpause CONTAINER[CONTAINER……]命令来恢复到运行状态。

终止容器:docker [container] stop [OPTIONS] CONTAINER [CONTAINER...]

可以使用docker[container]stop来终止一个运行中的容器。该命令的格式为docker[container]stop[-t|--time[=10]][CONTAINER……]
该命令会首先向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器。
此时,执行docker container prune命令,会自动清除掉所有处于停止状态的容器
该子命令的选项就一个:
-t, --time int Seconds to wait for stop before killing it (default 10)

此外,还可以通过docker[container]kill直接发送SIGKILL信号来强行终止容器,它只有一个选项: -s, --signal string Signal to send to the container (default "KILL")。

我们已经反复强调过,当Docker容器中指定的应用终结时,容器也会自动终止,通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。
处于终止状态的容器,可以通过docker[container]start命令来重新启动,docker[container]restart命令会将一个运行态的容器先终止,然后再重新启动,restart子命令只有一个选项:-t, --time int Seconds to wait for stop before killing the container (default 10)。

进入容器:attach/ exec

在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,推荐使用官方的attachexec命令。

attach命令:docker [container] attach [OPTIONS] CONTAINER

attach是Docker自带的命令,作用是“Attach local standard input, output, and error streams to a running container”,命令格式为:docker [container] attach [OPTIONS] CONTAINER
这个命令支持三个主要选项:

  • --detach-keys[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;
  • --no-stdin=true|false:是否关闭标准输入,默认是保持打开;
  • --sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true。

然而使用attach命令有时候并不方便。当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。

exec命令:docker [container] exec [OPTIONS] CONTAINER COMMAND [ARG...]

从Docker的1.3.0版本起,Docker提供了一个更加方便的工具exec命令,可以在运行中容器内直接执行任意命令。该命令的格式为:docker [container] exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG……]
比较重要的参数有:

  • -d,--detach:在容器中后台执行命令;
  • --detach-keys="":指定将容器切回后台的按键;
  • -e,--env=[]:指定环境变量列表;
  • -i,--interactive=true|false:打开标准输入接受用户输入命令,默认值为false;
  • --privileged=true|false:是否给执行命令以高权限,默认值为false;
  • -t,--tty=true|false:分配伪终端,默认值为false;
  • -u,--user="":执行命令的用户名或ID。

例如,首先我们用docker run --name=test3 -d -it debian:stretch-slim创建一个后台运行的docker容器,注意-it参数是应该有的,否则容器刚创建就停止,原因已经反复强调多变了,当应用终结时容器自动终止。可以通过docker ps查看容器的状态,之后使用docker exec -it test3 /bin/bash来进入容器,注意/bin/bash是应该有的,因为exec的参数至少是两个——CONTAINERCOMMAND
通过指定-it参数来保持标准输入打开,并且分配一个伪终端(如果不用-t,你可能会发现你的输入都会被执行,就跟在终端中一样,但是没有root@666677:类似的前缀,下面给你一张效果图)。通过exec命令对容器执行操作是最为推荐的方式

docker exec -i test3 /bin/bash

删除容器:docker [container] rm [OPTIONS] CONTAINER [CONTAINER...]

可以使用docker[container]rm命令来删除处于终止或退出状态的容器,命令格式为docker[container]rm[-f|--force][-l|--link][-v|--volumes]CONTAINER[CONTAINER……]
主要支持的选项包括:

  • -f,——force=false:是否强行终止并删除一个运行中的容器;
  • -l,——link=false:删除容器的连接,但保留容器;
  • -v,——volumes=false:删除容器挂载的数据卷。

默认情况下,docker rm命令只能删除已经处于终止或退出状态的容器,并不能删除还处于运行状态的容器。如果要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。

导入和导出容器:import/ export

某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导入和导出功能,这也是Docker自身提供的一个重要特性。

导出容器:docker [container] export [OPTIONS] CONTAINER

导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。可以使用docker[container]export命令,该命令格式为:
docker [container] export [-o|--output[=""]] CONTAINER,其中,可以通过-o选项来指定导出的tar文件名,也可以直接通过重定向来实现。

导入容器:docker [container] import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]

导出的文件又可以使用docker[container]import命令导入变成镜像,该命令格式为:docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]],用户可以通过-c--change=[]选项在导入的同时执行对容器进行修改的Dockerfile指令。
既可以使用docker [image] load命令来导入镜像存储文件到本地镜像库,也可以使用docker[container]import命令来导入一个容器快照到本地镜像库。这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息

查看容器:inspect/ top/ stats

查看容器详情:docker container inspect [OPTIONS] CONTAINER [CONTAINER...]

查看容器详情可以使用docker container inspect[OPTIONS]CONTAINER[CONTAINER……]子命令。
例如,查看某容器的具体信息,会以json格式返回包括容器Id、创建时间、路径、状态、镜像、配置等在内的各项信息。

查看容器内进程:docker [container] top CONTAINER [ps OPTIONS]

查看容器内进程可以使用docker[container]top[OPTIONS]CONTAINER[CONTAINER……]子命令。
这个子命令类似于Linux系统中的top命令,会打印出容器内的进程信息,包括PID、用户、时间、命令等。

查看统计信息:docker [container] stats [OPTIONS] [CONTAINER...]

查看统计信息可以使用docker[container]stats[OPTIONS][CONTAINER……]子命令,会显示CPU、内存、存储、网络等使用情况的统计信息。
支持选项包括:

  • -a,--all:输出所有容器统计信息,默认仅在运行中;
  • --format string:格式化输出信息;
  • --no-stream:不持续输出,默认会自动更新持续实时结果
  • --no-trunc:不截断输出信息。
查看容器:top/ stats

其他容器命令

复制文件:docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|- 或 SRC_PATH|- CONTAINER:DEST_PATH

container cp命令支持在容器和主机之间复制文件。命令格式为docker[container]cp[OPTIONS]CONTAINER:SRC_PATH DEST_PATH|-。支持的选项包括:

  • -a,-archive:打包模式,复制文件会带有原始的uid/gid信息;
  • -L,-follow-link:跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容

例如,docker [container] cp data test:/tmp/ 将本地的路径data复制到test容器的/tmp路径下。

查看变更:docker [container] diff CONTAINER

container diff查看容器内文件系统的变更。命令格式为docker [container] diff CONTAINER

查看端口映射:docker [container] port CONTAINER [PRIVATE_PORT[/PROTO]]

container port命令可以查看容器的端口映射情况。命令格式为docker [container] port CONTAINER[PRIVATE_PORT[/PROTO]]

更新配置:docker [container] update [OPTIONS] CONTAINER [CONTAINER...]

container update命令可以更新容器的一些运行时配置,主要是一些资源限制份额。命令格式为
docker[container]update[OPTIONS]CONTAINER[CONTAINER……]
支持的选项包括:

  • -blkio-weight uint16:更新块IO限制,10~1000,默认值为0,代表着无限制;
  • -cpu-period int:限制CPU调度器CFS(Completely Fair Scheduler)使用时间,单位为微秒,最小1000;
  • -cpu-quota int:限制CPU调度器CFS配额,单位为微秒,最小1000;
  • -cpu-rt-period int:限制CPU调度器的实时周期,单位为微秒;
  • -cpu-rt-runtime int:限制CPU调度器的实时运行时,单位为微秒;
  • -c,-cpu-shares int:限制CPU使用份额;
  • -cpus decimal:限制CPU个数;
  • -cpuset-cpus string:允许使用的CPU核,如0-3,0,1;
  • -cpuset-mems string:允许使用的内存块,如0-3,0,1;
  • -kernel-memory bytes:限制使用的内核内存;
  • -m,-memory bytes:限制使用的内存;
  • -memory-reservation bytes:内存软限制;
  • -memory-swap bytes:内存加上缓存区的限制,-1表示为对缓冲区无限制;
  • -restart string:容器退出后的重启策略。

容器小结

在生产环境中,为了提高容器的高可用性和安全性,一方面要合理使用资源限制参数来管理容器的资源消耗;另一方面要指定合适的容器重启策略,来自动重启退出的容器。此外,还可以使用HAProxy等辅助工具来处理负载均衡,自动切换故障的应用容器。

Cheat Sheet

# 容器 关键命令回顾
docker [container] create [OPTIONS] IMAGE [COMMAND] [ARG...]  # 创建容器
docker [container] start [OPTIONS] CONTAINER [CONTAINER...]  # 启动容器
docker [container] run [OPTIONS] IMAGE [COMMAND] [ARG...]  # 新建并启动容器
docker [container] logs  # 查看容器的输出信息
docker [container] pause CONTAINER [CONTAINER...]  # 暂停容器,恢复换为unpause
docker [container] stop [OPTIONS] CONTAINER [CONTAINER...]  # 终止容器
docker [container] attach [OPTIONS] CONTAINER  # 进入在后台运行的容器
docker [container] exec [OPTIONS] CONTAINER COMMAND [ARG...]  # 推荐进入容器的用法,可以在运行中容器内直接执行任意命令
docker [container] rm [OPTIONS] CONTAINER [CONTAINER...]  # 删除处于终止或退出状态的容器
docker [container] export [OPTIONS] CONTAINER  # 导出容器快照
docker [container] import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]  # 导入容器
docker container inspect [OPTIONS] CONTAINER [CONTAINER...]  # 查看容器详
docker [container] top CONTAINER [ps OPTIONS]  # 查看容器内进程,PID、用户、时间、命令等
docker [container] stats [OPTIONS] [CONTAINER...]  # 查看统计信息,CPU、内存、存储、网络等
docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-
docker [container] cp [OPTIONS] SRC_PATH|- CONTAINER:DEST_PATH  # 复制文件
docker [container] diff CONTAINER  # 查看容器内文件系统的变更
docker [container] port CONTAINER [PRIVATE_PORT[/PROTO]]  # 查看端口映射
docker [container] update [OPTIONS] CONTAINER [CONTAINER...]  # 更新容器的一些运行时配置,主要是一些资源限制份额。

相关文章

  • docker生态容器

    Docker容器生态 Docker生态:容器核心技术、平台技术、支持技术 容器核心技术:指的是container在...

  • 01-Docker基础入门

    Docker容器概念 Docker容器的基础为Linux容器(LXC)技术,轻量化级别的技术。Docker为C/S...

  • docker中使用docker

    在 Docker 容器里面使用 docker run/docker build? Docker 容器技术目前是微服...

  • Kubernetes(K8s)初探

    Docker技术 Docker本身并不是容器,它是创建容器的工具,是应用容器引擎。 Docker技术的三大核心概念...

  • Docker系列之原理简单介绍

    Docker系列之原理简单介绍 @[toc] Docker是一个开源的应用容器引擎;是一个轻量级容器技术;Dock...

  • Docker 技术之容器

    简介 容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。如果认为虚拟机是模拟运行的一整套操作...

  • Docker之常见问题汇总

    Docker常见问题 Docker之容器vim command not found Docker之容器vim co...

  • Docker相关概念

    Docker核心技术 容器镜像 docker架构 docker compose容器部署 docker常用命令帮助命...

  • Linux环境基于CentOS7 搭建部署Docker容器

    1.Docker容器概述 区分Docker容器技术和VM虚拟机技术:evernotecid://394EFE90-...

  • Docker入门

    Docker是容器技术,容器仿真了Linux系统,提供一个有限的系统能力。 Docker容器依靠docker镜像创...

网友评论

    本文标题:Docker 技术之容器

    本文链接:https://www.haomeiwen.com/subject/ivcpnqtx.html