docker 使用技巧101

1 目录挂载和单个文件挂载

例如下面一个挂载实例, /var/run/license_unix_sock 是个文件,docker 容器通过该 socket 文件和主机上的进程进行通信, /var/www/html/ 是目录。

- "/var/run/license_unix_sock:/var/run/license_unix_sock"
- "/var/www/html/:/var/www/html/"
- "/etc/localtime:/etc/localtime"

现象:当运行在主机上的程序重启时候, /var/run/license_unix_sock 发生变化,但是在 docker 容器中挂载的文件并没有发生改变,仍然是旧文件。

原因:对bind mount 这种挂载方式来说,文件的改变会改变它的inode,但是容器内inode保持不变。

解决方案:修改为挂载目录。

相关案例:

https://serversforhackers.com/c/mounting-files-vs-directories

https://github.com/docker/docker/issues/15793#issuecomment-135411504

2 使用 docker swarm,容器莫名其妙重启

某些情况下,docker 容器全部重启,经过查看 docker 运行日志,发现下面报错:

Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.124650220+08:00" level=error msg="heartbeat to manager { } failed" error="rpc error: code = NotFound desc = node not register
Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.124764380+08:00" level=error msg="agent: session failed" backoff=100ms error="node not registered" module=node/agent node.id=
Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.124803737+08:00" level=info msg="manager selected by agent for new session: { }" module=node/agent node.id=a5drrk7eo59x4m6itl
Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.124835689+08:00" level=info msg="waiting 47.652971ms before registering session" module=node/agent node.id=a5drrk7eo59x4m6itl
Feb 26 11:43:16 sz-drip dockerd[5065]: time="2020-02-26T11:43:16.278198549+08:00" level=info msg="worker a5drrk7eo59x4m6itlbsf28pq was successfully registered" method="(*Dispatcher).register

原因:docker swarm 节点间通信默认超时时间为 5s,在虚拟化环境下有时候会超时,导致节点重启。

解决方案:使用以下命令将心跳超时时间更改为 30s。

docker swarm update --dispatcher-heartbeat 30s

centos 上查看日志方法:journalctl -u docker.service

相关案例:

https://github.com/moby/moby/issues/38107

备注:使用 docker-compose 有时候也会出现启动失败的情况,可以使用下面两个环境变量进行设置:

export DOCKER_CLIENT_TIMEOUT=500
export COMPOSE_HTTP_TIMEOUT=500

3 docker 容器访问宿主机服务

需要在 docker 容器中访问部署在宿主机上的服务,可以采用下面一些方法。

  • 采用 host 网络模式

    在启动容器时,使用 --net="host" 参数。

  • 使用宿主机对外的IP,需要防火墙端口开放。

  • 使用 docker0 访问

    ip route show | awk '/default/ {print $3}'

    注意:这种方式只能访问监听到 0.0.0.0 或者 docker0 上服务。

4 给 docker 指定 IP

首先需要创建自己的网络。

docker network create --subnet=10.12.0.0/16 testnet

然后可以通过运行参数指定 IP

docker run -d --net testnet --ip 10.12.1.32 ubuntu

5 宿主机与容器间文件拷贝

常用的有如下两种方法:

第一种,将目录挂载到容器,然后可以通过 ${PWD}/data 目录将文件拷贝到容器中,或在容器中将文件拷贝至 /data 目录。

docker run -i -v ${PWD}/data:/data ubuntu:latest

第二种,较第一种更为方便快捷。

从容器中拷贝数据到宿主机:

docker cp <containerId>:/file/path/within/container /host/path/target

拷贝文件到容器:

docker cp /host/path/target <containerId>:/file/path/within/container

6 如何启动 docker-compose.yml 文件中的某个服务

在一个 docker-compose.yml 文件中我们经常会定义多个服务,使用 docker-compose up -d 可以将服务全部启动,当我们修改某个服务配置后,再次运行该命令就可以直接重启更改后的服务。

有时候,我们只需要启动其中的某一个服务,而不需要全部启动,可以使用以下命令:

docker-compose up --detach --build xxxx

更新配置或代码后,使用以上命令就可以重新生成容器。

或者

docker-compose up -d xxxx

7 如何清除无用镜像

docker rmi $(docker images | grep -w "keyword" | awk -F " " '{print $3}') -f

或者删除所有镜像:

docker rmi -f $(docker images -q)

8 如何删除磁盘空间

docker volume rm $(docker volume ls -q)

9 如何查看 docker daemon 日志的位置

在不同的系统,查看方式也不同,参考下表:

系统 查看方式
RHEL, Oracle Linux /var/log/messages
Debian /var/log/daemon.log
Ubuntu 16.04+, CentOS journalctl -u docker.service 或者查看 /var/log/syslog
Ubuntu 14.10- /var/log/upstart/docker.log
macOS (Docker 18.01+) ~/Library/Containers/com.docker.docker/Data/vms/0/console-ring
macOS (Docker <18.01) ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/console-ring
Windows AppData\Local

参考链接如下:https://docs.docker.com/config/daemon/#read-the-logs

10 如何导入/导出镜像文件

例如将镜像文件 mongodb:4.0.11-xenial 导出至 mongodb.tar 文件中,可以使用以下命令:

docker save mongodb:4.0.11-xenial > mongodb.tar

使用以下命令导入镜像:

docker load < mongodb.tar

11 执行 docker 容器中的命令

例如 mongodb 运行在 docker 容器中,需要使用 mongoimport 导入数据,可以采用以下命令:

docker exec $(docker ps | grep "ms_mongodb" | awk -F " " '{print $1}') mongoimport -u ${MONGOUSER} -p ${MONGOPASSWORD} -d ${MONGODB} -c ${name} --file ${DOCKER_RESOURCE}/${name}.json

其中 ms_mongodb 是容器名。

未完待续

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,907评论 6 506
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,987评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,298评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,586评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,633评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,488评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,275评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,176评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,619评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,819评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,932评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,655评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,265评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,871评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,994评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,095评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,884评论 2 354