容器是镜像的一个运行实例
镜像是静态的只读文件,容器带有运行时需要的可写问文件层
容器中的应用进程处于运行状态
虚拟机:模拟运行的一整套操作系统
容器:独立运行的一个应用及他们必需的运行环境
创建容器
1.新建容器
- docker [container] create
创建的容器处于停止状态,可以使用docker [container] start 命令启动它
支持的选项:...
其他选项还包括:
- -l, --label=[]: 以键值对方式指定容器标签的信息
- --label-file=[]: 从文件中读取标签信息
2.启动容器
- docker [container] start NAME
3.新建并启动容器
- docker [container] run
例如,下面的命令输出"hello world",之后容器自动停止
docker run ubuntu /bin/echo "hello world"
使用docker [container] run 创建并启动容器,docker在后台的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载
- 利用镜像创建一个容器,并启动该容器
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去
- 从网桥的地址池配置一个IP地址给容器
- 执行用户指定的应用程序
- 执行完毕后容器被自动停止
docker run -it ubuntu:18.04 /bin/bash 允许用户进行交互
-t 让docker分配一个伪终端(pseudo-tty)并绑定到容器的标准输出上
-i 让容器的标准输入保持打开
更多选项可通过 man docker-run 命令查看
ctrl+d 或输入 exit 退出容器
对于所创建的bash容器,使用exit推出bash进程后,容器也会自动退出。因为对于容器来说,其中的用用退出后,容器的使命完成,也就没有继续云心的必要了
可以使用 docker container wait CONTAINER [CONTAINER ...] 子命令来等待容器退出,并打印容器退出返回结果
默认情况下,创建错误码包括:
125:docker daemon执行出错,例如指定了不支持的docker参数
126:所指定命令无法执行,执行权限出错
127:容器内命令无法找到
4.守护态(daemonized)运行
- docker run -d
docker run -d ubuntu /bin/sh -c "while true; do echo hello world; sleep 1; done"
容器启动后会返回一个唯一的id,也可以通过 docker ps 或 docker container ls 查看容器信息
5.查看容器输出
- docker [container] logs
支持的选项包括:
- -details: 打印详细信息
- -f, -follow: 持续保持输出
- -since string: 输出从某个时间开始的日志
- -t, -timestamps: 显示时间戳信息
- -until string: 输出某个时间之前的日志
停止容器
1.暂停容器
- docker [container] pause CONTAINER [CONTAINER ...]
例如,启动一个容器,并将其暂停:
docker run --name test --rm -it ubuntu bash
docker pause test
docker ps
使用 docker [container] unpause CONTAINER [CONTAINER ...] 恢复运行状态
2.终止容器
- docker [container] stop [-t | --time[=10]] [CONTAINER...]
该命令首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为10s),再发送 SIGKILL 信号来终止容器
执行 docker container prune,自动清除处于停止状态的容器
还可以通过 docker [container] kill 直接发送 SIGKILL 信号强行终止容器
当容器中指定的应用终结时,容器也会自动终止
可以通过 docker ps -qa 查看所有容器的ID
处于终止状态的容器,可通过 docker [container] start 重新启动
docker [container] restart 先终止,再重新启动
进入容器
使用 -d 参数时,容器进入后台,用户无法看到容器中的信息,也无法操作
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
docker run -itd ubuntu
docker ps
docker attach CONTAINER
当多个多个窗口同时attach到一个容器时,所有窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也无法操作。
2.exec命令
1.3.0之后,
- 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: 分配伪终端,默认flase
- -u, --user="": 执行命令的用户名或ID
例如进入一个刚创建的容器,并启动一个bash:
docker exec -it CONTAINER /bin/bash
删除容器
- docker [container] rm [-f | --force] [-l | --link] [-v | --volumes] CONTAINER [CONTAINER ...]
主要支持的选项包括:
- -f, --force=false: 是否强制终止并删除一个运行中的容器
- -l, --link=false: 删除容器的链接,但保留原容器
- -v, --volumes=false: 删除容器挂载的数据卷
默认情况下,不能删除还处于运行状态的容器,可以添加 -f 参数。docker会先发送 SIGKILL 信号给容器,终止其中的应用,之后强行删除。
导入导出容器
1.导出容器
不管此时容器是否处于运行状态,
- docker [container] export [-o | --output [=""]] CONTAINER
例如,分别导 ce5, e81 到 test_for_run.tar, test_for_stop.tar
docker export -o test_for_run.tar ce5
docker export e81 > test_for_stop.tar
2.导入容器
- docker [container] import [-c | --change[=[]]] [=m | message[=MESSAGE]] file | URL | - [REPOSITORY[:TAG]]
例如,将 test_for_run.tar 导入到系统中:
docker import test_for_run.tar - test/ubuntu:v1.0
与docker load的区别在于:
容器快照文件将丢弃所有历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。
从容器标签导入时,可重新指定标签等元数据。
查看容器
1.查看容器详情
- docker container inspect [OPTIONS] CONTAINER [CONTAINER ...]
会以json格式返回容器ID,创建时间,路径,状态,镜像,配置等
2.查看容器内进程
- docker [container] top [OPTIONS] CONTAINER [CONTAINER ...]
显示PID,用户,时间,命令等
3.查看统计信息
- docker [container] stats [OPTIONS] [CONTAINER ...]
显示CPU,内存,存储,网络等使用情况
支持选项包括:
- -a, -all: 输出所有容器统计信息,默认仅在运行中
- -format string
- -no-stream: 不持续输出,默认会自动更新持续实时结果
- -no-trunc: 不截断输出信息
其他容器命令
1.复制文件
- docker [container] cp [OPTIONS] CONTAINER:SRC_PATH DEST_PATH | -
支持的选项包括:
- -a, -archive: 打包模式,复制文件会带有原始的uid/gid信息
- -L, -follow-link: 跟随软链接。当原路径为软链接时,默认只复制链接信息
例如,将本地路径data复制到test容器的 /temp路径下:
docker [container] cp data test:/temp/
2.查看变更
- docker [container] diff CONTAINER
3.查看端口映射
- docker container port CONTAINER [PRIVATE_PORT[/PORT]]
4.更新配置
更新容器的一些运行时配置,主要时一些资源限制份额。
- docker [container] update [OPTIONS] CONTAINER [CONTAINER ...]
支持的选项包括:
例如,限制总配额为1s,容器test所占用是时间为10%:
docker update --cpu-quota 1000000 test
docker update --cpu-period 100000 test
在生产环境中,为了提高容器的高可用性和安全性,一方面要合理使用资源限制参数来管理容器的资源消耗,另一方面,要指定合适的容器重启策略,来自动重启退出的容器。此外,还可以使用HAProxy等辅助工具来处理负载均衡,自动切换故障的应用容器。