简介

通过前面的学习,相信您已经对镜像有所了解,是时候学习容器了。

容器是Docker的另一个核心概念。简单来说,容器是镜像的一个运行实例。正如从虚拟机模板上启动VM一样,用户也同样可以从单个镜像上启动一个或多个容器。

本章带大家学习容器相关的重要操作,包括创建容器启动容器终止容器进入容器后执行操作删除容器及通过导入导出容器实现容器迁移容器与宿主机之间数据拷贝等。

1、创建容器

1、新建容器

语法格式:



docker 导入tar 镜像 docker导入容器_docker 导入tar 镜像

docker create 语法

例如:

[root@qll251 ~]# docker create -it ubuntu:18.04
eeb931f21f0895d055bedcbe5829634309cbc24863eee6f80b14a131559ffd21

[root@qll251 ~]# docker create -it ubuntu:18.04
eeb931f21f0895d055bedcbe5829634309cbc24863eee6f80b14a131559ffd21

参数说明:

  • -i

保持标准输入打开,用于控制台交互

  • t

分配一个tty伪终端,支持终端登录

2、启动容器

使用docker create命令新建的容器处理停止状态,可使用docker start启动它。

例如,启动刚刚创建的ubuntu容器:

[root@qll251 ~]# docker start eeb
eeb

[root@qll251 ~]# docker start eeb
eeb

eeb为刚刚创建容器的ID简写,此时通过docker ps查询容器已运行:



docker 导入tar 镜像 docker导入容器_ubuntu_02

3、新建并启动容器



docker 导入tar 镜像 docker导入容器_docker_03

docker run 语法

例如,使用 ubuntu 镜像启动一个容器,参数为以命令行模式进入该容器:

[root@qll251 ~]# docker run -it ubuntu /bin/bash
root@8b18b6758bb6:/#

[root@qll251 ~]# docker run -it ubuntu /bin/bash
root@8b18b6758bb6:/#

docker run相当于执行了两个步骤:将镜像放入容器中(docker create),然后启动容器(docker start)。

4、后台运行容器

对于刚刚所创建的容器,当用户使用exit命令退出后,容器也会自动退出,如下图所示的Exited状态。



docker 导入tar 镜像 docker导入容器_docker 导入tar 镜像_04

Exited状态

因为对它来说,当容器的应用退出后,容器使命完成,也就没有继续运行的必要了。

因此更多时候,我们希望 Docker 容器是在后台一直运行。此时可以通过添加-d参数来实现。验证如下:



docker 导入tar 镜像 docker导入容器_bash_05

添加 -d 参数实现容器后台运行

小知识点:如果不指定后台运行容器,还有其他办法退出而容器不关闭吗?按Ctrl+P+Q即可实现正常退出不关闭容器。验证如下:



docker 导入tar 镜像 docker导入容器_docker_06

2、停止容器

1、暂停容器



docker 导入tar 镜像 docker导入容器_ubuntu_07

docker pause 语法

例如,暂停容器中所有的进程



docker 导入tar 镜像 docker导入容器_docker 导入tar 镜像_08

处于paused状态的容器,可以使用docker unpause命令恢复到运行状态,如图:



docker 导入tar 镜像 docker导入容器_ubuntu_09

docker unpause 命令

2、终止容器



docker 导入tar 镜像 docker导入容器_docker镜像导出与导入_10

docker stop 语法

举例:

该命令首先向容器发送SIGTERM信号,等待一段超时时间后(默认为10秒),再发送SIGKILL信号来终止容器:

[root@qll251 ~]# docker stop 021
021

[root@qll251 ~]# docker stop 021
021

3、强制终止容器

此外,还可以通过docker kill 直接发送SIGKILL信号强制终止容器。例如:

[root@qll251 ~]# docker kill 021
021

 [root@qll251 ~]# docker kill 021
021

4、删除所有停止状态的容器

[root@qll251 ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 1.1 GB
[root@qll251 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@qll251 ~]#

[root@qll251 ~]# docker container prune
WARNING! This will remove all stopped containers.
Are you sure you want to continue? [y/N] y
Total reclaimed space: 1.1 GB
[root@qll251 ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
[root@qll251 ~]#

3、进入容器

当容器在后台运行时,用户是无法操作容器的。这个时候如果需要进入容器进行操作,推荐使用exec命令,语法格式如下:



docker 导入tar 镜像 docker导入容器_docker_11

docker exec 语法

例如,进入一个容器,并启动一个bash:

[root@qll251 ~]# docker exec -it 021 /bin/bash
root@0215d56eaf7d:/#

[root@qll251 ~]# docker exec -it 021 /bin/bash
root@0215d56eaf7d:/#

通过指定-it参数保持标准输入打开,并且分配一个伪终端。

进入容器后,我们可以进行操作,比如创建文件和列出当前运行进程:



docker 导入tar 镜像 docker导入容器_docker_12

操作容器

4、删除容器



docker 导入tar 镜像 docker导入容器_docker 导入tar 镜像_13

docker rm 语法

例如,删除处于终止状态的容器:



docker 导入tar 镜像 docker导入容器_docker 导入tar 镜像_14

默认情况下,docker rm命令只能删除处于终止或退出状态的容器,并不能删除处于运行状态的容器。如果要直接删除运行状态的容器,可以添加-f实现:



docker 导入tar 镜像 docker导入容器_docker 导入tar 镜像_15

实际上,指定-f 参数时,Docker先发送SIGKILL信号给容器,终止其中的应用,之后强行删除。

更多关于容器删除的方法,参考文末本章命令小结

5、导入导出容器

docker的一大优势就是可移植性,容器可以随意的进行导入导出操作。下面一起看下具体怎么操作。

1、导出容器

将容器导出到一个文件中,可以使用docker export,命令格式如下:



docker 导入tar 镜像 docker导入容器_bash_16

docker export 语法

例如,将容器79b导出到/data/myubuntu.tar文件

[root@qll251 ~]# docker export 79b > /data/myubuntu.tar
[root@qll251 ~]# ls /data/
myubuntu.tar
[root@qll251 ~]#

[root@qll251 ~]# docker export 79b > /data/myubuntu.tar
[root@qll251 ~]# ls /data/
myubuntu.tar
[root@qll251 ~]#

注意:不管容器是否处于运行状态,都可以将容器导出到一个文件。

2、导入容器

可以使用docker import从容器快照文件中再导入为镜像,命令格式如下:



docker 导入tar 镜像 docker导入容器_docker_17

docker import 语法

例如,使用docker import将导出的myubuntu.tar文件导入为镜像,并且重新指定标签为qinlulu/ubuntu:v1,代码如下:



docker 导入tar 镜像 docker导入容器_docker 导入tar 镜像_18

还记得上一章节,我们讲过docker load载入镜像吗?花1分钟回顾下:


docker 导入tar 镜像 docker导入容器_docker 导入tar 镜像_19


两者区别

1、docker load的对象是镜像文件

2、docker import的对象是容器快照

3、用户既可以使用docker load导入镜像文件到本地镜像库,也可以使用docker import导入容器快照到本地镜像库。

4、两者的区别在于,使用容器快照文件导入的镜像将丢失所有的历史记录和元数据信息(即仅保存容器当时的快照状态),而镜像文件导入的镜像将保存完整记录,体积也要大。

5、此外,从容器快照文件导入镜像时,可重新指定标签等元数据信息。


6、查看容器

1、查看容器详细信息



docker 导入tar 镜像 docker导入容器_ubuntu_20

docker inspect

上图返回的是一个JSON格式,包含容器ID、创建时间、路径、状态、镜像、配置等各项信息

2、查看容器内进程



docker 导入tar 镜像 docker导入容器_ubuntu_21

docker top

这个命令类似于Linux系统中的top命令,查看容器中运行的进程信息

3、实时监控容器资源数据

docker stats命令用来返回运行中的容器的实时数据流,包括CPU、内存、存储、网络等使用信息的实时统计信息。例如:



docker 导入tar 镜像 docker导入容器_bash_22

docker stats

默认情况下,stats命令会每隔1秒钟刷新一次内容,直到按下 Ctrl + c。如果不想持续监控,可以通过添加--no-stream参数 只输出当前的状态。

7、容器与宿主机之间的数据拷贝

老规矩,我们先下看官方给出的docker cp用法。



docker 导入tar 镜像 docker导入容器_docker 导入tar 镜像_23

docker cp 语法

可以看懂英文吧?我要啰嗦一句了,混迹技术圈,如果学不好英语,不说被淘汰,很可能将一直是“码农”。当然,实在看不懂- -help 内容也不打紧,常用命令我都列举出来啦,例如:)

1、将宿主机上的/data目录拷贝至容器dba277的/test123目录:



docker 导入tar 镜像 docker导入容器_docker_24

如上图所示,宿主机上/data目录下所有文件已拷贝到容器中,并且目录重命名为/test123

2、将容器dba277的/test123目录拷贝到宿主机/tmp目录下



docker 导入tar 镜像 docker导入容器_bash_25

本章命令小结

1、新建容器

docker create -it ubuntu:18.04

2、启动容器

docker start “容器ID”

3、新建并启动容器
1、以交互式模式新建容器
docker run -it ubuntu /bin/bash

2、以后台方式运行容器
docker run -itd ubuntu /bin/bash

3、创建容器时指定主机名
docker run -itd --name test ubuntu:18.04 /bin/bash

4、容器运行5秒钟后自动删除容器
docker run -it --rm ubuntu:18.04 sleep 5


1、以交互式模式新建容器
docker run -it ubuntu /bin/bash

2、以后台方式运行容器
docker run -itd ubuntu /bin/bash

3、创建容器时指定主机名
docker run -itd --name test ubuntu:18.04 /bin/bash

4、容器运行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'

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`呢(操作需谨慎!)

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.tar

2、导入容器
docker import myubuntu.tar qinlulu/ubuntu:v1

1、导出容器
docker export 79b > myubuntu.tar

2、导入容器
docker import myubuntu.tar qinlulu/ubuntu:v1
8、查看容器
1、查看容器详细信息
docker inspect '容器ID'

2、查看容器内进程
docker top '容器ID'

3、实时监控容器资源数据
docker stats '容器ID'

1、查看容器详细信息
docker inspect '容器ID'

2、查看容器内进程
docker top '容器ID'

3、实时监控容器资源数据
docker stats '容器ID'
9、容器与宿主机之间的数据拷贝
1、将宿主机上的/data目录拷贝至容器dba277的/test123目录
docker cp /data dba277:/test123

2、将容器dba277的/test123目录拷贝到宿主机/tmp目录下
docker cp dba277:/test123 /tmp

1、将宿主机上的/data目录拷贝至容器dba277的/test123目录
docker cp /data dba277:/test123

2、将容器dba277的/test123目录拷贝到宿主机/tmp目录下
docker cp dba277:/test123 /tmp

结语


docker 导入tar 镜像 docker导入容器_bash_26