在 Docker 镜像篇中,我们了解到 Docker 镜像类似于模板,那么 Docker 容器就相当于从模板复制过来运行时的实例,Docker 容器可以被创建、复制、暂停和删除等。 每一个 Docker 容器在运行时都是以镜像为基础层,并在镜像的基础上创建当前容器的存储层,容器存储层的生存周期与容器是一致的,因此当某一个容器删除后,该容器存储层的数据也会随之被删除掉。 按照 Docker 最佳实践的要求,Docker 容器是不应该向其存储层内写入数据的,Docker 容器存储层需保持无状态话。Docker 容器中的所有文件写入操作都应该使用数据卷或绑定到宿主机目录上,在这些位置的读写操作会跳过容器存储层,性能和稳定性也会更高 本篇内容主要介绍:关于 Docker 容器、Docker 命令应用实践
在 Docker 镜像篇中,我们了解到 Docker 镜像类似于模板,那么 Docker 容器就相当于从模板复制过来运行时的实例,Docker 容器可以被创建、复制、暂停和删除等。
每一个 Docker 容器在运行时都是以镜像为基础层,并在镜像的基础上创建当前容器的存储层,容器存储层的生存周期与容器是一致的,因此当某一个容器删除后,该容器存储层的数据也会随之被删除掉。
按照 Docker 最佳实践的要求,Docker 容器是不应该向其存储层内写入数据的,Docker 容器存储层需保持无状态话。Docker 容器中的所有文件写入操作都应该使用数据卷或绑定到宿主机目录上,在这些位置的读写操作会跳过容器存储层,性能和稳定性也会更高
虚拟机(VM)是物理硬件的抽象,它将一台服务器变成很多服务器。 虚拟机管理程序允许多个 VM 在单台计算机上运行。 每个 VM 均包含操作系统,应用程序以及必要的二进制文件和库的完整副本-占用数十 GB。 VM也 可能启动缓慢。
容器是应用程序层的抽象,将代码和依赖项打包在一起。 多个容器可以在同一台计算机上运行,并与其他容器共享其 OS 内核,每个容器在用户空间中作为隔离的进程运行。 容器占用的空间少于VM(容器映像的大小通常为几十 MB),可以处理更多的应用程序,并且需要的 VM 和操作系统更少。
虚拟化 vs 容器化:
对于一个 Docker 容器可以具有以下状态:
# 查看机器上正在运行的所有容器
docker ps
# 查看宿主机上所有的容器(包括停止的)
docker ps -a
# 查看最后一次运行的容器
docker ps –l
# 查看停止的容器
docker ps -f status=exited
# 作用:
利用镜像创建出一个Created 状态的待启动容器
# 命令格式:
docker create [OPTIONS] IMAGE [COMMAND] [ARG...]
# 命令参数(OPTIONS):查看更多
-t, --tty 分配一个伪TTY,也就是分配虚拟终端bash
-i, --interactive 以交互模式运行容器,加入-t-i这两个参数,容器启动后会直接进入容器。分配一个伪终端
--name 为容器起名,如果没有指定将会随机产生一个名称
# 命令参数(COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
# 命令演示:
# ps -A 提前预设一个命令,容器一启动就会执行
# 当容器启动-->执行ps -A,命令一执行完,容器就停止了,因为它不是可以夯住的命令
docker create --name test-container centos ps -A
docker create -ti --name test-container2 centos /bin/bash
# 我们拉的centous镜像是纯净版,里面没有sshd服务端,如果启了一个centos7的容器,宿主机不能直接用ssh连接容器(进到容器做交互)
# 要么装一个sshd服务端,要么下载第三方集成了sshd服务端的镜像。
# 这里用的-t,并不是真正的进到容器,只是分配一个伪终端,相当于启一个bash窗口,和宿主机做交互
# 作用:
将一个或多个处于创建状态或关闭状态的容器启动起来
# 命令格式:
docker start [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-a, --attach 将当前shell的 STDOUT/STDERR 连接到容器上
-i, --interactive 将当前shell的 STDIN连接到容器上
# 命令演示:
docker ps -a
docker start -a 65ebc
docker start test-container2
# 作用:
利用镜像创建并启动一个容器
# 命令格式:
docker run [OPTIONS] IMAGE [COMMAND] [ARG...]
# 命令参数(OPTIONS):查看更多
-t, --tty 分配一个伪TTY,也就是分配虚拟终端,表示容器启动后会进入其命令行
-i, --interactive 以交互模式运行容器,加入-t-i这两个参数,容器启动后会直接进入容器。分配一个伪终端
--name 为容器起名,如果没有指定将会随机产生一个名称
-d, --detach 创建一个守护进程在后台运行容器并打印出容器ID,不会自动登录容器,如果只加-i -t两个参数,创建后就会自动进入容器
--rm 当容器退出运行后,自动删除容器
# 命令参数(COMMAND\ARG):
COMMAND 表示容器启动后,需要在容器中执行的命令,如ps、ls 等命令
ARG 表示执行 COMMAND 时需要提供的一些参数,如ps 命令的 aux、ls命令的-a等等
# 命令演示:
# 注意,docker run 镜像, 如果本地没有该镜像,会先pull最新版镜像,再执行docker run
docker run --name test1 centos:centos7 # 创建并启动test1,启动后容器就停止了
docker run --name test2 centos:centos7 /bin/bash # 创建并启动test2,启动后容器就停止了
docker run -ti --name test3 centos:centos7 # 创建并启动test3,启动后运行/bin/bash交互(根路径下),exit退出后,容器就停止了
docker run -ti --name test4 centos:centos7 /bin/bash # 创建并启动test4,启动后运行/bin/bash交互(根路径下),exit退出后,容器就停止了
docker run -ti --name test5 redis # 创建并启动test5,启动后进入到redis前端,exit退出后,容器就停止了
docker run -ti --name test6 redis /bin/bash # 创建并启动test6,启动后运行/bin/bash交互(/data路径下),exit退出后,容器就停止了
docker run -d --name t1 centos:centos7 # 创建并启动t1,启动后容器就停止了
docker run -di --name t2 centos:centos7 # 创建并启动t2,启动后容器维持后台运行
docker run -d --name t3 redis # 创建并启动t3,启动后容器维持后台运行
docker run -dti --name t4 redis # 创建并启动t4,启动后容器维持后台运行
docker run 相当于 docker create + docker start –a 前台模式
docker run -d 相当于 docker create + docker start 后台模式
# 作用:
暂停一个或多个处于运行状态的容器
# 命令格式:
docker pause CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
无
# 命令演示
docker ps -a
docker pause test-container2
docker ps -a # 容器是Pause状态
# 作用:
取消一个或多个处于暂停状态的容器,恢复运行
# 命令格式:
docker unpause CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
无
# 命令演示:
docker unpause test-container2
docker ps -a # 处于运行状态
# 作用:
关闭一个或多个处于暂停状态或者运行状态的容器
# 命令格式:
docker stop [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-t, --time int 关闭前,等待的时间,单位秒(默认 10s)
# 命令演示:
docker stop -t 1 容器id
# 作用:
强制并立即关闭一个或多个处于暂停状态或者运行状态的容器
# 命令格式:
docker kill [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-s, --signal string 指定发送给容器的关闭信号 (默认“KILL”信号)
# 命令演示:
docker kill test-container2
# 一 前提知识点:
1 Linux其中两种终止进程的信号是:SIGTERM和SIGKILL
2 SIGKILL信号:无条件终止进程信号。
进程接收到该信号会立即终止,不进行清理和暂存工作。
该信号不能被忽略、处理和阻塞,它向系统管理员提供了可以杀死任何进程的方法。
3 SIGTERM信号:程序终结信号,可以由kill命令产生。
与SIGKILL不同的是,SIGTERM信号可以被阻塞和终止,以便程序在退出前可以保存工作或清理临时文件等。
# 二 docker stop 会先发出SIGTERM信号给进程,告诉进程即将会被关闭。在-t指定的等待时间过了之后,将会立即发出SIGKILL信号,直接关闭容器。
# 三 docker kill 直接发出SIGKILL信号关闭容器。但也可以通过-s参数修改发出的信号。
# 四 因此会发现在docker stop的等过过程中,如果终止docker stop的执行,容器最终没有被关闭。而docker kill几乎是立刻发生,无法撤销。
# 五 此外还有些异常原因也会导致容器被关闭,比如docker daemon重启、容器内部进程运行发生错误等等“异常原因”。
# 作用:
重启一个或多个处于运行状态、暂停状态、关闭状态或者新建状态的容器
该命令相当于stop和start命令的结合
# 命令格式:
docker restart [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-t, --time int 重启前,等待的时间,单位秒(默认 10s)
实则是关闭前等待的时间
# 作用:
删除一个或多个容器
# 命令格式:
docker container rm [OPTIONS] CONTAINER [CONTAINER...]
或者 docker rm [OPTIONS] CONTAINER [CONTAINER...]
# 命令参数(OPTIONS):
-f, --force 强行删除容器(会使用 SIGKILL信号)
-v, --volumes 同时删除绑定在容器上的数据卷
# 命令演示
docker rm -f 容器id 容器名
docker rm 8379 7380 1023 # 可以放多个id,批量删除
docker rm `docker ps -a -q` # 删除所有容器