显示标签为“docker”的博文。显示所有博文
显示标签为“docker”的博文。显示所有博文

2019年6月27日星期四

docker写日志导致压测过程中耗时严重问题

今天在用ab做服务的压测,发现用java直接启动,并发数为1、2、3差不多(30ms以内),并发数加到4、5之后性能才有一定下降(50~60ms)。用docker启动服务,并发请求数为1、2、3、4、5时,每次递增时延都有增加,从50ms一直升到了150ms。docker启动的服务性能远差于java直接启动的服务。
检查发现因为我的服务写日志比较多,docker会写/var/lib/docker/containers/container_id/xxx.json这个json格式的日志文件,加上原来java自己的日志文件,写了双份,同时docker会把日志转为json格式。这一过程特别消耗资源。
测试结果显示,关闭log后,并发数为5时,p95的性能直接降到了4ms,效果惊人。

补充:原来设置了两个日志,一个是同步的console日志,一个是异步的文件日志。docker会收集命令行的日志作为自己的日志存成json文件的log。试了下,关了console的日志,保留文件日志,就没有影响了。

2019年2月20日星期三

mac中docker资源分配的问题

在mac中安装了docker后使用-m参数设置很高的内存发现没有用,启动后的container内存依旧是限制在了最大2g。后来发现在mac的右上角docker图标中选择设置 -> advanced中,有docker资源的配置。

2018年3月22日星期四

docker run之后无法ctrl-c结束

docker run xxx 之后,ctrl-c不起作用。

解决:docker run -t xxx,增加-t参数。

这样ctrl-c之后docker container不会stop

2018年3月21日星期三

配置docker镜像源

参考https://www.jianshu.com/p/84b6fe281b4d

直接在docker pull命令加上镜像地址,临时从该镜像下载相应的docker image
docker pull registry.docker-cn.com/myname/myrepo:mytag

在docker配置文件中(例如/etc/docker/daemon.json)设置默认的镜像地址
{
    "registry-mirrors": ["https://registry.docker-cn.com"]
}

生效配置并重启docker:
systemctl daemon-reload
service docker restart

可选的中国地区docker镜像地址有:
官方镜像:https://registry.docker-cn.com
七牛云镜像:https://reg-mirror.qiniu.com

rules_docker的使用

以python举例。

先写好py_image规则,写法和py_binary几乎一样,需要多加一个main参数指定启动main的文件,通过py_image规则无法指定repo和tag。

如果打包到本地需要自己指定repo和tag的话,只能使用container_bundle,container_bundle中的images参数的key为指定的repo和tag名称,value为对应的py_image或者其他image规则。

container_push用于将镜像推到docker仓库,有两种方式可以指定tag(https://github.com/bazelbuild/rules_docker#varying-image-names)。一种是使用$(tag)变量,然后bazel run --define tag=xxx来指定不同的tag;另一种是使用stamp=True,参考bazel的workspace_status使用:https://docs.bazel.build/versions/master/user-manual.html#workspace_status

2018年3月5日星期一

docker中--expose、-p参数

EXPOSE或--expose:声明运行时容器提供服务的端口,在运行时并不会因为这个声明应用就会开启这个端口的服务。在 Dockerfile 中写入这样的声明有两个好处,一个是帮助镜像使用者理解这个镜像服务的守护端口,以方便配置映射;另一个用处则是在运行时使用随机端口映射时,也就是 docker run -P 时,会自动随机映射 EXPOSE 的端口。

-p ip:hostPort:containerPort 参数可以指定宿主机的ip和端口到容器的端口映射。

docker容器内连接宿主机

参考:https://stackoverflow.com/questions/24319662/from-inside-of-a-docker-container-how-do-i-connect-to-the-localhost-of-the-mach

docker run 增加 --net=host 参数,docker容器中使用127.0.0.1或者0.0.0.0地址就指向了宿主机。--net 参数值默认是 brige。

如果设置--net=host,那么-p port:port则不生效。

获取docker container ip地址

参考https://mozillazg.com/2016/01/docker-get-containers-ip-address.html

docker inspect --format '{{.NetworkSettings.IPAddress}}' CONTAINER_ID

2018年3月1日星期四

docker清理命令

参考https://www.fengzifz.com/2017/03/27/clean-docker/

删除所有停止运行的容器
docker rm -v $(docker ps -a -q -f status=exited) 或者 docker container prune

删除所有<none>的镜像
docker rmi $(docker images -q -f dangling=true)

删除所有没用的volume
docker volume rm $(docker volume ls -qf dangling=true) 或者 docker volume prune

docker system prune,清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像

docker save和docker export的区别

参考:https://jingsam.github.io/2017/08/26/docker-save-and-docker-export.html

1. docker save保存的是镜像(image),docker export保存的是容器(container);
2. docker load用来载入镜像包,docker import用来载入容器包,但两者都会恢复为镜像;
3. docker load不能对载入的镜像重命名,而docker import可以为镜像指定新名称。