一、简介
1、容器是一种轻量级、可移植、并将应用程序进行的打包的技术,使应用程序可以在几乎任何地方以相同的方式运行
2、Docker将镜像文件运行起来后,产生的对象就是容器,容器相当于是镜像运行起来的一个实例
3、容器具备一定的生命周期
4、以借助docker ps命令查看运行的容器,如同在linux上利用ps命令查看运行着的进程那样
二、容器与虚拟机
1、容器并不是虚拟机,但它们有很多相似的地方
2、容器和虚拟机一样,都会对物理硬件资源进行共享使用
3、容器和虚拟机的生命周期比较相似(创建、运行、暂停、关闭等等)
4、容器中或虚拟机中都可以安装各种应用,如redis、mysql、nginx等,也就是说,在容器中的操作,如同在一个虚拟机(操作系统)中操作一样
5、同虚拟机一样,容器创建后,会存储在宿主机上,linux上位于/var/lib/docker/containers下
6、虚拟机的创建、启动和关闭都是基于一个完整的操作系统,一个虚拟机就是一个完整的操作系统,而容器直接运行在宿主机的内核上,其本质上以一系列进程的结合
7、容器是轻量级的,虚拟机是重量级的,首先容器不需要额外的资源来管理(不需要Hypervisor、Guest OS),虚拟机额外更多的性能消耗,其次创建、启动或关闭容器,如同创建、启动或者关闭进程那么轻松,而创建、启动、关闭一个操作系统就没那么方便了
8、也因此,意味着在给定的硬件上能运行更多数量的容器,甚至可以直接把Docker运行在虚拟机上
![]()
9、虚拟机的生命周期
![]()
10、容器的生命周期
![]()
三、容器生命周期管理
1、容器创建(docker create)
①作用:利用镜像创建出一个Created状态的待启动容器
②命令格式:docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
③命令参数(OPTIONS)
--tty(-t):分配一个伪TTY,也就是分配虚拟终端
--interactive(-i):即使没有连接,也要保持STDIN打开
--name:为容器起名,如果没有指定将会随机产生一个名称
[COMMAND]:表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
[ARG]:表示执行COMMAND时需要提供的一些参数,如ps命令的aux、ls命令的-a等等
④命令示例:docker create -ti --name test-container centos ps -A
2、容器启动(docker start)
①作用:将一个或多个处于创建状态或关闭状态的容器启动起来
②命令格式:docker start [OPTIONS] CONTAINER [CONTAINER...]
③命令参数(OPTIONS)
--attach(-a):将当前shell的STDOUT/STDERR连接到容器上
--interactive(-i):将当前shell的STDIN连接到容器上
④命令示例:docker start -a 65ebc
3、容器创建并启动(docker run)
①作用:利用镜像创建并启动一个容器
②命令格式:docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
③命令参数(OPTIONS)
--tty(-t):分配一个伪TTY,也就是分配虚拟终端
--interactive(-i):即使没有连接,也要保持STDIN打开
--name:为容器起名,如果没有指定将会随机产生一个名称
--detach(-d):在后台运行容器并打印出容器ID
--rm:当容器退出运行后,自动删除容器
[COMMAND]:表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
[ARG]:表示执行COMMAND时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
④命令示例:docker run -di centos ps -A
4docker run与docker create + docker start
①前台模式:docker run相当于docker create + docker start –a
②后台模式:docker run -d 相当于 docker create + docker start
5、容器暂停(docker pause)
①作用:暂停一个或多个处于运行状态的容器
②命令格式:docker pause CONTAINER [CONTAINER...]
③命令示例:docker ps -a => docker pause test-container2 => docker ps -a(容器变成了Pause状态)
6、容器取消暂停(docker unpause)
①作用:取消一个或多个处于暂停状态的容器,恢复运行
②命令格式:docker unpause CONTAINER [CONTAINER...]
③命令示例:docker ps -a => docker unpause test-container2 => docker ps -a(容器恢复成了运行状态)
7、容器关闭(docker stop)
①作用:关闭一个或多个处于暂停状态或者运行状态的容器
②命令格式:docker stop [OPTIONS] CONTAINER [CONTAINER...]
③命令参数(OPTIONS)
--time int(-t):关闭前,等待的时间,单位秒(默认 10s)
④命令示例:docker stop -t 3 容器id
8、容器终止(docker kill)
①作用:强制并立即关闭一个或多个处于暂停状态或者运行状态的容器
②命令格式:docker kill [OPTIONS] CONTAINER [CONTAINER...]
③命令参数(OPTIONS)
--signal string(-s):指定发送给容器的关闭信号(默认“KILL”信号)
④命令示例:docker kill test-container2
9、docker stop和docker kill的区别
①Linux其中两种终止进程的信号是:SIGTERM和SIGKILL
②SIGKILL信号:无条件终止进程信号,进程接收到该信号会立即终止,不进行清理和暂存工作,该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法
③SIGTERM信号:程序终结信号,可以由kill命令产生,与SIGKILL不同的是,SIGTERM信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等
④docker stop:会先发出SIGTERM信号给进程,告诉进程即将会被关闭。在-t指定的等待时间过了之后,将会立即发出SIGKILL信号,直接关闭容器
⑤docker kill:直接发出SIGKILL信号关闭容器,但也可以通过-s参数修改发出的信号
⑥因此会发现在docker stop的等过过程中,如果终止docker stop的执行,容器最终没有被关闭,而docker kill几乎是立刻发生,无法撤销
⑦此外还有些异常原因也会导致容器被关闭,比如docker daemon重启、容器内部进程运行发生错误等等“异常原因”
10、容器重启(docker restart)
①作用:重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器,该命令相当于stop和start命令的结合
②命令格式:docker restart [OPTIONS] CONTAINER [CONTAINER...]
③命令参数(OPTIONS)
--time int(-t):重启前,等待的时间,单位秒(默认 10s),实则是关闭前等待的时间
11、容器删除(docker container rm)
①作用:删除一个或多个容器
②命令格式:docker container rm [OPTIONS] CONTAINER [CONTAINER...] 或者 docker rm [OPTIONS] CONTAINER [CONTAINER...]
③命令参数(OPTIONS)
--force(-f):强行删除容器(会使用 SIGKILL信号)
--volumes(-v):同时删除绑定在容器上的数据卷
④命令示例:docker rm -f 容器id 容器名
四、容器信息查看
1、容器详细信息(docker container inspect)
①作用:查看本地一个或多个容器的详细信息
②命令格式:docker container inspect [OPTIONS] CONTAINER [CONTAINER...] 或者 docker inspect [OPTIONS] CONTAINER [CONTAINER...]
③命令参数(OPTIONS)
--format string(-f):利用特定golang的format格式输出结果
--size(-s):显示总大小
④命令示例:docker container inspect -f "{{json .State.Status}}" 容器id
2、容器日志信息(docker logs)
①作用:查看容器的日志信息,容器日志中记录的是容器主进程的输出STDOUT\STDERR
②命令格式:docker logs [OPTIONS] CONTAINER
③命令参数(OPTIONS)
--details:显示日志的额外信息
--follow(-f):动态跟踪显示日志信息
--since string:只显示某事时间节点之后的
--tail string:显示倒数的行数(默认全部)
--timestamps(-t):显示timestamps时间
--until string:只显示某事时间节点之前的
3、容器重命名(docker rename)
①作用:修改容器的名称
②命令格式:docker rename CONTAINER NEW_NAME
五、容器运行时操作
1、容器连接(docker attach)
①作用:将当前终端的STDIN、STDOUT、STDERR绑定到正在运行的容器的主进程上实现连接
②命令格式:docker attach [OPTIONS] CONTAINER
③命令参数(OPTIONS)
--no-stdin:不绑定STDIN
2、容器中执行新命令(docker exec)
①作用:在容器中运行一个命令
②命令格式:docker exec [OPTIONS] CONTAINER COMMAND [ARG...]
③命令参数(OPTIONS)
--detach(-d):后台运行命令
--interactive(-i):即使没连接容器,也将当前的STDIN绑定上
--tty(-t):分配一个虚拟终端
--workdir string(-w):指定在容器中的工作目录
--env list(-e):设置容器中运行时的环境变量
六、过程图示
![]()
七、容器与镜像
1、容器与镜像的关系
![]()
2、容器提交(docker commit)
①作用:根据容器生成一个新的镜像
②命令格式:docker commit [OPTIONS] CONTAINER [REPOSITORY[:TAG]]
③命令参数(OPTIONS)
--author string(-a):作者
--change list(-c):为创建的镜像加入Dockerfile命令
--message string(-m):提交信息,类似git commit -m
--pause(-p):提交时暂停容器(default true)
④命令示例
docker run --rm -dti centos bash
docker ps
docker exec -d 容器id号 yum -y install net-tools
docker commit -m 'install net-tools' 容器id号 centos-net-tools:lastest
docker images
docker history centos-net-tools
3、容器导出(docker export)
①作用:将容器当前的文件系统导出成一个tar文件
②命令格式:docker export [OPTIONS] CONTAINER
③命令参数(OPTIONS)
--output string(-o):指定写入的文件,默认是STDOUT
4、容器打包的导入(docker import)
①作用:从一个tar文件中导入内容创建一个镜像
②命令格式:docker import [OPTIONS] file|URL|- [REPOSITORY[:TAG]]
③命令参数(OPTIONS)
--change list(-c):为创建的镜像加入Dockerfile命令
--message string(-m):导入时,添加提交信息