围绕容器的重要操作,包括创建一个容器、启动容器、终止一个容器、进入容器内执行操作、删除容器和通过导入导出容器来实现容器迁移等。
操作 Docker 容器
容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及它们必需的运行环境。
1. 新建容器
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
例子:
$ docker create -it ubuntu:latest
af8f4f922dafee22c8fe6cd2ae11d16e25087d61f1b1fa55b36e94db7ef45178
$ docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
af8f4f922daf ubuntu:latest "/bin/bash" 17 seconds ago Created silly_euler
使用docker create 命令新建的容器处于停止状态,可以使用docker start命令来启动它。
Create命令和后续的run命令支持的选项都十分复杂,主要包括如下几大类:与容器运行模式相关、与容器和环境配置相关、与容器资源限制和安全保护相关。
具体详情可以通过命令 docker create --help
获得。
2. 启动容器
docker start [OPTIONS] CONTAINER [CONTAINER...]
3. 新建并启动容器
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:
·检查本地是否存在指定的镜像,不存在就从公有仓库下载;
·利用镜像创建一个容器,并启动该容器;
·分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
·从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
·从网桥的地址池配置一个IP地址给容器;
·执行用户指定的应用程序;
·执行完毕后容器被自动终止。
对于所创建的bash容器,当使用exit命令退出之后,容器就自动处于退出(Exited)状态了。这是因为对Docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。
某些时候,执行docker run会出错,因为命令无法正常执行容器会直接退出,此时可以查看退出的错误代码。
默认情况下,常见错误代码包括: ·125:Docker daemon执行出错,例如指定了不支持的Docker命令参数; ·126:所指定命令无法执行,例如权限出错; ·127:容器内命令无法找到。
命令执行后出错,会默认返回错误码。
4. 守护态运行
让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。
$ docker run -d ubuntu /bin/sh \
-c "while true; do echo hello world; sleep 1; done"
ce554267d7a4c34eefc92c5517051dc37b918b588736d0823e4c846596b04d83
终止容器
docker stop [OPTIONS] CONTAINER [CONTAINER...]
首先向容器发送SIGTERM信号,等待一段超时时间(默认为10秒)后,再发送SIGKILL信号来终止容器
注意:docker kill命令会直接发送SIGKILL信号来强行终止容器。 此外,当Docker容器中指定的应用终结时,容器也会自动终止。例如对于上一节中只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。
进入容器
1. attach 命令
docker attach [OPTIONS] CONTAINER
支持三个主要选项:
--detach-keys[=[]]
指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q
--no-stdin=true|false
是否关闭标准输入,默认是保持打开
--sig-proxy=true|false
是否代理收到的系统信号给应用进程,默认为true
但是使用attach命令有时候并不方便。当多个窗口同时用attach命令连到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
2. exec 命令
docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
-i,--interactive=true|false
打开标准输入接受用户输入命令,默认为false
--privileged=true|false
是否给执行命令以高权限,默认为false
-t,--tty=true|false
分配伪终端,默认为false
-u,--user=""
执行命令的用户名或ID
通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。
删除容器
docker rm [OPTIONS] CONTAINER [CONTAINER...]
主要支持的选项包括:
-f,--force=false
是否强行终止并删除一个运行中的容器
-l,--link=false
删除容器的连接,但保留容器
-v,--volumes=false
删除容器挂载的数据卷
默认情况下,docker rm命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器。
如果要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。
导入和导出容器
1. 导出容器
docker export [OPTIONS] CONTAINER
例子:
$ docker export -o test_for_run.tar ce5
$ ls
test_for_run.tar
$ docker export e81 >test_for_stop.tar
$ ls
test_for_run.tar test_for_stop.tar
2.导入容器
docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
用户可以通过-c,–change=[]选项在导入的同时执行对容器进行修改的Dockerfile指令
$ docker import test_for_run.tar - test/ubuntu:v1.0
$ docker images
REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE
test/ubuntu v1.0 9d37a6082e97 About a minute ago 171.3 MB