Docker实战(二)之操作Docker容器
容器是Docker的另外一个核心概念。简单来说,容器是镜像的一个运行实例。所不同的是,镜像是静态的只读文件,而容器带有运行时需要的可写文件层。如果认为虚拟机是模拟运行的一整套操作系统系统(包括内核,应用运行态环境和其他系统环境)和跑在上面的应用,那么Docker容器就是独立的一个或一组应用,以及它们所必需的运行环境。
1.创建容器
(1)新建容器
docker create -it ubuntu:latest
通过docker ps -a命令可以查看所有容器
使用docker create命令新建的容器处于停止状态,可以使用docker start命令启动它。
(2)启动容器
docker start CONTAINER ID(容器ID)
docker ps 命令可以查看一个运行中的容器
(3)新建并启动容器
除了创建容器后通过start命令来启动,也可以直接新建并启动所有容器。所需要的命令主要为docker run,等价于先执行docker create命令,再执行docker start命令。
下面示例:
这跟在本地直接执行/bin/echo 'hello world'几乎感觉不出任何区别。
当利用docker run来创建并启动容器时,Docker在后台运行的标准操作包括:
a.检查本地是否存在指定镜像,不存在就从公有仓库下载;
b.利用镜像创建容器,并启动该容器;
c.分配一个文件系统给容器,并在只读的镜像层外卖挂载一层可读写层;
d.从宿主主机配置的网桥接口中桥接一个虚拟接口到容器中;
e.从网桥的地址池中配置一个IP地址给容器;
f.执行用户指定的应用程序;
g.执行完毕后容器被自动停止。
下面的命令来启动一个bash终端,允许用户进行交互:
其中,-t选项让Docker分配一个伪终端并绑定到容器的标准输入上,-i则让容器的标准输入保持打开。更多的命令选项可以通过man docker-run命令来查看。
在交互模式下,用户可以通过所创建的终端来输入命令,例如:
在容器内用ps命令查看进程,可以看到只运行了bash应用,并没有运行其他无关的进程。
用户可以按Ctrl+d或输入exit命令来退出容器
对于所创建的bash容器,当使用exit命令退出之后,容器就处于退出(Exited)状态了。这是因为对Docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。这是因为对Docker容器来说,当运行的应用退出后,容器也就没有继续运行的必要了。
某些时候,执行docker run会出错,因为命令无法正常执行容器会直接退出,此时可以查看退出的错误码。
默认情况下,常见错误码如下:
125:Docker daemon执行出错,例如指定了不支持的Docker命令参数;
126:所指定命令无法执行,例如权限出错;
127:容器内命令无法找到。
命令执行后出错,会默认返回错误码。
(4)守护态运行
更多的时候,需要让Docker容器在后台以守护态形式运行。此时,可以通过添加-d参数来实现。
例如下面的命令会在后台运行容器:
容器启动后会返回一个唯一的id,也可以通过docker ps命令来查看容器信息:
docker ps
此时,要获取容器的输出信息,可以如下使用docker logs命令:
2.终止容器
可以使用docker stop来终止一个运行中的容器。该命令的格式为docker stop CONTAINER ID。
首先向容器发送SIGTERM信号,等待一段超时时间(默认为10s)后,再发送SIGKILL信号来终止容器:
docker stop 5731fbb9e432
注意:docker kill命令会直接发送SIGKILL信号来强行终止容器。
此外,当Docker容器中指定的应用终结时,容器也会自动终止。例如对于只启动了一个终端的容器,用户通过exit命令或Ctrl+d来退出终端时,所创建的容器立刻终止,处于stopped状态。
可以用docker ps -qa命令查看所有容器ID。例如:
处于终止状态的容器,可以通过docker start 命令重新启动
此外,docker restart命令会将一个运行态的容器先终止,然后再重新启动它:
docker restart 5731
3.进入容器
在使用-d参数时,容器启动后会进入后台,用户无法看到容器中的信息,也无法进行操作。
这个时候如果需要进入容器进行操作,有多种方法,包括使用官方的attach或exec命令,以及第三方的nsenter工具等。下面分别介绍一下。
(1)attach命令
attach命令是Docker自带的命令,命令格式为:
docker attatch [--detach-keys[=[]]] [--no-stdin] [--sig-proxy[=proxy[=true]] container
支持三个主要选项:
--detach -keys[=[]]:指定退出attach模式的快捷键序列,默认是CTRL-p CTRL-q;
--no-stdin=true|false:是否关闭标准输入,默认是保持打开;
--sig-proxy=true|false:是否代理收到的系统信号该应用进程,默认为true。
下面示例:
但是使用attach命令有些时候并不方便。当多个窗口同时用attach命令连接到同一个容器的时候,所有窗口都会同步显示。当某个窗口因命令阻塞时,其他窗口也无法执行操作了。
(2)exec命令
Docker从1.3.0版本起提供了一个更加方便的exec命令,可以在容器内直接执行任何命令。该命令的基本格式为:
docker exec [-d|--detach] [--detach-keys[=[]] [-i|--interactive] [--privileged] [-t|--tty] [-u|--user[=USER]] CONTAINER COMMAND [ARG...]。
比较重要的参数有:
-i, --interactive=true|false:打开标准输入接受用户输入命令,默认为false;
--privileged=true|false:是否给执行命令以高权限,默认为false;
-t,--tty=true|false:分配伪终端,默认为false;
-u,--user="":执行命令的用户名或ID。
例如进入到刚创建的容器中,并启动一个bash:
docker exec -it 5731fbb9e432 /bin/bash
可以看到,一个bash终端打开了,在不影响容器内其他应用的前提下,用户可以很容易与容器进行交互。
注意:通过指定-it参数来保持标准输入打开,并且分配一个伪终端。通过exec命令对容器执行操作是最为推荐的方式。
(3)nsenter工具
源码安装如下所示:
cd /tmp
wget https://www.kernel.org/pub/linux/utils/util-linux/v2.24/util-linux-2.24.tar.gz
tar -zxf util-linux-2.24.tar.gz
cd util-linux-2.24
./confiure --without-ncurses
make nsenter && cp nsenter /usr/local/bin/
4.删除容器
docker rm 容器ID
主要支持选项有:
-f --force=false:是否强行终止并删除一个运行中的容器;
-l, --link=false:删除容器的连接,但保留容器;
-v,--volumes=false:删除容器挂载的数据卷。
例如:查看处于终止状态的容器,并删除:
docker ps -a
docker rm aa9ee0f9359d
默认情况下,docker rm命令只能删除处于终止或退出状态的容器,并不能删除还处于运行状态的容器。
如故宫要直接删除一个运行中的容器,可以添加-f参数。Docker会先发送SIGKILL信号给容器,终止其中的应用,之后会强行删除。
不过实际生产环境中,建议尽可能不要使用docker rmi 容器ID进行强制删除,建议先停止容器,再删除容器,例如:
5.导入导出容器
某些时候,需要将容器从一个系统迁移到另外一个系统,此时可以使用Docker的导入导出功能。这也是Docker自身提供的一个重要特性。
(1)导出容器
导出容器是指导一个已经创建的容器到一个文件,不管此时这个容器是否还在运行,可以使用docker export命令,该命令格式为docker export [-o|--output[=""]] CONTAINER。其中,可以通过-o选项来指导导出的tar文件名,也可以直接通过重定向来实现。
首先查看所有的容器,如下所示:
docker export -o test_for_run.tar 6473a58a859a
之后,可将导出的tar文件传输到其他机器上,然后再通过导入命令导入到系统中,从而实现容器的迁移。
(2)导入容器
导出的文件又可以使用docker import命令导入变成镜像,该命令格式为:
docker import [-c|--change[=[]]] [-m|--message[=MESSAGE]] file|URL|-REPOSTORY[:TAG]
用户可以通过-c,--change=[]选项在导入的同时执行对容器进行修改的Dockerfile指令。
下面将导出的test_for_run.tar文件导入到系统中:
docker import test_for_run.tar - test/ubuntu:v1.0
之前使用的docker load命令来导入一个镜像文件,与docker import命令十分类似。
实际上,既可以使用docker load命令来导入镜像存储文件到本地镜像库,也可以使用docker import命令导入一个容器快照到本地镜像库。
者两者的区别在于容器快照文件将丢弃所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像存储文件将保存完整记录,体积也更大。此外,从容器快照文件导入时可以重新指定标签等元数据信息。
Docker实战(二)之操作Docker容器的更多相关文章
- Docker 系列二(操作镜像).
一.镜像管理 1.拉取镜像 docker pull [选项] [Docker Registry 地址[:端口号]/]仓库名[:标签] -- Docker 镜像仓库地址 :一般是 域名或者IP[:端口号 ...
- Docker实战之创建一个tomcat容器
一.Docker与虚拟机的区别 二.Docker学习步骤 2.1:安装宿主操作系统 在VMVare中安装了Ubuntu 16.04.2 LTS (GNU/Linux 4.4.0-62-generic ...
- docker(二)部署docker容器虚拟化平台
yum安装方法参考:https://www.cnblogs.com/yufeng218/p/8370670.html https://www.cnblogs.com/straycats/p/84112 ...
- Docker实战(一)之使用Docker镜像
镜像是Docker三大核心概念中最为重要的,自Docker诞生之日起“镜像”就是相关社区最为热门的关键字. Docker运行容器前需要本地存在对应的镜像,如果镜像没有保存至本地,Docker会尝试先从 ...
- 深入浅出Docker(二):Docker命令行探秘
1. Docker命令行 Docker官方为了让用户快速了解Docker,提供了一个交互式教程,旨在帮助用户掌握Docker命令行的使用方法.但是由于Docker技术的快速发展,此交互式教程已经无法满 ...
- Docker(二):Docker镜像使用
1.Docker Image介绍 简单来说,Docker Image是用来启动容器的只读模板. Docker Image被划分了三个部分:Remote-dockerhub.com/namespace/ ...
- Docker(二):理解容器编排工具Kubernetes内部工作原理
一.Kubernetes是什么 要说到Docker就不得不说说Kubernetes.当Docker容器在微服务的环境下数量一多,那么统一的,自动化的管理自然少不了.而Kubernetes就是一个这样的 ...
- docker 实践二:操作镜像
本篇我们来详细介绍 docker 镜像的操作. 注:环境为 CentOS7,docker 19.03 之前已经说过,容器是 docker 的核心概念之一,所以对应的就需要知道它的使用方法,接下来我们就 ...
- Docker(39)- docker 实战二之安装 Tomcat
背景 参考了狂神老师的 Docker 教程,非常棒! https://www.bilibili.com/video/BV1og4y1q7M4?p=15 直接运行容器 本地找不到镜像会自动下载 --rm ...
随机推荐
- SSM(一):spring-ioc
一.java代理模式 java代理模式是ioc的前置知识.代理模式非常简单,看代码就一目了然了. public interface role { public void makeMoney(); } ...
- EF CodeFirst(四) 关系
数据库表之间有一对一 一对多 多对多关系.那同样,CodeFirst也要能分析这些类之间的这些关系. CodeFirst可以自动通过分析类之间的属性导航属性 从而得出类之间的关系,自动确定外键. 一 ...
- 函数表达式(JavaScript高程笔记)
函数声明 特点:函数声明提升(执行代码之前解析器会先读取函数声明,并使其在执行任何代码之前可用,意味着可以把函数声明放在调用语句之后) function functionName(arg0,arg1) ...
- 集合框架四(Map)
Map的主要实现类: --HashMap:Map的主要实现类(掌握) --LinkedHashMap:使用链表维护添加进Map中的顺序,遍历时按添加时的顺序遍历 --TreeMap:按照添加进Map中 ...
- JS 创建自定义对象的方式方法
一.概述 还记得刚开始做项目的时候,看到别人封装的js工具类百思不得其解,看来看去看不懂,深挖一下,其实就是自己没有耐下心去看,但是遇到问题不解决,总会遇到的,今天还是遇到了,就去找了找帖子,重新思考 ...
- python 递归和二分法
一 内置函数 1. revserd 翻转,返回的是迭代器 # 将 s 倒置 s = '不是上海自来水来自海上' # 方法一 print(s[::-1]) # 方法二 s1 = reversed(s) ...
- Docker在windows7上的安装
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化.容器是完全使用沙箱机制,相互之间不会有任何 ...
- HBuilder开发iPad程序不能全屏显示的解决方法
HBuilder开发iPad程序不能全屏显示的解决方法: targets选择HBuilder=>Deployment Info=> devices选择Universal即可
- mongodb2.X添加权限
1.连接mongodb数据库(如果mongo命令没有做环境变量配置,需要定位到有mongo命令的目录) root@AY140709212620347s22Z:~# mongo MongoDB shel ...
- sklearn——数据集调用及应用
忙了许久,总算是又想起这边还没写完呢. 那今天就写写sklearn库的一部分简单内容吧,包括数据集调用,聚类,轮廓系数等等. 自带数据集API 数据集函数 中文翻译 任务类型 数据规模 load_ ...