操作Docker容器
容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。
本章将具体介绍围绕容器的重要操作,包括创建一个容器 、 启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导人导出容器来实现容器迁移等。
创建容器
主要介绍Docker容器的create、start、run、wait和logs子命令
1、新建容器
命令:docker [container] create
作用:新建一个容器
由于容器是整个 Docker 技术拢的核心, create 命令和后续的 run 命令支持的选项都十分复杂,需要读者在实践中不断体会 。选项主要包括如下几大类 :
- 与容器运行模式相关;
- 与容器环境配置相关;
- 与容器资源限制和安全保护相关;
参见表 4-1~表 4-3
2、启动容器
命令:docker [container] start
作用:启动一个已经创建的容器
docker容器的启动有三种方式:
交互方式:基于镜像新建容器并启动
- 使用docker run命令来启动容器,docker在后台运行的标准操作包括
- 检查本地是否存在指定的镜像,不存在则从公有仓库下载
- 使用镜像创建并启动容器
- 分配一个文件系统,并在只读的镜像层外面挂载一层可读可写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中去
- 从地址池分配一个ip地址给容器
- 执行用户指定的应用程序
- 执行完毕之后容器被终止
短暂方式:直接将一个已经终止的容器启动运行起来
以上,命令执行完,控制台会打印"hello world",容器就终止了,不过并没有消失,可以用"docker ps -n 3 "看一下最新前3个的容器,第一个就是刚刚执行过的容器,可以再次执行一遍:docker start [ container_id ],不过这次控制台看不到”hello world”了,只能看到容器ID,用logs命令才能看得到:docker logs [ container_id ]。这时可以看到两个”hello world”了,因为这个容器运行了两次。
Daemon方式,守护态运行:即让软件作为长时间服务运行
通过-d参数实现Docker容器在后台以守护态形式运行
容器启动后会返回一个唯一的id,也可以通过docker ps或docker container ls命令来查看容器信息:
3、查看容器输出
命令:docker [container] logs
【参数解析】
- -details:打印详细信息;
- -f,-follow:持续保持输出;
- -since string:输出从某个时间开始的日志;
- -tail string:输出最近的若干日志;
- -t,-timestamps:显示时间戳信息;
- -until string:输出某个时间之前的日志;
具体例子可看上一序号的示例。
停止容器
主要介绍Docker容器的pause/unpause、stop和prune子命令
1、暂停容器
命令:docker [container] pause CONTAINER [CONTAINER...]
作用:暂停一个运行中的容器
命令:docker [container] unpause CONTAINER [CONTAINER...]
作用:恢复处于暂停状态的容器
2、终止容器
命令:docker [container] stop [ -t | --time[=10] ] [CONTAINER...]
作用:终止一个运行中的容器
该命令会首先向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器
此时,执行docker container prune命令,会自动清除掉所有处于停止状态的容器。
此外,还可以通过docker [container] kill直接发送SIGKILL信号来强行终止容器。
进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,推荐使用官方的attach或exec命令。
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;
【注】然而使用attach命令有时候不方便,当多个窗口同时attach到同一个容器的时候,所有窗口都会同步显示;当某个窗口因命令阻塞时,其他窗口也无法操作了。
2、exec命令
命令:docker [ container ] exec [ -di -detach ] [ detach-keys [= [ ] ] ] [ -il--interactive ] [ - -piivileged][ -t | --tty ] [ -u I --user [ =USER ] ] CONTAINER COMMAND [ARG . . . ]
【参数解析】
- -d, --detach : 在容器中后台执行命令;
- -detach-keys ="":指定将容器切回后台的按键;
- -e, - - env= []:指定环境变量列表 ;
- -i, --interactive=true | false :打开标准输入接受用户输入命令, 默认值为false;
- -- privileged=trueifalse : 是否给执行命令以高权限,默认值为 false;
- -t, --tty = true | false : 分配伪终端,默认值为 false;
- - u,--user="":执行命令的用户名或 ID;
例:进入到刚刚创建容器中,并启动一个bash
此时,可以在不影响容器内其他应用的前提下,与容器进行交互。
删除容器
命令: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信号给容器,终止其中应用,之后强行删除;
导入和导出容器
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导入和导出功能,这也是Docker自身提供的一个重要特性。
1、导出容器
导出容器是指,导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。
命令:docker [container) export [-o l - -output [ =” ” ] ] CONTAINER
【参数解析】
- -o:指定导出的tar文件名,也可通过重定向来实现
之后可以将导出的tar文件传输到其他机器上,然后再通过导入命令导入到系统中,实现容器的迁移。
2、导入容器
命令:docker import [ -c | --change [ = [ ] ] ] [ -m | --message [ =MESSAGE ] ] file | URL | -[ REPOSITORY [ :TAG] ]
【注】用户通过-c,--change=[ ]选项在导入的同时执行对容器进行修改的Dockerfile指令。
例:将导出的ubuntu_18_04.tar.gz文件导入到系统中
【Import和Load的区别】
相同:
- load命令可用来导入镜像存储文件到本地镜像库,import命令可用来导入一个容器快照到本地镜像库;
不同:
- 容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态);
- 镜像存储文件将保存完整记录,体积更大;
因此,从容器快照文件导入时可以重新指定标签等元数据信息。
查看容器
主要介绍Docker容器的inspect、top和stats子命令
1、查看容器详情
命令:docker container inspect [OPTIONS] CONTAINER [CONTAINER...]
例:查看某容器的具体信息,会以JSON格式返回包括容器id、创建时间、路径、状态、镜像、配置等在内的各项信息。
2、查看容器内进程
命令:docker [container] top [OPTIONS] CONTAINER [CONTAINER...]
作用:类似于Linux系统中的top命令,会打印出容器内的进程信息,包括PID、用户、时间、命令等。
例:查看某容器内的进程信息
3、查看统计信息
命令:docker [container] stats [OPTIONS] [CONTIANER...]
作用:显示CPU、内存、存储、网络等使用情况的统计信息
【参数解析】
- -a,-all:输出所有容器统计信息,默认仅在运行中;
- -format string:格式化输出信息;
- -no-stream:不持续输出信息,默认会自动更新持续实时结果;
- -no-trunc:不截断输出信息;
例:查看当前运行中容器的系统资源使用统计
其他容器命令
主要介绍Docker容器的cp、diff、port和update子命令
1、复制文件
命令:docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH | -
【参数解析】
- -a,-archive:打包模式,复制文件会带有原始的uid/gid信息;
- -L,-follow-link:跟随软连接。当原路径为软连接时,默认只复制链接信息,使用该选项会复制链接的目标内容;
2、查看变更
命令:docker [container] diff CONTAINER
例:查看容器内的数据修改
3、查看端口映射
命令:docker container port CONTAINER [PRIVATE_PORT [ / PROTO ] ]
例:查看容器的端口映射情况(写者未做对应端口映射,查询无结果)
4、更新配置
命令:docker [contianer] 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 stri口g : 容器退出后的重启策略;