docker是最近很流行的部署方式,最近尝试之前的项目都转移到docker上运行,下面是碰到的一些坑和解决方案。
- 网络问题 因为国内的原因,docker pull 镜像的时候经常碰到连不上或者速度极慢的情况。 这部分可以使用 国内流行的 ?daocloud 的方案解决?,使用dao pull代替docker pull ,如果是自行构建,可能需要使用代理或者直接在国外主机build,再打包传回来。
- 时间同步
hub.docker.com上的镜像,包括自己构建的,基本上都是以utc时区作为默认时区,这样于host主机时间往往差8个小时。
最好的解决方案是 ?挂载volumn ? /etc/localtime 到 ?docker环境中,如果是docker命令,docker -v /etc/localtime:/etc/locaitime:ro ...
如果是docker-compose.yml ? 添加volumes
volumns: - /etc/localtime:/etc/localtime:ro
- entrypoint 与 run
构建docker镜像时,最后一句往往要写上docker的"入口",使用entrypoint or run?
这两个最基本的区别就是?entrypoint 包含了命令本身,是应用化的docker镜像,如果 指定 ? ?docker-a 的entrypoint位 ls
则 docker run ?entrypoint ?-l ?的结果就是ls -l 的结果,而如果指定 ?run 为ls,则 ?docker run ?entrypoint ?ls -l ? 则为ls -l的结果
所以单次执行不需要后台运行的项目,基本上建议指定为?entrypoint,否则建议run。
可以在 docker/docker-compose run ?后面使用 --entrypoint覆盖dockerfile里的设置,不过如果想执行bash可能要使用 bash -c 代替。 - 空间占用
如果pull了大量的image,可能会导致docker镜像占用了大量的磁盘空间,所以很多人往往希望找小而美的images,但是这往往没有必要:
docker会复用相同的层(layer) ,所以pull或者build镜像的时候,最好找基于同一个base的镜像,特别是构建的时候,能复用的尽量复用。 - docker 卡死
初期试用docker时,如果没有预估好资源使用量,可能会导致docker卡死,可能会导致系统其他服务响应都会变慢。
建议在多核机器上(>4),对docker使用CPU限制,建议使用cpuset 限制n-1个核心为docker使用,剩下一个响应其他操作,或者使用cpu-shares限制使用量(不超过90%) - 端口与IP
docker默认使用nat作为网络使用方式,使用expose和publish bind暴露内部服务端口。
如果无需对外提供服务,尽量减少主机端口绑定,使用docker-compose时,对内服务无需是用ports指定端口,除非需要在另外一台机器上使用。
如果需要绑定静态ip或直接使用外网ip,可以使用iptables,或者?ip netns等方法,这里我也没做太多实践,下次补充。 - 未完待补充..
文章来源:http://blog.xujif.com/archives/dockers.html
时间: 2024-12-16 16:37:07