Docker容器¶
约 2442 个字 38 行代码 1 张图片 预计阅读时间 9 分钟
容器介绍¶
Docker容器是基于镜像创建的轻量级运行环境,把应用及其依赖一起打包,通过操作系统级隔离来运行,同一台机器上可以快速启动、停止和扩缩容多个容器,且具备良好的可移植性与一致性
容器状态与转换关系¶
容器核心状态(常见):
- Created:容器已创建但未运行(尚未启动进程)
- Running:容器进程正在运行
- Paused:容器进程被暂停(冻结)
- Restarting:容器因重启策略或异常退出后正在重启
- Exited/Stopped:容器进程已结束(正常或异常退出)
- Dead:容器无法被正常管理/清理的异常状态(较少见)
创建容器¶
使用下面的命令创建容器:
| Bash | |
|---|---|
1 | |
常见选项:
-i:以交互模式运行容器,通常与-t同时使用-P:随机端口映射,容器内部端口随机映射到主机端口-p:指定端口映射,格式为:主机(宿主)端口:容器端口(需要注意主机端口不要出现已经用过的端口,否则会报错端口被使用的错误),多个端口映射时,每一次设置都需要带上-p-t:为容器重新分配一个伪输入终端,通常与-i同时使用--name="nginx-lb":为容器指定一个名称-h "mars":指定容器的hostname-e username="ritchie":设置环境变量,多个环境变量时,每一次设置都需要带上-e--cpuset-cpus="0-2"或--cpuset-cpus="0,1,2":绑定容器到指定CPU运行-m:设置容器使用内存最大值--network="bridge":指定容器的网络连接类型,具体参考Docker网络管理--link=[]:添加链接到另一个容器--volume, -v:绑定一个卷,具体参考Docker存储卷--rm:容器退出时自动删除容器-
--restart:自动重启,写法如下:Bash 1docker create --restart=<policy> 镜像名常见策略:
no:默认值,不自动重启on-failure[:max-retries]:仅在非0退出码时重启,可选最大重试次数always:无论退出原因都重启unless-stopped:与always类似,但手动停止后不会再自动重启
如何理解-i和-t
-i实际上就是提供了一个一问一答的入口,用户输入命令可以得到回答,但是并不会显示主机信息、用户信息等,-t只是提供主机信息、用户信息等,但是用户输入命令不会有任何回答
启动容器¶
运行已经创建并且处于停止的容器可以使用下面的命令:
| Bash | |
|---|---|
1 | |
停止容器¶
停止正在运行的容器可以使用下面的命令:
| Bash | |
|---|---|
1 | |
常见选项:
-s, --signal:用于指定发送给容器主进程的停止信号,可以使用Linux的信号编号,例如信号9表示强制杀死信号SIGKILL
连接正在运行的指定容器¶
使用下面的命令连接正在运行的指定容器:
| Bash | |
|---|---|
1 | |
常见选项:
--sig-proxy:控制是否把终端收到的信号转发给容器主进程。默认情况下为--sig-proxy=true,即产生的信号会转发给容器主进程,设置为--sig-proxy=false信号不会转发到容器内进程,避免误退出或被中断
例如:
| Bash | |
|---|---|
1 | |
查看指定容器日志¶
使用下面的命令查看指定容器的运行日志:
| Bash | |
|---|---|
1 | |
常见选项:
-f, --follow:实时跟踪日志输出--since:显示某个开始时间的所有日志-t, --timestamps:显示时间戳-n, --tail:仅列出最新N条容器日志
例如,实时查看最新的5条日志:
| Bash | |
|---|---|
1 | |
列出容器¶
使用下面的命令列出正在运行的容器:
| Bash | |
|---|---|
1 | |
常见选项:
-a:显示所有容器,包括未运行的-f:根据条件过滤显示的内容--format:指定返回值的模板文件(如json或table)-l:显示latest的容器-n:列出最近创建的n个容器--no-trunc:不截断输出-q:静默模式,只显示容器编号-s:显示总的文件大小
在容器中执行命令¶
使用下面的命令可以在容器中执行命令:
| Bash | |
|---|---|
1 | |
常见选项:
-d:分离模式,在后台运行-i:即使没有附加也保持STDIN打开-t:分配一个伪终端-e:设置环境变量-u, --user:指定用户<name|uid>[:<group|gid>]-w, --workdir:指定工作目录
例如,在容器中执行可交互的终端bash:
| Bash | |
|---|---|
1 | |
创建一个容器并运行指定命令¶
使用下面的命令创建一个容器并运行指定命令:
| Bash | |
|---|---|
1 | |
常见选项:
-d:后台运行容器,并返回容器ID- 其余选项参考创建容器
重启容器¶
使用下面的命令重启容器:
| Bash | |
|---|---|
1 | |
常见选项:
-s, --signal:用于指定发送给容器主进程的停止信号,可以使用Linux的信号编号,例如信号9表示强制杀死信号SIGKILL
杀死容器¶
使用下面的命令杀死容器:
| Bash | |
|---|---|
1 | |
常见选项:
-s, --signal:用于指定发送给容器主进程的停止信号,可以使用Linux的信号编号,例如信号9表示强制杀死信号SIGKILL
需要注意的是,默认情况下,停止容器命令发送的是SIGTERM信号,杀死容器发送的是SIGKILL信号
查看指定容器内的进程信息¶
使用下面的命令查看指定容器内的进程信息:
| Bash | |
|---|---|
1 | |
其中的选项可以带上Linux中ps命令的选项,例如:
| Bash | |
|---|---|
1 | |
查看指定容器的资源使用情况¶
使用下面的命令查看指定容器的资源使用情况:
| Bash | |
|---|---|
1 | |
常见选项:
--all, -a:显示所有的容器,包括未运行的--format:指定返回值的模板文件(如table、json)--no-stream:展示当前状态后直接退出,不再实时更新(默认情况下实时更新)--no-trunc:不截断输出
查看指定容器的详细信息¶
使用下面的命令查看指定容器的详细信息:
| Bash | |
|---|---|
1 | |
-f:指定返回值的模板文件(如table、json)-s:显示总的文件大小
需要注意的是,命令可以省略container,Docker会根据容器名称区分是镜像还是容器
查看指定容器的端口映射¶
使用下面的命令查看指定容器的端口映射:
| Bash | |
|---|---|
1 | |
例如,查看mynginx的TCP协议下的80端口:
| Bash | |
|---|---|
1 | |
宿主机和容器之间的数据拷贝¶
使用下面的命令进行宿主机和容器之间的数据拷贝:
| Bash | |
|---|---|
1 2 3 4 | |
查看指定容器中的文件修改¶
使用下面的命令查看指定容器中的文件修改:
| Bash | |
|---|---|
1 | |
常见的标记:
A:Added,新增文件/目录C:Changed,内容或元数据发生变化(例如权限、时间戳等)D:Deleted,被删除的文件/目录
利用容器创建一个镜像¶
使用下面的命令利用容器创建一个镜像:
| Bash | |
|---|---|
1 | |
常见选项:
-a:提交的镜像作者-c:使用Dockerfile中的指令来创建镜像,可修改启动指令,具体见Docker镜像制作-m:提交时的说明文字-p:在创建进行时将容器暂停
例如:
| Bash | |
|---|---|
1 2 3 | |
暂停正在运行的容器¶
使用下面的命令暂停正在运行的容器:
| Bash | |
|---|---|
1 | |
继续运行容器¶
使用下面的命令继续运行容器:
| Bash | |
|---|---|
1 | |
删除容器¶
使用下面的命令删除容器:
| Bash | |
|---|---|
1 | |
常见选项:
-f:删除正在运行的容器
需要注意的是,默认情况下该命令只会删除停止的容器,如果要删除正在运行的容器,就要带-f
导出容器内容到归档文件中¶
使用下面的命令导出容器内容到归档文件(后缀为.tar)中:
| Bash | |
|---|---|
1 | |
常见选项:
-o:待写入的文件
该命令尝搭配下面的命令使用:
| Bash | |
|---|---|
1 | |
常见选项:
-c:使用Dockerfile中的指令来创建镜像-m:提交时的说明文字
需要注意的是,默认情况下,使用import命令得到的镜像中CMD、ENV的值都是null,而load命令会保留
查看容器退出码¶
使用下面的命令查看容器退出码:
| Bash | |
|---|---|
1 | |
需要注意,一旦执行这个命令,终端会阻塞直到容器停止打印出退出码。如果有指定了多个容器,会一直阻塞到最后一个容器退出才会显示所有停止的退出码
重命名容器¶
使用下面的命令重命名容器:
| Bash | |
|---|---|
1 | |
该命令可以修改正在运行的容器的名称
删除闲置容器¶
使用下面命令删除闲置(已经停止的)容器:
| Bash | |
|---|---|
1 | |
常见选项:
-f, --force:不进行删除确认提示
更新容器的资源配置¶
使用下面的命令更新容器的资源配置:
| Bash | |
|---|---|
1 | |
常见选项:
--restart:设置容器重启配置--cpus:CPU数量--cpuset-cpus:指定可使用的CPU--memory:内存限制--memory-swap:交换内存限制--cpu-period:指定容器对CPU的使用在多长时间内重新分配一次--cpu-quota:指定在该周期内可用于运行容器的最长时间
其中--cpu-period和--cpu-quota是一组配合使用的“时间片+配额”机制,核心概念是:在一个固定周期内,容器最多能用多少CPU时间:
--cpu-period:调度周期长度,单位是微秒(\(\mu s\))--cpu-quota:在这个周期内,容器最多可用的CPU时间,单位也是微秒
所以\(可用CPU比例 = \frac{quota}{period}\)
举例:
--cpu-period=100000 --cpu-quota=200000:表示每100ms里最多用200ms CPU时间,相当于2个CPU--cpu-period=100000 --cpu-quota=25000:表示每100ms里最多用25ms CPU时间,相当于0.25个CPU
