docker小技巧

docker的一些小技巧 docker暂停所有的ID的容器。-q是列出所有的ID的容器。 阅读详情

创建容器时传入环境变量

在实际应用场景中,不论是从安全还是可配置方面去考虑,很多参数是比较适合用环境变量加载进去的,比如数据库的连接信息,时区,还有字体支持等等,在创建容器的时候其实都可以使用-e 指定key/value进行传递环境变量进去。

sh-4.2# docker run -itd --name test-env -e TZ='Asia/Shanghai' 172.25.46.9:5001/centos6.8-jdjr-test-app 
ee20b44301e27c16eae63dab243d293054178dd5f819c23d44bd9e534208bb42
sh-4.2# docker exec -it test-env date
2017年 01月 17日 星期二 10:35:17 CST
sh-4.2# date
Tue Jan 17 10:35:21 CST 2017

可以看到加了时区环境变量的容器已经和宿主机在同一个时区(CST),并且时间和宿主机基本同步

sh-4.2# docker run -itd --name test  172.25.46.9:5001/centos6.8-jdjr-test-app
d6a02874b999ff4eea79e3b302148b42043af01c89a5d31e5d858e0806f9077a
sh-4.2# docker exec -it test date
2017年 01月 20日 星期五 01:43:48 Asia

默认没有加时区环境变量的容器还是Asia
调整宿主机和容器的时间差异

首先我们需要弄清几个概念:在类unix系统中有硬件时钟与系统时钟,硬件时钟是指主机板上的时钟设备,也就是通常可在BIOS画面设定的时钟,系统时钟则是指kernel中的时钟。unix以及linux系统时间是从格林威治时间到当前的秒数,即1970年1月1日凌晨零点零分零秒到当前的时间,全球都一样,这是绝对值;而时区则是由于地理位置差异、行政区划导致各地显示时间的差异,为了克服时间上的混乱,规定将全球划分为24个时区,我们国家属于东八区标识为CST。

因此,对于 Docker 容器而言,根本不存在宿主和容器的时间差异问题,因为他们使用的是同一个内核、同一个时钟,二者完全一样,所以根本不存在同步问题。一般来说这个问题是由时区导致的,可以使用date命令查看下容器当前的时间时区是啥。UTC(通用协调时)表示使用的是国际标准0时区,UTC与格林尼治平均时(GMT, Greenwich Mean Time)一样,都与英国伦敦的本地时相同。CST表示中国标准时间时区一般是中国上海"Aisa/Shanghai",也就是说UTC和CST相差了8个小时。
解决办法:
创建容器的时候,使用-e 将时区信息传入到容器内部。

sh-4.2# docker run -itd --name test-env -e TZ='Asia/Shanghai' images

注意:其实使用单纯的环境变量来改变容器内部的TIME ZONE,只会影响当前容器用户的时区,一旦切换到真正的root用户就会发现时区依然是不正确的,比如以下栗子:

$ docker run -itd --name test-env -e TZ='Asia/Shanghai' images
$ docker exec -it test-env bash
bash-4.1# date
2017年 09月 20日 星期三 20:45:54 CST
bash-4.1# sudo su -c date
2017年 09月 20日 星期三 08:46:02 EDT
bash-4.1# 

那么如何真正解决时区这个问题呢?其实是/etc/localtime在作怪,用户只需要将容器内部的localtime改成你想要的时区就行了。

bash-4.1# ln -sf /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 
bash-4.1# date
2017年 09月 20日 星期三 20:54:35 CST
bash-4.1# sudo su -c date
2017年 09月 20日 星期三 20:54:39 CST
bash-4.1# 

So,在使用Dockerfile构建镜像的时候将/usr/share/zoneinfo/Asia/Shanghai强制软连接到/etc/localtime就可以永久修复时区的问题了。
指定容器的rootfs的大小

在使用docker的过程中,会发现cpu和memory可以很随意的动态调整,但是默认的rootfs却是不能随意调整的,默认是10g大小,当然如果对于数据有需求,可以通过挂载voulme进行扩展存储。如果用户执意想要调整rootfs的大小,在docker1.12版本默认提供了两种方式:在启动docker 的时候加载参数–storage-opt dm.basesize=40G用来调整默认容器的rootfs大小;在创建容器的时候使用参数–storage-opt size=70G来设置改容器的rootfs大小。

喜讯:在docker最近发布的1.13版本中,支持了磁盘的配额,不过还未测试

sh-4.2# docker run -itd --name volume-test --storage-opt size=70G 172.25.46.9:5001/centos6.8-jdjr-test-app
18d47e69802aa84df00182885b256c50ebc56e15d8e6990fc1e187ffe254171e

sh-4.2# docker exec -it volume-test df -H | grep rootfs
rootfs                 76G  1.5G   74G   2% /
sh-4.2# docker exec -it test-env df -H | grep rootfs
rootfs                 11G  1.5G  9.3G  14% /

快速管理容器和镜像

在docker中删除容器需要指定容器名或者容器id,但是在容器比较多,并且状态不一的情况下删除容器还是需要走下心的。不过好处是docker ps默认提供了很多好用的功能,可以很方便地管理容器(创建容器的时候如果加上label后更方便哦)。
原理:先用docker ps -a -q 输出所有容器的container id(-f 表示过滤参数或者输出格式),然后作为docker rm 的参数进行批量删除
输出所有容器的name:

sh-4.2# docker ps --format='{{.Names}}'
test-env
test-args
test-run

输出所有容器名包含test的容器,并打印容器名

sh-4.2# docker ps -f name=test --format='{{.Names}}'
test-env
test-args
test-run

查看退出状态的容器,并打印容器名

sh-4.2# docker ps -f status=exited --format="{{.Names}}"
thirsty_brahmagupta
clever_mestorf
hopeful_morse
stoic_morse
elated_williams
tender_jepsen
reverent_mirzakhani

删除所有容器:

sh-4.2# docker rm -f -v $(docker ps -a -q)

删除/启动所有退出的容器:

sh-4.2# docker rm/start $(docker ps -qf status=exited)

删除所有镜像:

sh-4.2# docker rmi $(docker images -q)

查看悬挂镜像:

sh-4.1# docker  images -qf dangling=true

只查看镜像或者容器指定的信息(在docker1.10之后才支持的)

只列出镜像的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

注意:其实上面的–format利用的就是go语言中的模版语法,所有容器的组织信息都在结构体中:

*formatter.containerContext

容器label的使用

在实际运维过程中,大量的容器可能会一些运维上的挑战,通过使用label,可以很好的将容器分类。label贯穿于docker的整个过程。
这个label可以作为你区分业务,区分模板各种区分容器的标识,通过标识,可以将容器更好的进行分组

sh-4.2# docker run -itd --name volume-test --storage-opt size=70G --label zone=test 172.25.46.9:5001/centos6.8-jdjr-test-app
c3772397e58e663095c2c0fd8d688b3d41b494097999ec2b6d6b7c509d23a138

创建容器的时候定义一个label,表示该容器在test这个区域
使用定义的label进行快速检索容器,并进行下一步操作(比如删除啦,更新啦)

sh-4.2# docker ps -qf label=zone=test
c3772397e58e
sh-4.2# docker ps -f label=zone=test --format='{{.Names}}'
volume-test

快速查看容器的相关配置信息
查看容器的devicemapper设备:

sh-4.2# docker inspect -f '{{.GraphDriver.Data.DeviceName}}' nginx 
docker-8:1-67411759-7c9d6d3327b02659c81bcb70bf6a4c7a45df6a589af2a2d42a387dc0e90d4913

查看容器的PID:

sh-4.2# docker inspect -f '{{.State.Pid}}' nginx 
27521

查看容器name:

sh-4.2# docker inspect -f '{{.Name}}' nginx 
/nginx

获取容器的ID:

sh-4.2# docker inspect --format {{.Id}} nginx
53214bc9cd001f2c548edcce0c42fe51f1a118c08941406d43122a8348055843

使用alias来预定义常用的命令

docker管理命令经常需要指定各种参数,通过linux的alias命令将默认的参数预定义起来,可以很方便的进行管理容器。

sh-4.2# alias dockerrm='docker rm -f -v'
sh-4.2# alias dockerexec='docker exec -it'
sh-4.2# alias dockerrmimage='docker rmi'

sh-4.2# dockerrm volume-test
volume-test

sh-4.2# dockerexec volume-test ls
bin   dev  export  lib    media  opt   root  selinux  sys  usr
boot  etc  home    lib64  mnt    proc  sbin  srv      tmp  var
sh-4.2# dockerexec volume-test bash
bash-4.1# 

使容器随着docker daemon的启动一同启动
docker run 的时候加参数–restart=always
如何动态修改容器的内存和cpu限制docker1.10之后才支持的动态调整

sh-4.2# dockerexec test-env cat /sys/fs/cgroup/memory/memory.limit_in_bytes
9223372036854775807
sh-4.2# cat /sys/fs/cgroup/memory/memory.limit_in_bytes 
9223372036854775807

可以看到,默认没有给容器限制内存,它会共享宿主机的所有内存
动态调整内存为2014M:

sh-4.2# docker update -m 2014M test-env
test-env
sh-4.2# dockerexec test-env cat /sys/fs/cgroup/memory/memory.limit_in_bytes
2111832064

docker容器中真实用户的隔离

注意:默认docker容器内部的用户会继承宿主机的用户id,也就是说容器外部有一个uid为500的用户test,容器内部有一个uid为500的用户admin,容器内部运行的程序如果在宿主机上查看的时候会发现程序的启动用户会是外部宿主机的test用户。
这是因为默认情况下容器的 user namespace 并未开启,所以容器内的用户和宿主用户共享 uid 空间。容器内的 uid 为 0 的 root,就被系统视为 uid=0 的宿主 root,因此磁盘读写时,具有宿主 root 同等读写权限。
开启user namespace:
启动docker的时候加参数–userns-remap=default
https://docs.docker.com/engine/reference/commandline/dockerd/#/daemon-user-namespace-options
在docker container和物理机中双向拷贝文件
容器内部文件拷贝到宿主机:

sh-4.2# docker cp jupyter-70002111:/home/70002111/教程-研究功能介绍.ipynb .
sh-4.2# ls

Dockerfile  教程-研究功能介绍.ipynb

宿主机文件拷贝到容器:

sh-4.2# docker cp Dockerfile jupyter-70002111:/home/70002111/
sh-4.2# docker exec -it jupyter-70002188 ls 
Dockerfile

向容器内部程序发送signal

注意:在给容器进程发送SIGTERM信号时只会发给主进程,也就是容器内 PID 为 1 的进程。至于说主进程启动的那些子进程,完全看主进程是否愿意转发SIGTERM 给子进程了。所以那些把 Docker当做虚拟机用的,主进程跑了个bash,然后exec 进去启动程序的,或者来个&让程序跑后台的情况,应用进程必然无法收到SIGTERM。
还有一种可能是在Dockerfile中的CMD那行用的是 shell 格式写的命令,而不是 exec 格式。在镜像中使用CMD启动的容器会加一个 sh -c 来去执行,因此使用 shell 格式写 CMD 的时候,PID 为 1 的进程是 sh,而它不转发信号,所以主程序收不到。

所以在写CMD哪行命令的时候,最好按照exec格式去写。

划重点: 由于在容器内部是没有init进程的,所以容器的整个生命周期会和容器内部PID为1的进程紧密相连,用户在使用过程中经常会发现容器更新版本之后,业务调用方经常会有一些请求异常,这其实也是因为容器内部的1号进程的设置有关,导致容器在停止时可能直接发送SIGKILL信号,导致容器当前正在处理中的业务也会立即断开连接,这样可能会导致一些业务异常

总而言之,向容器内部程序发送合适的信号是非常有必要的,这样可以使你的容器很优雅的退出。docker stop操作会让容器在10s后进行优雅的退出

如何优雅的关闭容器
容器的cache不释放

$ echo 1 > /proc/sys/vm/drop_caches

桥接网络连入下层网络并使用IPAM (没有NAT/端口映射)

注意:docker network是1.12版本加进来的,支持了多种网络插件

$ docker network create \
    -d bridge \
    --subnet=192.168.57.0/24 \
    --ip-range=192.168.57.32/28 \
    --gateway=192.168.57.11 \
    --aux-address DefaultGatewayIPv4=192.168.57.1 \
    -o com.docker.network.bridge.name=brnet \
    brnet
$ brctl addif brnet eth2
$ docker run --net=brnet -it busybox ifconfig

注意其它主机的 --ip-range 和 --gateway 需要做对应调整。

这种拓扑是,容器内 eth0 连接 brnet 接口,该接口直接通过 eth2 访问交换。

Docker查看某个容器绑定的cpu内核

容器内部第一个进程编号一般为1

$ docker exec -it container-name taskset -c -p 1 
pid 1's current affinity list:0-3

给docker配置hosts

$ docker run --add-host biaoge-ops:192.168.0.1 centos cat /etc/hosts
127.0.0.1   localhost
::1 localhost ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
192.168.0.1 biaoge-ops
10.0.0.3    6ff3ea7114b4

查看容器大小

$ sudo  docker ps -s
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS                     NAMES               SIZE
11b6cd007b26        finance/mysql5-1    "/usr/bin/mysqld_safe"   22 months ago       Up 3 seconds        0.0.0.0:32768->3306/tcp   mysql               109 MB (virtual 1.19 GB)
计算pi小数点后10000位 数据结构课上,老师让我们计算一下pi的10000位,复习一下面向对象。 First Try:定义一个高精度类hp(high precision),实现加减乘除,输入输出,然后随便找一个公式,比如Wallis公式,全都用hp进行计算。 现实是:大数乘大数或者大数除大数,实在是太慢了。而且Wallis公式收敛太慢。 Second Try先找到一个收敛较快的公司:BBP公式,观察公式发现,... 阅读详情

相关推荐

matlab内读取文件目录时斜杠和反斜杠的使用

@matlab内读取文件目录时斜杠和反斜杠的使用TOC matlab内读取文件目录时,斜杠和反斜杠的使用 最近被斜杠和反斜杠弄晕了,于是总结了一下,在此和大家分享一下。 代码 clear; clc; close all; I1= imread('..\zs1.jpg'); %和代码文件夹同目录的图片 (纯反斜杠) I2= imread('../zs2/zs2.j...

weixin_44456694的博客 6571

Docker 配置 Context

环境:两台都安装 docker19.03 版本,其中 远程主机需要开启 2375 端口:https://blog.youkuaiyun.com/mshxuyi/article/details/118177110 本地docker 主机 192.168.26.129 远程 docker 主机 192.168.26.130 需要开启 docker tcp:2375 端口, 1、本地主机添加 context docker context create docker130 --docker "host=...

一直被模仿,从未被超越 1051

告别手动归档:基于Allegro Skill的XTools一键生成Gerber与生产文件实践

本文详细介绍了基于Allegro Skill的XTools工具如何实现一键生成Gerber与生产文件,大幅提升PCB设计效率。通过自动化流程,解决了传统手动归档中的重复劳动、人为失误和标准不统一等问题,特别适合需要频繁输出生产文件的工程师。文章包含安装配置、实战操作、问题排查及进阶技巧,帮助用户快速掌握这一高效工具。

weixin_30505225的博客 460

转载 DOCKER使用技巧

那些让你看起来很牛逼的Docker使用技巧 转载https://www.jianshu.com/p/0231568ab335   在使用docker过程中,我们经常发现管理维护是一个很复杂过程,因为我们在使用docker commands的过程中,我们只会去使用我们认为简单并且熟悉的命令,然而docker本身其实是提供给我们很多便捷且人性化的工具的,如果掌握这些使用技巧,也许你的维护管理工...

花米徐xl_lx的专栏 747

OpenCV实战:5分钟搞定图像拼接(附Python代码)

本文通过OpenCV实战教程,详细讲解如何使用Python在5分钟内完成图像拼接。重点介绍`findHomography`函数和单应性矩阵的应用,提供完整的代码示例和常见问题解决方案,帮助开发者快速掌握图像拼接技术。

weixin_26833503的博客 120

从零构建EtherCAT从站:SSC工具配置与TwinCAT3 PDO/SDO调试实战

本文详细介绍了从零构建EtherCAT从站的完整流程,重点讲解SSC工具配置与TwinCAT3 PDO/SDO调试实战。通过解析EtherCAT通信机制、PDO与SDO的核心概念,提供SSC工具配置技巧、XML文件生成与校验方法,以及TwinCAT3环境下的调试经验,帮助开发者高效完成EtherCAT从站开发与优化。

weixin_42520573的博客 336

别急着关ESLint检查!深入理解TypeScript项目中的‘no-unused-vars’警告与正确处置姿势

本文深入解析TypeScript项目中ESLint的'no-unused-vars'警告,揭示其背后的代码质量保护价值。通过分类处理未使用变量、精细化配置ESLint规则、团队协作实践及TypeScript高级技巧,提供超越简单关闭警告的解决方案,帮助开发者提升代码健康度与可维护性。

weixin_30755393的博客 481

数学概念 | 旋转矩阵、欧拉角、四元数

旋转矩阵、欧拉角、四元数概念及相关运算;

NapoleonCoder的博客 771

docker进入容器出现bash-4.2#解决办法

出现上述问题是因为在/root/目录下缺少**.bash_profile .bashrc** 这两个文件。

andyLyysh的博客 3488

【PLC】三菱plc控件安装 component Movedata had the following error ... Error Number:-119

Windows 10 专业版/企业版本版本号:22H2操作系统内部版本:19045.3448。

少莫千华 8000

Allegro172版本如何在联机模式下使用skill文件操作指导

注意:如果下次重新开启Symphony模式的时候可能导致symphony_skill中的文件内容被清空,所以最好将自己常用的skill文件都写到symphony_skill.txt中去,然后做好备份,需要的时候,在开启软件后把文件放到env目录中去。在用Allegeo172版本进行PCB设计的时候,有时会用到Symphony模式进行多人实时在线协同设计,如下图。这个模式设计起来可以提升设计速度,但是也有一个缺陷,就是不能使用skill文件。如下图,当调用skill的时候就会出现如下报错。

weixin_54787054的博客 1586

Thin Pool has 107394 free data blocks which is less than minimum required 163840 free data blocks.

报错日志: failed to register layer: devmapper:Thin Pool has 107394 free data blocks which is less than minimum required 163840 free data blocks. Create more free space in thin pool or use dm.min_free_sp...

guoshaoliang789的专栏 5239

GlobalBuildingAtlas 建筑物白模数据下载

GlobalBuildingAtlas基于OSM开源数据构建全球建筑物3D白模,提供在线浏览和下载服务。官方资源包括GitHub项目地址和TUM数据库链接,支持行政区划检索建筑物数据。

一醉千秋的专栏 540

【Docker】docker使用小技巧

一、docker命令 #后端运行服务 docker run -d --name demo01 -p 8082:8080 springbootdemo-image #后端运行服务,并将容器中的文件映射到宿主机 docker run -d --name=nginx01 -v /root/conf/nginx/nginx.conf:/etc/nginx/nginx.conf -v /root/conf/nginx/conf.d:/etc/nginx/conf.d -p 8080:80 nginx #进入容器内部

galaxyfishm 1349

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Docker配置容器位置和小技巧

Docker配置容器位置和小技巧 清理全部停止的docker容器 有时候我们会有很多已经停止的容器或者由于错误强制退出不能用的容器,那我们就需要删除了,但是我们一个一个的rm删除很麻烦,有多少容器就要rm多少次,我们可以根据docker ps -qa 查出所有容器的id,一次性全部删除,不用担心会删除正在运行的容器,运行中的容器rm无法删除,这样我们就一次性把所有停止的容器删除了 # 只适用...

KingAarmy的博客 2522

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

介绍一些本地使用docker部署dify的几个小技巧

最近有很多小伙伴问我,怎么修改这个名字,因为如果还用docker部署其他的程序,如果都用docker,另外的容器和dify的容器都会混合在一起,不便于管理,例如统一开启和关闭dify服务,这里我说下如何修改,其实非常简单,只需要将下载的dify源码里的docker文件夹重名名就可以,例如改成docker_dify。工作流的最大允许执行时间,超时报错,工作流迭代较多时,执行的长文本处理时,耗时较长,可能会超时。字符串数组的元素的最大个数,处理文本分段较多时,会超出(原来只有30太少了),建议加长。

汽车软件开发 996

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

docker15个小技巧

这是我们经常会用到的一个操作,按照官方示例,你可以这样做(环境ubuntu): 1 2 3 4 $ ID=$(docker run ubuntu echo hello world) hello world $ docker commit $ID helloworld fd08a884dc79 这种

s1070的专栏 1129

Docker使用小技巧

这里是Docker使用过程中可能用到的小技巧 删除 直接删除所有镜像 docker rmi `docker images -q` 直接删除所有容器 docker rm `docker ps -aq`

NelsonCheung的博客 200

docker部署php环境运行web项目 及 项目映射小技巧

docker部署php环境运行web项目 及 项目映射小技巧 php项目部署: https://blog.youkuaiyun.com/a516972602/article/details/86376990/?utm_medium=distribute.pc_relevant.none-task-blog-utm_term-3&spm=1001.2101.3001.4242 项目映射技巧: https://www.jianshu.com/p/4a37348aa164 ...

星辰的博客 671

docker容器小技巧记录

docker 小技巧 一、docker容器镜像 ①、导出docker容器镜像 导出镜像 # 把镜像打包成 .tar # -o 要保存路径.tar # > 要保存路径.tar # docker save 镜像id > /存储路径/xxx.tar docker save fce91102e17d>/root/tomcat.tar # docker save 镜像id -o 存储路径 docker save fce91102e17d -o /root/tomcat.tar export 导

那个那个 546

Docker日常运维小技巧

日常技巧分享,只是做一点小事

LinkSLA的博客 1021

再分享几个docker小技巧

1. MacOS docker 相关命令自动补全非 mac 用户可以直接跳到下一个 tip。首先你已经安装的了docker for mac,自然我们要先安装 bash-completio...

pshu0_0的博客 180

构建 Docker 镜像的 小技巧

如果不采用分阶段构建,对于一些需要在容器内进行编译的项目,最好通过 git 或者 wegt 的方式将源码打入到镜像内,

LinkSLA的博客 813

docker compose小技巧

进行容器部署的时候默认文件夹是项目的所在文件夹。文件里面添加配置达到自己定义文件夹名称的目的。在同一目录下,重新部署启动即可。

小谷的博客 225
上一篇: Docker中使用matplotlib显示图像
下一篇: docker之java和python编程
那记忆微凉
博客等级 码龄9年 412粉丝 387原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值