简介
通过前面的学习,相信您已经对镜像有所了解,是时候学习容器了。
容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。正如从虚拟机模板上启动VM一样,用户也同样可以从单个镜像上启动一个或多个容器。
本章带大家学习容器相关的重要操作,包括创建容器、启动容器、终止容器、进入容器后执行操作、删除容器及通过导入导出容器实现容器迁移、容器与宿主机之间数据拷贝等。
1、创建容器
1)新建容器
语法格式:
例如:
[root@qll251 ~]# docker create -it ubuntu:18.04eeb931f21f0895d055bedcbe5829634309cbc24863eee6f80b14a131559ffd21
参数说明:
- -i
保持标准输入打开,用于控制台交互
- t
分配一个tty伪终端,支持终端登录
2)启动容器
使用docker create命令新建的容器处理停止状态,可使用docker start启动它。
例如,启动刚刚创建的ubuntu容器:
[root@qll251 ~]# docker start eebeeb
eeb为刚刚创建容器的ID简写,此时通过docker ps查询容器已运行:
3)新建并启动容器
例如,使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:
[root@qll251 ~]# docker run -it ubuntu /bin/bashroot@8b18b6758bb6:/#
docker run相当于执行了两个步骤:将镜像放入容器中(docker create),然后启动容器(docker start)。
4)后台运行容器
对于刚刚所创建的容器,当用户使用exit命令退出后,容器也会自动退出,如下图所示的Exited状态。
因为对它来说,当容器的应用退出后,容器使命完成,也就没有继续运行的必要了。
因此更多时候,我们希望 Docker 容器是在后台一直运行。此时可以通过添加-d参数来实现。验证如下:
小知识点:如果不指定后台运行容器,还有其他办法退出而容器不关闭吗?按Ctrl+P+Q即可实现正常退出不关闭容器。验证如下:
2、停止容器
1)暂停容器
例如,暂停容器中所有的进程
处于paused状态的容器,可以使用docker unpause命令恢复到运行状态,如图:
2)终止容器
举例:
该命令首先向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器:
[root@qll251 ~]# docker stop 021021
3)强制终止容器
此外,还可以通过docker kill 直接发送SIGKILL信号强制终止容器。例如:
[root@qll251 ~]# docker kill 021021
4)删除所有停止状态的容器
[root@qll251 ~]# docker container pruneWARNING! This will remove all stopped containers.Are you sure you want to continue? [y/N] yTotal reclaimed space: 1.1 GB[root@qll251 ~]# docker ps -aCONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES[root@qll251 ~]#
3、进入容器
当容器在后台运行时,用户是无法操作容器的。这个时候如果需要进入容器进行操作,推荐使用exec命令,语法格式如下:
例如,进入一个容器,并启动一个bash:
[root@qll251 ~]# docker exec -it 021 /bin/bashroot@0215d56eaf7d:/#
通过指定-it参数保持标准输入打开,并且分配一个伪终端。
进入容器后,我们可以进行操作,比如创建文件和列出当前运行进程:
4、删除容器
例如,删除处于终止状态的容器:
默认情况下,docker rm命令只能删除处于终止或退出状态的容器,并不能删除处于运行状态的容器。如果要直接删除运行状态的容器,可以添加-f实现:
实际上,指定-f 参数时,Docker先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。
更多关于容器删除的方法,参考文末本章命令小结
5、导入导出容器
docker的一大优势就是可移植性,容器可以随意的进行导入导出操作。下面一起看下具体怎么操作。
1)导出容器
将容器导出到一个文件中,可以使用docker export,命令格式如下:
例如,将容器79b导出到/data/myubuntu.tar文件
[root@qll251 ~]# docker export 79b > /data/myubuntu.tar[root@qll251 ~]# ls /data/myubuntu.tar[root@qll251 ~]#
注意:不管容器是否处于运行状态,都可以将容器导出到一个文件。
2)导入容器
可以使用docker import从容器快照文件中再导入为镜像,命令格式如下:
例如,使用docker import将导出的myubuntu.tar文件导入为镜像,并且重新指定标签为qinlulu/ubuntu:v1,代码如下:
还记得上一章节,我们讲过docker load载入镜像吗?花1分钟回顾下:
两者区别
1、docker load的对象是镜像文件
2、docker import的对象是容器快照
3、用户既可以使用docker load导入镜像文件到本地镜像库,也可以使用docker import导入容器快照到本地镜像库。
4、两者的区别在于,使用容器快照文件导入的镜像将丢失所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像文件导入的镜像将保存完整记录,体积也要大。
5、此外,从容器快照文件导入镜像时,可重新指定标签等元数据信息。
6、查看容器
1)查看容器详细信息
上图返回的是一个JSON格式,包含容器ID、创建时间、路径、状态、镜像、配置等各项信息
2)查看容器内进程
这个命令类似于Linux系统中的top命令,查看容器中运行的进程信息
3)实时监控容器资源数据
docker stats命令用来返回运行中的容器的实时数据流,包括CPU、内存、存储、网络等使用信息的实时统计信息。例如:
默认情况下,stats命令会每隔1秒钟刷新一次内容,直到按下 Ctrl + c。如果不想持续监控,可以通过添加--no-stream参数 只输出当前的状态。
7、容器与宿主机之间的数据拷贝
老规矩,我们先看下官方给出的docker cp用法。
可以看懂英文吧?我要啰嗦一句了,混迹技术圈,如果学不好英语,不说被淘汰,很可能将一直是“码农”。当然,实在看不懂- -help 内容也不打紧,常用命令我都列举出来啦,例如:)
1)将宿主机上的/data目录拷贝至容器dba277的/test123目录:
如上图所示,宿主机上/data目录下所有文件已拷贝到容器中,并且目录重命名为/test123
2)将容器dba277的/test123目录拷贝到宿主机/tmp目录下
本章命令小结
1、新建容器
docker create -it ubuntu:18.04
2、启动容器
docker start “容器ID”
3、新建并启动容器
1)以交互式模式新建容器docker run -it ubuntu /bin/bash2)以后台方式运行容器docker run -itd ubuntu /bin/bash3)创建容器时指定主机名docker run -itd --name test ubuntu:18.04 /bin/bash4)容器运行5秒钟后自动删除容器docker run -it --rm ubuntu:18.04 sleep 5
4、停止容器
1)暂停容器docker pause '容器ID'2)将容器恢复到运行状态docker unpause '容器ID'3)终止容器docker stop '容器ID'4)强制终止容器docker kill '容器ID'
5、进入容器
docker exec -it "容器ID" /bin/bash
6、删除容器
1)删除处于终止状态的容器docker rm '容器ID'2)删除运行中的容器(不建议操作)docker rm -f '容器ID'3)删除所有停止状态的容器docker container prune----其实也可以使用 docker rm `docker ps -aq`删除所有未运行的容器----举一反三,那删除本地镜像库的所有镜像命令就是 docker rmi `docker images`呢(操作需谨慎!)
7、导入导出容器
1、导出容器docker export 79b > myubuntu.tar2、导入容器docker import myubuntu.tar qinlulu/ubuntu:v1
8、查看容器
1)查看容器详细信息docker inspect '容器ID'2)查看容器内进程docker top '容器ID'3)实时监控容器资源数据docker stats '容器ID'
9、容器与宿主机之间的数据拷贝
1)将宿主机上的/data目录拷贝至容器dba277的/test123目录docker cp /data dba277:/test1232)将容器dba277的/test123目录拷贝到宿主机/tmp目录下docker cp dba277:/test123 /tmp
结语
欢迎来到『开源Linux』,这里是 Linux 爱好者的聚集地。专注分享Linux/Unix相关内容(包括Linux运维、Linux系统开发、网络编程、以及虚拟化和云计算等技术干货)。风里雨里,我们在这里等您,期待与您相遇。