容器操作主要是Docker容器的create、start、run、wait、logs
创建容器
使用docker [container] create 命令新建一个容器,例如
docker create myubuntu:v1.0 //创建容器
docker ps -a //查看所有容器。包含已停止的容器
docker start NAME[ID]
我在测试时,发现无论怎么启动myubuntu容器,它都处于停滞的状态,目测这个命令在这个实例无效
可使用docker run -it --name wayne myubuntu:v1.0 bash
错误提示:这句话是在下面笔记中发现的,docker create 创建的容器是可以正常的启动的。我没有启动的原因是:未按照标准语法书写,取消 -it 命令,全命令:docker create -it myubuntu:v1.0
容器是整个docker技术栈的核心,create和run命令支持的选项都十分繁杂,需要认真体会练习
选项主要包括如下几大类: 与容器运行模式相关、与容器环境配置相关、与容器资源限制和安全保护相关
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=[ | 链接到其他容器 |
--link-local-ip=[]: | 容器的本地链接地址列表 |
--mac-address=“” | 指定容器的Mac地址 |
--name=“ ” | 指定容器别名 |
create命令与容器运行模式相关的选项
选项 | 说明 |
---|---|
-a, --attach=[] | 是否绑定到标准输入、输出和错误 |
-d ,-- detach=true| false | 是否在后台运行容器,默认为否 |
-- detach-keys=”” | 从attach 模式退出的快捷链’ |
-- entrypoint="” | 镜像存在人口命令时,覆盖为新的命令 |
-- expose=[] | 指定容器会暴露出来的端口或端口范围 |
--group-add=[] | 运行容器的用户组 |
-i, --interactive=true | false | 保持标准输入打开,默认为false |
--ipc=“” | 容器lPC 命名空间,可以为其他容器或主机 |
-- isolation=”default ” | 容器使用的隔离机制 |
--log-driver="json-file” | 指定容器的日志驱动类型,可以为〕son-file 、syslog 、journald、 gelf 、fluentd , awslogs 、splunk , etwlogs 、 gcplogs 或none |
--log-opt=[] | 传递给日志驱动的选项 |
--net=“bridge” | 指定容器网络模式,包括bridge、none、其他容器内网络、host的网络或某个现有网络等 |
--net-alias=[] | 容器在网络中的别名 |
-p,--publish-all=trueifalse | 通过NAT 机制将容器标记暴露的端口自动映射到本地主机的l临时端口 |
-p , - -publish=[ ] | 指定如何|决射到本地主机端口,例如- p l l 234- l2234: 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 | 是否分配一个伪终端,默认为fa l se |
--tmpfs=[] | 挂载临时文件系统到容器 |
-v|--volume[=[[HOST-D IR:]CONTAINER-DIR [:OPTIONS]]] | 挂载主机上的文件卷到容器内 |
--volume-driver=" ” | 挂载文件卷的驱动类型 |
- -volumes- from=[] | 从其他容器挂载卷 |
-w, --workdir= "" | 容器内的默认工作目录 |
create命令与容器资源限制和安全保护的相关配置
选项 | 说明 |
---|---|
--blkio -weight=10~1000 | 容器读写块设备的1/0 性能权重,默认为0 |
- - blkio-weight-device=[DEVICE_NAME: WEIGHT] | 指定各个块设备的IIO 性能权重 |
--cpu-shares=0 | 允许容器使用CPU 资源的相对权重,默认一个容器能用满一个核的CPU |
--cap-add=[] | 增加容榕的Linux 指定安全能力 |
--cap-drop=[] | 移除容器的Li nux 指定安全能力 |
--cgroup-parent=” ” | 容器cgroups 限制的创建路径 |
--cidfile=” ” | 指定容器的进程ID 号写到文件 |
--cpu-period=0 | 限制j容器在CFS 调度器下的CPU 占用时间片 |
--cpuset-cpus=” ” | 限制容器能使用哪些CPU 核心 |
--cpuset-mems="" | NUMA 架构下使用哪些核心的内存 |
-- 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 memory="" | 限制容器使用内核的内存大小, 单位可以是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, --label =[]: 以键值对方式指定容器的标签信息;
--label-file=[]: 从文件中读取标签信息。
启动容器
使用docker [container] start 命令来启动一个已创建的容器,例如,启动刚创建的myubuntu:v1.0容器
新建并启动容器
创建容器后通过start命令来启动,也可以直接新建并启动,需要的命令主要为 docker [container] run 等价于先执行docker [container] create 命令,再执行docker [container] start 命令。
例如:输出“hello world”,之后容器自动停止
$ docker run ubuntu /bin/echo ‘hello world’
hello world
这跟本地直接执行 /bin/echo ’hello world‘ 相比几乎不出任何区别。
当利用docker [container] run 来创建容器并启动容器时,Docker在后台运行的标准操作包括:
1、检查本地是否存在指定镜像,不存在就从公共镜像仓库下载
2、利用镜像创建一个容器,并启动该容器
3、分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
4、从宿主机配置的网桥接口中桥接以个虚拟接口道容器中去
5、从网桥的地址池胚子一个IP地址给容器
6、执行用户指定的应用程序
7、执行完毕后容器被自动终止
下面的命令启动一个bash终端,允许用户进行交互
$ docker run -it myubuntu:v1.0 /bin/bash
[email protected] /#
[email protected] /# ls
bin boot dev etc home lib lib64 media mnt opt proc root ru卫sbin srv sys tmp usr var
[email protected]:/# pwd
/
[email protected]:/# ps
PID TTY TIME CMD
1 pts/0 00:00:00 bash
11 pts/0 00:00:00 ps
[email protected] /# exit
exit
-t 让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上
-i 让容器的标准输入保持打开
更多命令可以用过man docker-run命令来查看
可以使用docker container wait CONTAINER [CONTAINER…]子命令来等待容器的退出,并打印退出返回的结果
某些时候,执行docker [ container] run时候因为命令无法正常执行容器会出错直接退出, 此时可以查看退出的错误代码。
默认情况下,常见错误代码包括:
125 : Docker da emon 执行出错,例如指定了不支持的Docker 命令参数;
126 :所指定命令无法执行,例如权限出错;
127 : 容器内命令无法找到。
命令执行后出错,会默认返回命令的退出错误码。
守护态运行
更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。例如:下面命令会在后台运行容器
$ docker run -d ubuntu /bin/sh -c "while true;do echo hello world;sleep 1;done" //注意双引号中英文
查看容器输出
要获取容器的输出信息,可以通过docker [container] logs 命令。
该命令支持的选项包括:
-details : 打印详细信息;
-f, - follow :持续保持输出;
-since string :输出从某个时间开始的日志;
-tail string : 输出最近的若干日志;
-t, - timestamps : 显示时间戳信息;
-until string : 输出某个时间之前的日志。
例如,查看某容器的输出可以使用如下命令:
停止容器
主要是Docker容器的pause/unpause、stop和prune子命令
暂停容器
暂停容器可以使用docker [container] pause CONTAINER [CONTAINER…]命令来暂停一个运行中的容器
例如,启动一个容器,并将其暂停:
$ docker run --name test --rm -it -d ubuntu bash
$ docker pause test
$ docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
893c8llcf845 ubuntu "bash” 2 seconds ago Up 12 seconds (Paused) test
处于paused 状态的容器,可以使用docker [container ] unpause CONTAINER
[CONTAINER ... ] 命令来恢复到运行状态。
处于paused 状态的容器,可以使用docker [container ] unpause CONTAINER
[CONTAINER ... ] 命令来恢复到运行状态。
可以使用docker [container] stop 来终止一个运行中的容器。该命令的格式为:
docker [container] stop [-t|--time [=10]] [CONTAINER ... ]
该命令会首先向容器发送SIGTERM 信号,等待一段超时时间后(默认为10 秒),再发送SIGK工LL 信号来终止容器:
$ docker stop test
test
此时,执行docker container prune 命令,会自动清除掉所有处于停止状态的容器。此外,还可以通过docker [container] kill 直接发送SIGKILL 信号来强行终止容器。
此处图示略;
当Docker容器中指定的应用终结时,容器也会自动终止。例如,启用一个终端的容器,通过exit或者Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。
可以使用docker ps -a 命令查看所有容器的iD
处于终止状态的容器使用docker [container] start 命令来重新启动:
处于运行状态的容器可以使用docker [container] restart 命令来重新启动:
docker [container] restart 命令会将一个运行态的容器先终止,然后再重新启动
进入容器
在使用-d参数时,容器启动后会进入后台运行,用户无法看到容器内的信息,也无法进行操作。
这时候就需要使用官方推荐的attach或exec (个人喜欢exec)命令
docker exec: 在已运行的容器中,执行命令,操作对象是容器,如果你要进入已运行的容器,并且执行命令,用exec;
docker attach: 同样操作的是已运行的容器,可以将本机标准输入(键盘输入)输到容器中,也可以将容器的输出显示在本机的屏幕上,如果你想查看容器运行过程中产生的标准输入输出,用attach;
attach 命令
attach 是Docker 自带的命令,命令格式为:
docker [container] attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]]CONTAINER
这个命令支持三个主要选项:
--detach-keys [=[]]:指定退出attach 模式的快捷键序列, 默认是CTRL-pCTRL-q;
--no-stdin=true|false :是否关闭标准输入,默认是保持打开;
--sig-proxy=true|false :是否代理收到的系统信号给应用进程,默认为true 。
示例:
看到上面的图例,我想应该明白点什么,为什么我比较喜欢docker exec 而不是很喜欢docker attach,主要是多窗口同时使用docker attach到同一个容器时,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
exec命令
Docker 1.3版本起。Docker提供了一个更加方便的工具exec命令。可以在运行中容器内直接执行任何命令
该命令的基本格式为:
docker [container] exec [-d|-detach] [ --detach-keys[=[]]] [-i|--interactive][--pri vileged][-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 。
示例:
可以看到会打开一个新的bash 终端,在不影响容器内其他应用的前提下,用户可以与容器进行交互。
删除容器
docker [container) rm 命令来删除处于终止或退出状态的容器,命令格式为docker [container) rm [-f |--force] [-l|--link] [-v|-- volumes ] CONTAINER [CONTAINER ... ]
主要支持的选项包括:
-f, --force=false : 是否强行终止并删除一个运行中的容器;
-1, --link=false :删除容器的连接,但保留容器;
-v, --volumes=false :删除容器挂载的数据卷。
示例:查看处于终止状态的容器,并删除:
导入和导出容器(import And export)
前面在使用docker镜像中提到的存出(save)和载入(load),这两个命令是针对镜像[image]去操作的。
导出容器(export)
导出容器是导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,可以使用 :docker [container] export 命令
docker [container) export [-o| - -output [=””] ]CONTAINER
其中,可以通过-o选项来指导的tar文件名,也可以直接通过重定向来实现
导入容器(import)
导出的文件又可以使用docker [container] import 命令导入变成镜像,该命令格式为:
docker import [-c|--change[=[]]] [-m| -- message[=MESSAGE]] file|URL|[REPOSITORY [:TAG]]
可以通过- c, -change =[]选项在导人的同时执行对容器进行修改的Dockerfile指令
下面将导出的wayne.tar 文件导人到系统中:
***尝试使用docker load 命令导入容器文件到本地镜像库“失败”!不信邪的可以尝试!
docker import 只能把容器文件导入本地镜像库
docker load是将镜像文件导入本地镜像库
以上二者不能交叉使用
这两者的区别在于: 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),
而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导人时可以重新指定标签等元数据信息。
查看容器
主要是Docker容器的inspect、top、stats子命令
查看容器详情
查看容器详情可以使用docker container inspect [OPTIONS] CONTAINER [CONTAINER…]子命令
例如查看容器的具体信息,以json格式返回包括容器id、创建时间、路径、状态、镜像、配置等在内的各项服务:
$ docket container inspect tom2
查看容器内进程
可以使用 docker [container] top [OPTION] CONTAINER [CONTAINER…]子命令
这个命令类似于linux中的top命令,会打印出容器内的进程信息,包括PID、用户、时间、命令等。
$ docker top tom2
linux top命令
查看统计信息
使用docker [container] stats [OPTIONS] [CONTAINER…]子命令。会显示CPU、内存、储存、网络等使用情况的统计信息
-a,-all:统计所有容器统计信息,默认仅在运行中
--format string:格式化输出信息
--no-stream:不持续输出,默认会自动更新持续实时结果
-no-trunc:不截断输出信息
实例:查看当前运行中容器的系统资源使用统计
**不停止退出,会一直实时打印
其他容器命令
主要是Docker的 cp 、diff、port和update子命令
1、复制文件
container cp命令支持在容器和主机之间复制文件。命令格式为docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH|-。支持的选项包括:
-a ,-archive :打包模式,复制文件会带有原始的uid/gid信息;
-L,-follow-link:跟随软连接,当原路径为软连接时,默认只复制链接信息,使用该选项会复制列链接的目标内容。
实例:将本地的路径data复制到Tom2容器的/tmp路径下:
docker [container] cp wayne_x1.03.tar tom2:/user/local/
2、查看变更
container diff查看容器内文件系统的变更。命令格式为docker [container] diff CONTAINER
实例:查看tom2容器内数据修改:
$ docker container diff tom2
3、查看端口映射
container port 命令可以查看容器的端口映射情况。docker container port CONTAINER [PRIVATE_PORT[/PROTO]] 。
实例:查看test容器的端口映射情况:
4、更新配置
更新配置使用的是docker 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 (Completely Fair Schdeular: 完全公平调度器)配额,单位为微秒,最小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:限制使用的内存
-memory-reservation bytes:内存软限制
-memory-swap bytes:内存加上缓存区限制,-1表示为对缓存区无限制
-restart string :容器退出后的重启策略
实例:
限制总配额为1秒,容器tom2所占用时间10%
$ docker update --cpu-period 1000000 tom2
$ docker update --cpu-quota 1000000 tom2
小结
container 是直接提供应用服务的组件,也是docker整个技术栈最为核心的概念。围绕container,Docker 提供了很多操作命令,可使用Docker container help命令来查看Docker支持的container操作子命令
在生产环境中,为了提高容器的高可用和安全性,一方面要合理使用资源限制参数来管理容器的资源消耗;另一方面要指定合适的容器重启策略,来自动重启退出的容器,另外还可以使用HAproxy等辅助工作来处理负载均衡,自动切换故障的应用容器
本文由 wayne 创作,采用 知识共享署名4.0
国际许可协议进行许可
本站文章除注明转载/出处外,均为本站原创或翻译,转载前请务必署名
最后编辑时间为: Jul 30,2020