操作 Docker 容器

容器是镜像的一个运行实例。比较大的不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。

本文记录容器的重要操作,包括创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等。

1. 创建容器

本节主要介绍 Docker 容器的 create、start、run、wait 和 logs 子命令。

1.1 新建容器

可以使用 docker [container] create 命令来新建容器,例如:
docker create -it ubuntu:latest

由于容器是整个 Docker 技术栈的核心,create 命令和后续的 run 命令支持的选项都十分复杂,需要我们在实践中不断体会。

选项包括如下几大类:

  • 与容器运行模式相关
  • 与容器环境配置相关
  • 与容器资源限制和安全保护相关
  • 其他选项

create 命令与容器运行模式相关的选项

选项 说明
-a, --attach=[] 是否绑定到标准输入、输出和错误
-d,--detach=true|false 是否在后台运行容器,默认为否
--detach-keys="" 从 attach 模式退出的快捷键
--entrypoint="" 镜像存在入口命令时,覆盖为新的命令
--expose=[] 指定容器会暴露出来的端口或者端口范围
--group-add=[] 运行容器的用户组
-i, --interactive=true|false 保持标准输入打开,默认为 false
--ipc="" 容器的 IPC 命令空间,可以为其他容器或者主机
--isolation="default" 容器使用的隔离级别
--log-driver="json-file" 指定容器的日志驱动类型,可以为 json-file、syslog、journald、gelf、fluentd、awslogs、splunk、etwlogs、gcplogs 或 none
--log-opt=[] 传递给日志驱动的选项
--net="bridge" 指定容器网络模式,包括 bridge、none、其他容器内网络、host 的网络或者某个现有网络等
--net-alias=[] 容器在网络中的别名
-P,--publish-all=true|false 通过 NAT 机制将容器标记暴露的端口自动映射到本地主机的临时端口
-p,--publish=[] 指定如何映射到本地主机端口,例如 -p 11234-12234:1234-2234
--pid=host 容器的 PID 命名空间
--userns="" 启动 userns-remap 时配置用户命名空间的模式
--uts=host 容器的 UTS 命名空间
--restart="no" 容器的重启策略,包括 no、on-failure[:max-retry]、always、unless-stopped 等
--rm=true|false 容器退出后是否删除,不能跟 -d 同时使用
-t,--tty=true|false 是否分配一个伪终端,默认为 false
--tmpfs=[] 挂载临时文件系统到容器
-v,--volume[=[[HOST-DIR:]CONTAINER-DIR[:OPTIONS]]] 挂载主机上的文件卷到容器内
--volume-driver="" 挂载文件卷的驱动类型
--volumes-from=[] 从其他容器挂载卷
-w,--workdir="" 容器内的默认工作目录

create 命令与容器环境和配置相关的选项

选项 说明
--add-host=[] 在容器内添加一个主机名到 IP 地址的映射关系(通过 /etc/hosts 文件)
--device=[] 映射物理机上的设备到容器内
--dns-search=[] DNS搜索域
--dns-opt=[] 自定义的 DNS 选项
--dns=[] 自定义的 DNS 服务器
-e,--env=[] 指定容器内环境变量
--env-file=[] 从文件中读取环境变量到容器内
-h,--hostname="" 指定容器内的主机名
--ip="" 指定容器的 IPv4 地址
--ip6="" 指定容器的 IPv6 地址
--link=[<name or id>:alias] 链接到其他容器
--link-local-ip=[]: 容器本地地址链接表
--mac-address="" 指定容器的 Mac 地址
--name="" 指定容器的别名

create 命令与容器资源限制和安全保护相关的选项

选项 说明
--blkio-weight=10~1000 容器读写块设备的 I/O 性能权重,默认为 0
--blkio-weight-device=[DEVICE_NAME:WEIGHT] 指定各个块设备的 I/O 性能权重
--cpu-shares=0 允许容器使用 CPU 资源的相对权重,默认一个容器能用满一个核的 CPU
--cap-add=[] 增加容器的 Linux 指定安全能力
--cap-drop=[] 移除容器的 Linux 指定安全能力
--cgroup-parent="" 容器 cgroups 限制的创建路径
--cidfile="" 指定容器的进程 ID 号写到文件
--cpu-period=0 限制容器在 CFS 调度器下的 CPU 占用时间片
--cpuset-cpus="" 限制容器能使用那些 CPU 核心
--cpuset-mems="" NUMA 架构下使用哪些 CPU 核心的内存
--cpu-quota=0 限制容器在 CFS 调度器下的 CPU 配额
--device-read-bps=[] 挂载设备的读吞吐率(以 bps 为单位)限制
--device-write-bps=[] 挂载设备的写吞吐率(以 bps 为单位)限制
--device-read-iops=[] 挂载设备的读速率(以每秒 i/o 次数为单位)限制
--device-write-iops=[] 挂载设备的写速率(以每秒 i/o 次数为单位)限制
--health-cmd="" 指定检查容器健康状态的命令
--health-interval=0s 执行健康检查的间隔时间,单位可以以 ms、s、m 或 h
--health-retries=int 健康检查的失败重试次数,超过则认为不健康
--health-start-period=0s 容器启动后进行健康检查的等待时间,单位可以为 ms、s、m 或 h
--health-timeout=0s 健康检查的执行超时,单位可以为 ms、s、m 或 h
--no-healthcheck=true|false 是否禁用健康检查
--init 在容器中执行一个 init 进程,来响应信号和处理僵尸状态的子进程
--kernel-momory="" 限制容器内核的内存大小,单位可以是 b、k、m 或 g
-m,--memory="" 限制容器内应用使用的内存,单位可以时 b、k、m 或 g
--memory-reservation="" 当系统中内存过低时,容器会被强制限制内存到给定值,默认情况下等于内存限制值
--memory-swap="LIMIT" 限制容器使用内存和交换区的总大小
--oom-kill-disable=true|false 内存耗尽时是否杀死容器
--oom-score-adj="" 调整容器的内存耗尽参数
--pids-limit="" 限制容器的 pid 格式
--privileged=true|false 是否给容器高权限,这意味着容器内应用将不受权限的限制,一般不推荐
--read-only=true|false 是否让容器内的文件系统只读
--security-opt=[] 指定一些安全参数,包括权限、安全能力、apparmor 等
--stop-signal=SIGTERM 指定停止容器的系统信号
--shm-size="" /dev/shm 的大小
--sig-proxy=true|false 是否代理收到的信号给应用,默认为 true,不能代理 SIGCHLD、SIGSTOP 和 SIGKILL 信号
--memory-swappiness="0~100" 调整容器的内存交换区参数
-u,--user="" 指定在容器内执行命令的用户信息
--userns="" 指定用户命名空间
--ulimit=[] 通过 ulimit 来限制最大文件数、最大进程数等

其他选项有:

  • -l,--lable=[] : 以键值对方式指定容器的标签信息
  • --lable-file=[] : 从文件中读取标签信息

1.2 启动容器

使用 docker [container] start 命令可以启动一个已经创建的容器。例如
docker start kong

1.3 新建并启动容器

docker [container] run 命令等价于先执行 docker [container] create 再执行 docker [container] start。当使用 docker [container] run 命令创建并启动容器时,Docker 在后台运行的标准操作包括:

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

1.4 守护态运行

更多的时候,需要让 Docker 容器在后台以守护态形式运行。此时可以使用 -d 参数来实现

1.5 查看容器输出(日志)

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

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

例如,查看某容器最新的日志输出
docker logs -tail kong

2. 停止容器

本节主要介绍 Docker 容器的 pause/unpause、stop 和 prune 子命令。

2.1 暂停容器

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

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

2.2 终止容器

可以使用 docker [container] stop [-t|--time[=10]] 来终止一个运行中的容器。
该命令首先会发送 SIGTERM 信号,等到一段超时时间后(默认为 10 秒),再发送 SIGKILL 信号来终止容器。

此时,执行 docker container prune 命令,会自动清除掉所有处于停止状态的容器。

此外,还可以直接通过发送 docker [container] kill 直接发送 SIGKILL 信号来强行终止容器。

当 Docker 容器中指定的应用终结时,容器也会自动终止。

对于处于终止状态的容器,可以使用 docker [container] start命令重新启动。与之对应的还有一个 docker [container] restart 命令,会先终止容器,再重新启动。

3.进入容器

使用 -d 参数后,容器启动后就会进入后台,这时要进入容器操作,就可以使用 attach 或者 exec 命令。其中 attach 是一开始就存在的命令,exec 是 Docker 1.3.0 版本后新增的。

区别是当多个窗口同时 attach 到一个容器时,所有窗口都会同步显示;当某个窗口阻塞时,其他窗口也无法执行操作了。而 exec 命令每次都会新开一个 bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。

3.1 attach 命令

格式为 docker [container] attach [--detach-keys[=[]]] [--no-stdin] [[--sig-proxy[=true]] CONTAINER
这个命令支持三个主要选项:

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

3.2 exec 命令

格式为docker [container] exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [AGE...]
比较重要的参数有:

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

例如 docker exec -it kong bash,有些容器没有 bash,则可以尝试使用 sh,例如 docker exec -it sh

通过指定 -it 参数来保持标准输入打开,并且分配一个伪终端。通过 exec 命令对容器执行操作是最为推荐的方式。

4. 删除容器

格式为 docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] [CONTAINER...]。主要支持的选项包括:

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

5. 导入和导出容器

5.1 导出容器

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

例如:
docker export -o kong.tar kongdocker export kong > kong.tar

5.2 导入容器

格式为 docker import [-c|--change[=[]]] [-m|--messgae[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]] 用户可以通过 -c,--change=[] 选项在导入的同时执行对容器进行修改的 Dockerfile 指令。

之前的博客,docker 镜像相关指令 中,笔者曾介绍过使用 docker load 命令来导入一个镜像,与 docker [container] import 命令十分相似。实际上这两个命令都可以导入镜像到本地镜像库,区别在于:容器快照文件将丢弃所有历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存出文件将保存完整记录,体积更大。此外,容器快照文件导入时可以重新指定标签等元数据信息。

6. 查看容器

6.1 查看容器详情

可以使用 docker container inspect [OPTIONS] CONTAINER [CONTAINER...] 查看容器详情,格式是 json 形式,包括容器的 id、创建时间、路径、状态、镜像、配置等在内的各项信息。

6.2 查看容器内进程

格式为 docker [container] top [OPTIONS] CONTAINER [CONTAINER...]

6.3 查看统计信息

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

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

7. 其他容器指令

7.1 复制文件

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

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

7.2 查看变更

查看容器内文件系统的变更,可以使用 docker [container] diff CONTAINER

7.3 查看端口映射

格式为 docker container port CONTAINER [PRIVATE_PORT[/PROTO]]

7.4 更新配置

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 : 允许使用的内核内存
  • -kernel-memory bytes : 限制使用的内核内存
  • -m,-memory bytes : 限制使用的内存
  • -memory-reservation bytes : 内存软限制
  • -memory-swap bytes : 内存加上缓存区的限制,-1 表示为对缓冲区无限制
  • -restart string : 容器退出后的重启策略
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容