操作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
补充:如果是springboot项目,需要查看日志,可以使用参数-v 将容器中的日志目录挂载到宿主机中的指定目录,方便查看。
docker run --name demo(容器名称) -d -p (宿主机端口):(容器端口) -v /data/logs(宿主机目录):/usr/(容器目录,在/usr目录下面) demo(镜像名称)
此时我们便可以在/data/logs(宿主机目录)目录下面查看对应的日志,而不用每次都进入容器中查看了。
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容器的更多相关文章
- Docker实战(二)之操作Docker容器
容器是Docker的另外一个核心概念.简单来说,容器是镜像的一个运行实例.所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层.如果认为虚拟机是模拟运行的一整套操作系统系统(包括内核,应 ...
- Docker 容器学习笔记
Docker 诞生于2013年,最初发起者是dotCloud公司.Docker自开源后受到广泛的关注和讨论,目前已有多个相关项目逐渐形成了围绕Docker容器的生态体系,由于Docker在业界造成的影 ...
- Docker 容器简介与部署
关于Docker容器技术 参考文献:<docker 从入门到精通> Docker容器简介 Docker的构想是要实现 "Build,Ship and Run Any App,An ...
- docker容器管理-含静态Ip(10)
docker run命令详解 docker run -t #表示分配一个伪终端 -i #表示让容器的标准输入打开,不跟这个参数容器启不来 -d #后台运行 -P #dockerfile中EXPOSE ...
- Docker 容器shell
版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...
- Docker 容器(container)
版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...
- docker容器介绍
Docker容器 一.什么是Docker? Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Git ...
- Docker:镜像操作和容器操作
镜像操作 列出镜像: $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest 0a6b ...
- 如何启动一个已经创建的docker 容器,并进入SHELL 对其操作
腾讯云使用自己的docker镜像安装后无法启动,下边这个亲测是可用的 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A ...
随机推荐
- 【Spring】6、注解大全
一.@interface Java用 @interface Annotation{ } 定义一个注解 @Annotation,一个注解是一个类. 二.@Override,@Deprecated,@S ...
- 一个极为简单的方法实现本地(离线)yum安装rpm包
首先,我要关心的问题仍然是如何离线或者本地yum安装rpm包?这其中的关键当然是获取rpm包到本地,这其中的麻烦事是去解析依赖关系.然而,我发现一个极为简单的方法可以不用操心rpm包依赖关系,不多不少 ...
- 20190321-HTML基本结构
目录 1.HTML概念 超文本标记语言 2.HTML版本 HTML HTML5 3.HTML基本结构 基本结构 元素.标签.属性 4.HTML常用标签 内容 1.HTML概念 HTML(HyperTe ...
- Dynamics 365中的常用Associate和Disassociate消息汇总
摘要: 微软动态CRM专家罗勇 ,回复301或者20190123可方便获取本文,同时可以在第一间得到我发布的最新博文信息,follow me!我的网站是 www.luoyong.me . 因为编程时候 ...
- 华为有AI,这场转型战有点大
华为有AI,这场转型战有点大 https://mp.weixin.qq.com/s/qnUP5cgbNxXcAT82NQARtA 李根 发自 凹非寺 量子位 报道 | 公众号 QbitAI 华为有AI ...
- cesium 之核心类 Viewer 简介篇
前言 cesium 官网的api文档介绍地址cesium官网api,里面详细的介绍 cesium 各个类的介绍,还有就是在线例子:cesium 官网在线例子,这个也是学习 cesium 的好素材. 简 ...
- as无法关联git
转载请标明出处:https://www.cnblogs.com/tangZH/p/10060573.html 从gitlab上面把项目拉下来之后,用as打开,发现as无法关联git,没有git相关的菜 ...
- 对国内AR产业的预言
先丢预言,国内任何AR公司,包含几大块,医疗行业.手机制造商和自动驾驶,倘若没有能力进行系统设计,最后都要死,或者裁掉业务. AR本身不会演化为独立的业务,而是作为辅助性的工具进入传统已经存在的部门之 ...
- Python简介之探观止矣
Python是一门什么样的编程语言编程语言主要分为编译型和解释型,静态语言和动态语言,强类型和弱类型,混合语言等.编译型语言:通过编译器把源代码编译(compile)成机器语言,在经过链接(linke ...
- luajit官方性能优化指南和注解
luajit是目前最快的脚本语言之一,不过深入使用就很快会发现,要把这个语言用到像宣称那样高性能,并不是那么容易.实际使用的时候往往会发现,刚开始写的一些小test case性能非常好,经常毫秒级就算 ...