容器是镜像的一个运行实例。不同的是,镜像是静态的只读文件,而容器是带有运行时需要的可写文件层,同时,容器中的应用进程处于运行状态。
启动容器
启动容器的方式有两种:一种是基于镜像新建一个容器并启动,另一个是将终止状态下的容器重新启动。
create新建容器和start启动
可以使用 docker [container] create [基于的镜像]
命令新建一个容器。例如:
> docker container create -it ubuntu:14.04
使用 create 创建的容器并没有启动,如果想要启动,需要使用的命令是 docker container start [容器ID或NAMES]
。
> docker container start
run新建并启动容器
run 命令等价于 create + start,可以直接通过 docker [container] run
来新建并启动容器。
> docker container run ubuntu:14.04
当使用 docker run 创建容器时,docker 在后台运行的标准操作是:
- 检查本地是否存在指定的镜像,不存在就从公有仓库下载;
- 利用镜像创建一个容器,并启动该容器;
- 分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
- 从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中去;
- 从网桥的地址池配置一个IP地址给容器;
- 执行用户指定的应用程序;
- 执行完毕后容器被自动终止。
下面的命令启动一个bash终端,允许用户进行交互:
> docker container run -it ubuntu:14.04 /bin/bash
其中,-t 选项让 Docker 分配一个伪终端(pseudo-tty)并绑定到容器的标准输入上,-i 则让容器的标准输入保持打开。更多的命令选项可以通过 man docker-run
命令来查看。
用户可以通过创建的终端来输入命令,例如:
> docker container run -it ubuntu:14.04 /bin/bash
docker create 命令和 run 命令支持的选项都十分复杂,这里通过附上选项表,在日后使用到时查询。
-d参数守护态启动
更多的时候,需要让 Docker 容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加 -d 参数来实现。
下面例子分别通过使用和不使用 -d 选项来运行容器。
> docker container run ubuntu:14.04 /bin/bash -c "while true;do echo hello world;sleep 1;done"
> docker container run -d ubuntu:14.04 /bin/bash -c "while true;do echo hello world;sleep 1;done"
不使用 -d 选项时,输出是打印到宿主机上的;如果使用了 -d 选项则没有输出,不过容器启动后会返回一个唯一的id,可以通过 docker container logs [容器ID]
来从日志中查看。
docker container logs 支持的选项有:
- -details:打印详细信息;
- -f, -follow:持续保持输出;
- -since string:输出从某个时间开始的日志;
- -tail string:输出最近的若干日志;
- -t, -timestamps:显示时间戳信息;
- -until string:输出某个时间之前的日志。
pause暂停和unpause重新运行容器
可以使用 docker [container] pause [容器ID]
命令来暂停一个运行中的容器。
处于 paused 状态的容器,可以使用 docker [container] unpause [容器ID]
来重新运行。
> docker container run --name test --rm -it ubuntu:14.04 /bin/bash
> docker container pause test
> docker container ps -a
> docker container unpause test
这里通过创建两个 shell 界面,一个用来启动容器,另一个则进行暂停和重启的操作,可以发现在 paused 状态时,我们无法在第一个 shell 界面上输入命令行,当再次启动时,则又可以输入。
stop终止容器
使用 docker [container] stop [容器ID]
来终止一个运行中的容器。
下面是一个例子,该命令会首先向容器发送 SIGTERM 信号,等待一段超时时间后(默认为10秒),再发送 SIGKILL 信号来终止容器。
> docker container stop test -t=10
attach或exec进入容器
使用 -d 选项启动的容器是后台运行的,如果用户需要进入容器进行操作,则需要进入容器。
attach命令进入
attach 是 Docker 自带的命令,格式如下:
docker [container] attach [--detach-key[=[]]] [--no-stdin] [--sig-proxy[=true]] [容器ID]
其中,支持三个主要选项:
- —detach-keys[=[]]:指定退出 attach 模式的快捷键序列,默认是 CTRL-p CTRL-q;
- —no-stdin=true|false:是否关闭标准输入,默认是保持打开;
- —sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为 true。
> docker container run --name test -dit ubuntu:14.04 /bin/bash
> docker container ps -a
> docker container attach test
exec命令进入(推荐)
从 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 container start test
> docker container exec -it test bash
:::info 推荐使用 exec 的好处:
- 使用 attach 进入容器并退出,启动的容器会终止掉;而使用 exec 进入并退出,容器并不会被终止;
- 当多个窗口同时 attach 到同一个容器时,所有窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也无法操作;而使用 exec 每个窗口都是独立的 bash,操作命令互不影响; :::
export导出和import导出容器
有时,我们需要将容器从一个系统迁移到另一个系统,这时就需要使用 docker 的导入和导出功能。
expor导出
导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态。命令格式如下:
docker [container] export [-o|--output[=""]] [容器ID]
可以通过 -o 选项来指定导出的 tar 文件名。例子如下:
> docker container export -o ubuntu.v1.tar 5f
或
> docker container export 5f > ubuntu.v1.tar
之后就可以将导出的容器快照传输到其他的机子上,再使用导入命令导入,实现容器迁移。
import导入
导出的文件又可以使用 import 命令导入变成镜像,命令格式如下:
docker [image] import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL| [REPOSITORY[:TAG]]
用户可以通过 -c, —change=[] 选项在导入的同时执行对容器进行修改的 Dockerfile 指令。
# 使用容器快照导入
> docker image import ubuntu.v1.tar test/ubuntu:v1
# 指定 URL 或者某个目录来导入
> docker import http://example.com/example.tar example/imagerepo
实际上,既可以使用 docker load 命令来导入镜像存储文件到本地镜像库,也可以使用 docker [image] import 命令来导入一个容器快照到本地镜像库。这两者的区别在于:容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
【疑惑】import 方法竟然在 image 下,而不是在 container 下?
rm删除容器和prune删除终止状态的容器
删除处于终止或退出状态的容器,其命令格式为:
docker [container] rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
命令选项包括:
- -f, —force=false:默认情况下,rm 只能删除处于终止或退出的容器;如果要强行终止并删除一个运行中的容器,则需要-f;
- -l, —link=false:删除容器的连接,但保留容器;
- -v, —volumes=false:删除容器挂载的数据卷。
同时,也可以通过执行 docker [container] prune
命令,清除掉所有处于停止状态的容器。
> docker container rm test1
> docker container prune
此外,还可以通过 docker [container] kill
直接发送 SIGKILL 信号来强行终止运行中的容器。
cp容器和主机间复制文件
可以将主机中的文件复制到容器中,命令:docker container cp [OPTIONS] [CONTAINER]
。
> docker ps -a
> ll
> docker container cp ubuntu.v1.tar musing_carver:/tmp/
> docker container exec -it musing_carver bash
root@f924cc5ef9c1:/# ls /tmp
查看容器信息的操作
下面是一些查看容器信息的操作。
docker [container] inspect [OPTIONS] [CONTAINER]
:查看容器详情;docker [container] top [OPTIONS] [CONTAINER]
:打印容器内的进程信息;docker [container] stats [OPTIONS] [CONTAINER]
:查看统计信息;docker [container] diff [CONTAINER]
:查看容器系统的变更;docker [container] port
:查看容器的端口映射情况;
# 返回内容以json形式展示,包括容器Id、创建时间、路径、状态、镜像、配置等各项信息,内容太长,下面不做展示
> docker inspect test
# 查看容器内的进程信息,包括PID、用户、时间、命令等。例如,查看某容器内的进程信息
> docker top test
# 查看容器的系统资源使用统计
> docker stats test
# 查看容器内文件系统的变更,需要有文件修改才有输出
> docker diff test
# 查看容器端口映射情况,需要有端口映射才有输出
> docker port test
update更新容器配置
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:容器退出后的重启策略。
示例如下:
> docker update --cpu-quota 10000 test
to be continue…