sh-4.2# docker ps --format "{{.ID}}: {{.Image}} : {{.Status}} : {{.Names}}" 66b60b72f00e: centos : Up 7 days : pensive_poincare 或者自己重新定义列,就和原生差不多:
sh-4.2# docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}" CONTAINER ID IMAGE STATUS NAMES 66b60b72f00e centos Up 7 days pensive_poincare
root# alias dockerrm='docker rm -f -v'
root# alias dockerexec='docker exec -it'
root# alias dockerrmimage='docker rmi'
root# dockerrm volume-test
volume-test
root# dockerexec volume-test ls
bin dev export lib media opt root selinux sys usr
boot etc home lib64 mnt proc sbin srv tmp var
本文转载自稀土掘金,如过已经看过可以从本文末尾跳转过去给原作者去点个赞,如果还没看过的,可以加收藏慢慢看!如果作者问起来,就说是从deepin社区看到的,哈哈
前提介绍
在使用Docker时,管理维护工作可能会显得复杂。然而,实际上,Docker提供了许多便捷且人性化的工具,这些工具的使用技巧可以大大简化维护工作,并提升效率。通过掌握这些技巧,你不仅能够更轻松地管理Docker环境,还能展现出专业的能力。接下来我们就给大家介绍一下对于我在工作当中对于Docker容器使用的技术实战总结
实战总结方案
创建容器时传入环境变量
在现实应用中,出于安全和配置灵活性的考虑,许多参数适宜通过环境变量进行设置,例如数据库连接信息、时区设置以及字体支持等。在创建容器时,您可以使用 -e 参数为这些环境变量指定键值对,从而实现参数的传递和配置。这样的方式不仅方便灵活,还有助于提高应用的安全性。
在Docker命令中,你可以使用环境变量来配置应用的行为。你给出的命令是一个Docker运行的示例,其中使用了
-e
参数来设置环境变量TZ
的值为Asia/Shanghai
,这表示将时区设置为上海。可以看到加了时区环境变量的容器已经和宿主机在同一个时区(CST),并且时间和宿主机基本同步,我们再来看一下不加入时区设置的。
大家可以看到容器的时间是:2024年 01月 20日 星期六 01:43:48 Asia,没有加时区环境变量的容器还是Asia。
调整宿主机和容器的时间差异
对于Docker容器来说,宿主和容器之间的时间差异并不存在,因为它们共享同一个内核和时钟。这意味着它们的时间是同步的,不存在需要特别处理的时间同步问题。通常,时间问题更多是由时区差异引起。你可以使用
date
命令来查看容器当前的时区设置。通用协调时(UTC)是国际标准0时区,与格林尼治平均时(GMT)相同,即英国伦敦的本地时间。而CST通常表示中国标准时间,与UTC相差8小时。
在类Unix系统中,存在硬件时钟和系统时钟两个概念。
Unix和Linux系统的时钟时间是从格林威治时间(GMT)开始计算的当前秒数,即从1970年1月1日凌晨零点零分零秒至今的时间。这是一个全球统一的标准,不受地理位置差异的影响。
时区是为了克服时间上的混乱,根据地理位置和行政区域划分的。全球共划分为24个时区,我国属于东八区,并采用协调世界时(UTC)作为标准时间。
解决办法
创建容器的时候,使用-e 将时区信息传入到容器内部。
其实使用单纯的环境变量来改变容器内部的TIME ZONE,只会影响当前容器用户的时区,一旦切换到真正的root用户就会发现时区依然是不正确的,比如以下栗子:
那么如何真正解决时区这个问题呢?其实是/etc/localtime在作怪,用户只需要将容器内部的localtime改成你想要的时区就行了。
在使用Dockerfile构建镜像的时候将/usr/share/zoneinfo/Asia/Shanghai强制软连接到/etc/localtime就可以永久修复时区的问题了。
指定容器的rootfs的大小
在使用Docker时,CPU和内存可以灵活地动态调整,但默认的rootfs大小却是固定的,默认为10GB。对于需要扩展存储的用户,可以通过挂载volume来实现。
对于需要调整rootfs大小的用户,Docke提供了两种方式:在启动Docker时加载参数
--storage-opt dm.basesize=40G
来调整默认容器的rootfs大小;在创建容器时使用参数--storage-opt size=70G
来设置特定容器的rootfs大小。这些调整方法使得用户可以根据实际需求来定制和优化容器存储空间。接下来,我们看到容器被成功创建并开始运行:
18d47e69802aa84df00182885b256c50ebc56e15d8e6990fc1e187ffe254171e
然后,我们使用以下命令来检查容器的磁盘使用情况:
docker exec -it add-test df -H | grep rootfs
进入到名为
add-test
的容器,并执行df -H
命令来查看磁盘使用情况,然后通过grep rootfs
来筛选出与rootfs相关的结果。结果显示rootfs的大小为76G,已使用1.5G,还剩74G,使用率为2%。快速管理容器和镜像
在Docker中,删除容器需要指定容器名或容器ID。当容器数量众多且状态各异时,删除容器需要更加谨慎。然而,Docker的
docker ps
命令提供了许多实用的功能,方便用户管理容器。在创建容器时,通过添加标签(label)可以进一步简化容器的管理。快速删除容器的原理
Docker的原理是使用container id来唯一标识一个容器,因此可以通过获取所有容器的container id来批量删除它们。使用
docker ps -a -q
命令可以输出所有容器的container id,其中-a
参数表示输出所有容器,-q
参数表示只输出container id。然后,将这些id作为参数传递给docker rm
命令进行批量删除。这样可以快速地清理不再需要的容器,提高管理效率。--format格式化输出
在Docker的底层实现中,各种容器的组织信息确实存储在结构体中,其中
*formatter.containerContext
可能是与容器格式化输出相关的结构体之一。这个结构体可能包含了用于生成容器输出所需的字段和数据。通过使用
--format
选项,用户可以定义自己的模板,并利用Go模板语法来格式化容器的输出。这使得用户可以根据自己的需求定制化输出,更加灵活地展示容器信息。输出所有容器的name
输出所有容器名包含test的容器
查看退出状态的容器
删除所有容器
删除/启动所有退出的容器
会删除所有已退出的容器。
会启动所有已退出的容器。
快速删除容器的原理
只列出镜像的id以及仓库名称:
sh-4.2# docker images --format "{{.ID}}: {{.Repository}}"
67591570dd29: centos 0a18f1c0ead2: rancher/server
只列出容器的相关id,image,status和name
sh-4.2# docker ps --format "{{.ID}}: {{.Image}} : {{.Status}} : {{.Names}}" 66b60b72f00e: centos : Up 7 days : pensive_poincare 或者自己重新定义列,就和原生差不多:
sh-4.2# docker ps --format "table {{.ID}}\t{{.Image}}\t{{.Status}}\t{{.Names}}" CONTAINER ID IMAGE STATUS NAMES 66b60b72f00e centos Up 7 days pensive_poincare
删除所有镜像
容器的自动重启机制
您可以使用
--restart
参数来配置Docker容器的重启策略。其中,--restart=always
选项表示容器将始终自动重启,无论容器是否正常退出。要使容器随着Docker守护进程的启动而一同启动,您可以在运行容器时加上
--restart=always
参数,例如:这将使容器在Docker守护进程启动时自动创建并启动。即使容器正常退出或发生错误,它也会自动重新启动。
如何动态修改容器的内存和cpu限制
可以看到,默认没有给容器限制内存,它会共享宿主机的所有内存动态调整内存为2014M:
使用alias来预定义常用的命令
docker管理命令经常需要指定各种参数,通过linux的alias命令将默认的参数预定义起来,可以很方便的进行管理容器。
容器label的使用
在运维工作中,随着容器的增多,管理和维护的复杂性也相应增加。然而,借助label这一功能,可以轻松地对容器进行分类和标识。
label不仅仅用于简单的标识,它还贯穿于Docker的整个生命周期,从创建到管理,再到运行。通过为容器设置不同的label,可以清晰地划分出不同业务、不同模板的容器,从而更方便地进行分组和运维。因此,合理使用label功能,可以大大提高容器管理的效率和便捷性。
创建容器的时候定义一个label,表示该容器在test这个区域使用定义的label进行快速检索容器,并进行下一步操作。
快速查看容器的相关配置信息
查看容器的devicemapper设备
查看容器的PID
查看容器name
获取容器的ID:
作者:洛神灬殇
来源:稀土掘金
原文:【深入浅出Docker原理及实战】「原理实战体系」零基础+全方位带你学习探索Docker容器开发实战指南(实战技术总结)