操作docker容器
Posted cq-yangzhou
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了操作docker容器相关的知识,希望对你有一定的参考价值。
Docker容器时镜像的一个运行实例,而镜像是静态的只读文件,容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统(包括内核、应用运行的环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立运行的一个(或一组)应用,以及他们必须的运行环境。
1、创建容器
(1)、新建容器:docker create
docker create -it ubuntu:14.04
使用该命令创建的容器处于停止状态,可以使用docker start 命令来启动他。
docker start efeb322b8d67/flamboyant_meitner
(2)、新建并启动容器:docker run
docker run -it ubuntu:14.04 echo ‘hello world‘
这跟在本地直接运行echo ‘hello world‘几乎感觉不出任何区别。当利用docker run 来创建并启动容器时,Docker在后台运行的标准操作包括:
①、检查本地是否存在指定镜像,不存在就从公有仓库下载;
②、利用镜像创建一个容器,并启动改容器;
③、分配一个文件系统给容器,并在只读的镜像层外面挂载一层可读写层;
④、从宿主主机配置的网桥接口中桥接一个虚拟接口道容器中;
⑤、从网桥的地址池中配置一个IP地址给容器;
⑥、执行用户指定的应用程序;
⑦、执行完毕后容器自动终止。
下面的命令启动一个bash终端,允许用户进行交互:
其中,-t选项是让Docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。更多的命令选项可以通过man docker-run命令来查看。
在交互模式下,用户可以通过所创建的终端来输入命令。用户可以按Ctrl+d或输入exit命令来退出容器。对于所创建的bash容器,当时用exit命令退出之后,容器就自动处于退出(Exited)状态了。这是因为对docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。
某些时候,执行docker run 会报错,因为命令无法正常执行容器会直接退出,此时可以查看退出的错误代码。
①、125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;
②、126:所指定的命令无法执行,例如权限出错。
③、127:容器内命令无法找到。
命令执行后出错,会默认返回错误码。
3、守护态运行
更多的时候,需要让Docker容器在后台以守护态(Daemonized)形式运行。此时,可以通过添加-d参数来实现。
docker run -d ubuntu:14.04 /bin/sh -c "while true;do echo hello world;sleep 1 ;done"
此时,要获取容器的输出信息,可以使用docker logs命令:
docker logs 207dce165b3c
4、终止容器:docker stop
可以使用docker stop来终止一个运行中的容器。格式为:docker stop [-t|--time[=10]] [CONTAINER...]。 首先向容器发送SIGTERM信号,等待一段超时时间(默认10秒)之后,再发送SIGKILL信号来终止容器:
docker stop 207dce165b3c
注意:docker kill命令会直接发送SIGKILL信号来强行终止容器。
此外,当Docker容器中指定的应用终止时,容器也会自动终止。
补充:docker restart命令会将一个运行状态的容器先停止,然后在重新启动它:
docker restart 207dce165b3c
5、进入容器
在使用-d参数时,容器启动后会进入后台(守护状态),用户无法看到容器中的信息,也无法进行相关操作。此时可以使用docker attach或docker exec命令,或者第三方的nsenter工具等。
(1)、docker attach命令,其格式为:docker attach [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=true]] CONTAINER(容器名称或ID)
①、--detach-keys[=[]] :指定退出attach模式的快捷键序列,默认是Ctrl-p ctrl-q;
②、--no-stdin=true|false:是否关闭标准输入,默认是保存打开;
③、--sig-proxy=true|false:是否代理收到的系统信号给应用进程,默认为true。
docker attach 207dce165b3c
注意:使用attach命令并不方便,当多个窗口同时使用attach命令连到同一个容器时,所有窗口都会同步显示,当某个窗口因命令阻塞时,其他窗口也无法执行了。
(2)、docker exec命令(推荐方式)
格式:docker exec [-d | --detach] [--detach-keys[=[]]] [-i | --interactive] [--privileged] [-t | tty] [-u | --user[=USER]] CONTAINER [ARG...]。
重要参数解析:
①、-i,--interactive=true | false:打开标准输入接受用户输入命令,默认为false;
②、--privileged=true | false:是否给执行命令以最高权限,默认为false;
③、-t,--tty=true | false:分配伪终端,默认false;
④、-u,--user=" ":执行命令的用户名或ID。
例如进入某个容器中,并启动一个bash:
docker exec -it b624c19ed822 /bin/bash
6、删除容器
可以使用docker rm命令来删除处于终止或退出状态的容器,其格式为:docker rm [-f | force] [-l | --link] [-v | --volumes] CONTAINER [CONTAINER ...]。
总要参数解析:
①、-f,--force=false:是否强行终止并删除一个运行中的容器;
②、-l,--link=false:删除容器的连接,但保留容器;
③、-v,--volumes=false:删除容器挂载的数据卷。
例如删除指定的容器:
docker rm b624c19ed822
注意:默认情况下,docker rm命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器。
7、导入导出容器
有时,我们需要将容器从一个系统迁移到另一个系统,此时,可以使用docker的导入导出功能。
(1)、导出容器
导出容器是指导出一个已经创建的容器到一个文件,不管此时这个容器是否处于运行状态,都可以使用docker export命令,格式为:docker export [-o | --output[=" "]] CONTAINER。其中,-o选项用来指定导出的tar文件名,也可以直接通过重定向来实现。
docker export -o test_for_run.tar 57e6130011b5
或者
docker export 57e6130011b5 > test_for_run.tar
之后可以将导出的tar文件传输到其他机器上,然后通过导入命令导入到系统中,从而实现容器的迁移。
(2)、导入容器
导出的文件又可以使用docker import命令导入变成镜像,格式为:docker import [-c | --change[=[]]] [m | --message[=MESSAGE]] file |URL|- [REPOSITORY[:TAG]]
用户可以通过-c,--change=[] 选项在导入的同时执行对容器进行修改的Dockerfile指令。
下面将test_for_run.tar文件导入到系统中:
docker import test_for_run.tar ubuntu:1.0
或者
cat test_for_run.tar | docker import - ubuntu:1.0
区别
①、export命令导出的tar文件略小于save命令导出的 ;
②、export命令是从容器(container)中导出tar文件,而save命令则是从镜像(images)中导出;
③、基于第二点,export导出的文件再import回去时,无法保留镜像所有历史(即每一层layer信息,不熟悉的可以去看Dockerfile),不能进行回滚操作;而save是依据镜像来的,所以导入时可以完整保留下每一层layer信息。
建议
可以依据具体使用场景来选择命令
- 若是只想备份images,使用save、load即可;
- 若是在启动容器后,容器内容有变化,需要备份,则使用export、import。
以上是关于操作docker容器的主要内容,如果未能解决你的问题,请参考以下文章