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容器的更多相关文章

  1. Docker实战(二)之操作Docker容器

    容器是Docker的另外一个核心概念.简单来说,容器是镜像的一个运行实例.所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层.如果认为虚拟机是模拟运行的一整套操作系统系统(包括内核,应 ...

  2. Docker 容器学习笔记

    Docker 诞生于2013年,最初发起者是dotCloud公司.Docker自开源后受到广泛的关注和讨论,目前已有多个相关项目逐渐形成了围绕Docker容器的生态体系,由于Docker在业界造成的影 ...

  3. Docker 容器简介与部署

    关于Docker容器技术 参考文献:<docker 从入门到精通> Docker容器简介 Docker的构想是要实现 "Build,Ship and Run Any App,An ...

  4. docker容器管理-含静态Ip(10)

    docker run命令详解 docker run -t #表示分配一个伪终端 -i #表示让容器的标准输入打开,不跟这个参数容器启不来 -d #后台运行 -P #dockerfile中EXPOSE ...

  5. Docker 容器shell

    版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...

  6. Docker 容器(container)

    版权所有,未经许可,禁止转载 章节 Docker 介绍 Docker 和虚拟机的区别 Docker 安装 Docker Hub Docker 镜像(image) Docker 容器(container ...

  7. docker容器介绍

                       Docker容器 一.什么是Docker? Docker时Docker.Lnc公司开源的一个基于LXC技术之上搭建的Container容器引擎,源代码托管在Git ...

  8. Docker:镜像操作和容器操作

    镜像操作 列出镜像: $ sudo docker images REPOSITORY TAG IMAGE ID CREATED VIRTUAL SIZE hello-world latest 0a6b ...

  9. 如何启动一个已经创建的docker 容器,并进入SHELL 对其操作

    腾讯云使用自己的docker镜像安装后无法启动,下边这个亲测是可用的 sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 36A ...

随机推荐

  1. Secret Message ---- (Trie树应用)

    Secret Message   总时间限制:  2000ms  内存限制:  32768kB 描述 Bessie is leading the cows in an attempt to escap ...

  2. localhost和127.0.01 区别

    笔者最近调试程序时遇到的一个问题,localhost不能访问但127.0.0.1可以访问. 一.原理 我估计大多数人都不会去想localhost到底与127.0.0.1有什么不同,就比如我,有时候用h ...

  3. SAP MM 根据采购订单反查采购申请?

    SAP MM 根据采购订单反查采购申请? 前日微信上某同行发来一个message,说是想知道如何通过采购订单号查询到其前端的采购申请号. 笔者首先想到去检查采购订单相关的常用报表ME2L/ME2M/M ...

  4. Centos7 系统下搭建.NET Core2.0+Nginx+Supervisor+Mysql环境

    好记性不如烂笔头! 一.简介 一直以来,微软只对自家平台提供.NET支持,这样等于让这个“理论上”可以跨平台的框架在Linux和macOS上的支持只能由第三方项目提供(比如Mono .NET).直到微 ...

  5. javaweb登陆过滤器实现

    在web.xml中配置登陆过滤器: <!-- 配置登陆过滤器 --> <filter> <filter-name>loginFilter</filter-na ...

  6. mininet安装过程记录

    参考文档: http://www.brianlinkletter.com/set-up-mininet/ https://github.com/mininet/mininet/wiki/FAQ#x11 ...

  7. 微信小程序 从含有tabbar的页面跳转到不含有tabbar的页面

    如何离开含有tabbar的页面 在微信小程序开发过程中,我们会碰到从某页跳转到一个含有tabbar的页面的需求, 用 wx.navigateTo({url: '...',})  不起作用,需要使用 w ...

  8. 【Linux】阿里云ECS提示RHSA-2017:3263: curl security update(CentOS 7 更新 curl 为最新版本)

    1.前言 由于 CentOS 7 内置的 curl 和 libcurl 源为较旧的 7.29.0,不支持一些新特性且有安全性问题,所以需要更新一下. 2.开始 1.更新ca-bundle · 首先备份 ...

  9. 在java中写出完美的单例模式

    1. 前言 单例(Singleton)应该是开发者们最熟悉的设计模式了,并且好像也是最容易实现的——基本上每个开发者都能够随手写出——但是,真的是这样吗? 作为一个Java开发者,也许你觉得自己对单例 ...

  10. 简说raid1 raid2 raid5 raid6 raid10的优缺点和做各自raid需要几块硬盘

    Raid 0:一块硬盘或者以上就可做raid0优势:数据读取写入最快,最大优势提高硬盘容量,比如3快80G的硬盘做raid0 可用总容量为240G.速度是一样.缺点:无冗余能力,一块硬盘损坏,数据全无 ...