容器是Docker的核心概念。容器是镜像的运行实例,所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。
创建容器
- 新建容器
$ docker create -it ubuntu:latest
700fc62c3c6f388dd22e5761c87e4ba639c2f74dde7740fa61c71448b2ea0db1
$ docker ps -a | grep 'ubuntu'
700fc62c3c6f ubuntu:14.04 "/bin/bash" 45 seconds ago Created sharp_sutherland
使用docker create
命令新建的容器处于停止状态,可以使用docker start
命令来启动它。
- 启动容器
$ docker start 700fc62c3c6f
700fc62c3c6f
此时,通过docker ps
命令可以查看一个运行中的容器
- 新建并启动容器
除了创建容器后通过docker start
命令来启动,也可以直接新建并启动容器。所需要的命令为docker run
,等价于先执行docker create
,在执行docker start
。
$ docker run ubuntu:14.04 /bin/echo 'Hello World'
Hello World
当利用docker run
来创建并启动容器时,Docker在后台运行的标准操作包括:
- 检查本地是否存在指定的镜像,不存在就从共有仓库下载;
- 利用镜像创建一个容器,并启动该容器;
- 分配一个文件系统给容器,并在制度的镜像层外面过早一层可读写层;
- 从宿主机配置的网桥接口中桥接一个虚拟接口到容器中;
- 从网桥的地址池配置一个IP地址给容器;
- 执行用户指定的应用程序;
- 执行完毕后容器被自动终止。
- 交互式运行
$ docker run -it ubuntu:14.04 /bin/bash
root@137847304fd5:/#
其中,-t
选项让Docker分配一个伪终端(pseudo-tty)并绑定到容器的标志输入上,-i
则让容器的标准输入保持打开。
可以按control+d
或输入exit
命令来退出容器。
- 后台运行
更多的时候,需要让Docker容器在后台以守护态形式运行。此时,可以通过-d
参数来实现。
$ docker run -d ubuntu:14.04 /bin/sh -c "while true; do echo Hello World; sleep 1; done"
e9459f50630192f94f0dbb5bf2c4ad1a8db2eff21ca10996aefb474148b336b1
终止容器
$ docker stop 700fc62c3c6f
700fc62c3c6f
首先向容器发送SIGTERM
信号,等待一段超时时间(默认为10秒)后,再发送SIGKILL
信号来终止容器。
注意:docker kill 命令会直接发送 SIGKILL 信号来强制终止容器。
$ sudo docker ps -a|grep 'ubuntu'
700fc62c3c6f ubuntu:14.04 "/bin/bash" 25 minutes ago Exited (0) 3 seconds ago sharp_sutherland
进入容器
在使用-d
参数时,容器启动会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的attach
或exec
命令,以及第三方的nsenter
工具等。下面分别介绍一下:
- attach命令
attach
是Docker自带的命令,命令格式为:
docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER
支持三个主要选项:
- --detach-keys[=[]]:指定退出attach模式的快捷键序列,默认是control+p或control+q;
- --no-stdin=true|false:是否关闭标准输入,默认是保持打开;
- --sig-proxy=true|false:是否代理收到的系统信号给应用程序,默认是true。
但是,实验attach
命令有时候并不太方便。当多个窗口同时使用attach
命令连到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其它窗口也无法执行操作了。
docker attach 命令适用于查看容器标准输出。
- exec命令
Docker从1.3.0版本起提供了一个更加方便的exec
命令,可以在容器内直接执行任意命令。该命令的基本格式为:
docker exec [-d|--detach] [--detach-keys[=[]]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARGS...]
比较重要的参数有:
- -i, --interactive=true|false:打开标准输入接受用户输入命令,默认为false;
- --privileged=true|false:是否给执行命令以高权限,默认为false;
- -t, --tty=true|false:分配伪终端,默认为false;
- -u, --user="":执行命令的用户名或ID。
$ docker exec -it fde815ede391 /bin/bash
root@fde815ede391:/#
通过exec命令对容器执行操作是最为推荐的方式。
- nsenter工具
为了适应nsenter连接到容器,还需要找到容器进行的PID,可以通过下面的命令获取:
$ PID=`docker inspect --format "{{.State.Pid}}" fde815ede391`
通过这个PID,就可以连接到这个容器:
$ nsenter --target $PID --mount --uts --ipc --net --pid
[root@103-18-41-sh-100-D10 /]# ls
删除容器
可以使用docker rm 命令来删除处于终止或退出状态的容器,命令格式为:
docker rm [-f|--force] [-l|--link] [-v|--volumes] CONTAINER [CONTAINER...]
主要支持的选项包括:
- -f, --force=false:是否强制终止容器并删除一个运行中的容器;
- -l, --link-false:删除容器的连接,但保留容器;
- -v, --volumes=false:删除容器挂载的数据卷。
如果删除一个正在运行中的容器,会抛出如下错误信息:
$ docker rm fde815ede391
Error response from daemon: You cannot remove a running container fde815ede3919b8749d7c131c430f41657a2f5c173a8bf9dc3c6e9623ab2875b.
Stop the container before attempting removal or force remove
导入和导出容器
某些时候,需要将容器从一个系统迁移到另一个系统,此时可以通过Docker的导入和导出功能。
1.导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时容器是否处于运行状态,命令格式为:
docker export [-o|--output[=""]] CONTAINER
其中,-o选项指定了导出的tar文件名,也可以直接通过重定向来实现。
$ docker export -o test_for_run.tar fde815ede391
- 导入容器
导出的文件又可以通过docker import
命令导入变成镜像,命令格式为:
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-[REPOSITORY[:TAG]]
用户可以通过-c, --change=[]选项在导入到同时执行对容器进行修改的Dockerfile指令。
$ docker import test_for_run.tar test/ubuntu:v1.0
sha256:2f62da8d0bc4e94e18ebf28e345569bae61a875beb6ee1411aeca5d001b4f981
$ docker images|grep 'ubuntu'
test/ubuntu v1.0 2f62da8d0bc4 29 seconds ago 175MB
docker export
命令生成的镜像会丢弃所有的历史记录和元数据信息(仅保留容器当时的快照状态),而docker save
将保留完整记录,体积也更大。
网友评论