docker入门及监控
ps:其实现在看来,监控docker其实有更多选择的。。。。
继zabbix监控nginx负载均衡、数据库和应用层相关项后,需要增加的监控为docker和交换机的监控
现处于学习docker阶段,也是遇到了很多问题
要真正理解需要了解docker原理,看docker的源码
(PS简单使用:菜鸟教程:http://www.runoob.com/docker/)
docker (操作系统级的虚拟化方法)
镜像:相当于面向对象的对象;容器:面向对象的实例
想象成linux里的一个进程
1.主要的模块有:Docker Client、Docker Daemon、Docker Registry、Graph、Driver、libcontainer以及Docker container
2.docker容器与主机共享一个操作系统,不会有额外的操作系统开销
3.特点
使应用的打包与部署自动化
创建轻量、私密的PAAS环境
实现自动化测试和持续的集成/部署
部署与扩展webapp、数据库和后台服务
通过各种namespace进行隔离
Docker 运行在 CentOS 7 上,要求系统为64位、系统内核版本为 3.10 以上。
Docker 运行在 CentOS-6.5 或更高的版本的 CentOS 上,要求系统为64位、系统内核版本为 2.6.32-431 或者更高版本。
基本操作
yum install docker
docker search image/tomcat 查看可以拉取的镜像/tomcat
docker ps 查看正在运行的容器
docker ps -a 查看所有容器
docker pull tomcat 拉取tomcat镜像
docker run ubuntu:15.10 /bin/echo "Hello world"
docker: Docker 的二进制执行文件。
run:与前面的 docker 组合来运行一个容器。
ubuntu:15.10指定要运行的镜像,Docker首先从本地主机上查找镜像是否存在,如果不存在,Docker 就会从镜像仓库 Docker Hub 下载公共镜像。
/bin/echo "Hello world": 在启动的容器里执行的命令
docker run -i -t ubuntu:15.10 /bin/bash
-t:在新容器内指定一个伪终端或终端。
-i:允许你对容器内的标准输入 (STDIN) 进行交互。
docker ps 查看有没有容器在运行
CONTAINER ID:容器ID
NAMES:自动分配的容器名称
docker run -d -P training/webapp python app.py
-d:让容器在后台运行。
-P:将容器内部使用的网络端口映射到我们使用的主机上。
*-P :是容器内部端口随机映射到主机的高端口。
*-p : 是容器内部端口绑定到指定的主机端口。
docker exec -it db3 /bin/sh 或者 docker exec -it d48b21a7e439 /bin/sh //进入正在后台运行的容器并且使用exit后不会退出后台
docker run --name mytomcat -p 8090:8080 -v $pwd/test:/usr/local/tomcat2/webapps/examples -d tomcat
-p 8090:8080:将容器的8080端口映射到主机的8090端口 *主机输入IP:8090访问,8080是mytomcat默认端口,如果改了容器的端口比如8081,它就找不到
-v $pwd/test:/usr/local/tomcat2/webapps/examples:将主机中当前目录下的test挂载到容器的/test *但是挂载了好像没什么用,删除了-v访问一样的是tomcat默认界面
-d tomcat: 后台运行tomcat镜像
docker search XX
docker rm XX
一般情况下,我们在启动Docker容器的时候可以使用-v参数映射宿主机的文件或者目录到容器里,这样的话,在宿主机相关目录下的文件修改会自动在容器里生效。
但是,如果我们已经启动了一个容器的话,就只能使用下面的这种方式在容器和宿主机之间拷贝文件了。
docker ps 获取目标容器的ID或者容器的名称 # 我这里的是容器ID为52261df2fab6
docker inspect -f'{{.Id}}' 容器的ID # 获取容器的ID全名称
得到一串类似52261df2fab612b24b3502c4ad98c22aff70ce9fa641c5c9f735ac2415e92da3
cp /root/test.log /var/lib/docker/devicemapper/mnt/52261d...xxx/rootfs/root/ # 这样就把宿主机的test.log拷贝到容器的/root/目录下了。
# 说明:上面的这个方法在CentOS6.7通过yum安装的docker-io测试通过。我另一台测试机安装的是docker-engine,则根本没有/rootfs/这个目录。
最后,还有1个方法,就是在容器里面安装openssh-server和openssh-clients,然后通过scp的方式进行文件拷贝操作。但是docker官方不建议给docker使用ssh连接的方式去管理。
问题:
1.docker read tcp 50.17.62.194:443: connection reset by peer 镜像下载不下来需要配置国内服务器
由于国内特殊的网络环境,往往我们从Docker Hub中拉取镜像并不能成功,而且速度特别慢。
使用方法
修改Docker配置文件/etc/sysconfig/docker如下:
DOCKER_OPTS="--registry-mirror=http://aad0405c.m.daocloud.io"
使用service docker restart重启Docker服务即可。
那么我们可以给Docker配置一个国内的registry mirror,当我们需要的镜像在mirror中则直接返回,如果没有则从Docker Hub中拉取。是否使用registry mirror对Docker用户来说是透明的。
2.经过一小段的实践,感觉比较乱,想重新卸载安装,结果删除不了
*如果有container在运行的时候重启 docker 服务, 可能会导致 container无法启动, 错误信息类似于
Error response from daemon: Cannot start container zookeeper: Error getting container ddf1dd91bbf46dc648268327f8f7c6fffaf2f19cda5cf1d97fdc701016d4332c from driver devicemapper: Error mounting '/dev/mapper/docker-8:1-525372-ddf1dd91bbf46dc648268327f8f7c6fffaf2f19cda5cf1d97fdc701016d4332c' on '/var/lib/docker/devicemapper/mnt/ddf1dd91bbf46dc648268327f8f7c6fffaf2f19cda5cf1d97fdc701016d4332c': device or resource busy
2015/01/26 04:42:07 Error: failed to start one or more containers
或者
d2859bd1f84b: Error pulling image (latest) from xxxxxx, Driver devicemapper failed to create image rootfs e6158e7962db43274de40fc3db65ad64811d43fe342dea633df20639f5a4e3cd: device e6158e7962db43274de40fc3db65ad64811d43fe342dea633df20639f5a4e3cd already exists 43fe342dea633df20639f5a4e3cd already exists c049b2b: Download complete
e6158e7962db: Error downloading dependent layers
** 或者出现rm: cannot remove ‘/var/lib/docker/aufs‘: Device or resource busy
因为在建立容器的时候做了相应目录的挂载,没有卸载,所以Device or resource busy
解决方式是先找出没有umount的路径
cat /proc/mounts | grep "docker"
然后依次unmount
docker 问题
1.用zabbix_get -s x.x.x.x -k containers[all]显示下面信息,说是把zabbix添加进/etc/sudoers里就OK,结果不行,之后把/var/run/docker.sock的所属改为root:zabbix就好了
Get http:///var/run/docker.sock/v1.19/containers/json: dial unix /var/run/docker.sock: permission denied. Are you trying to connect to a TLS-enabled daemon without TLS?
2.修改/etc/sudoers
#Defaults requiretty
Defaults !visiblepw
root ALL=(ALL) ALL
zabbix ALL=(root) NOPASSWD:/usr/bin/docker,/usr/local/python27/bin/python,/usr/local/zabbix/scripts/docker_containers.py,/usr/local/zabbix/scripts/container.sh,/usr/local/za bbix/scripts/zabbix_monitor_docker.py
3.执行/usr/local/zabbix/scripts/docker_containers.py mytomcat ip失败显示docker.errors.APIError: 400 Client Error: Bad Request ("client is newer than server (client API version: 1.24, server API version: 1.19)")
用docker version查看client和server都是1.19的
i.用easy_install docker-py发现用的是新的这个文件
Adding docker-py 1.10.6 to easy-install.pth file
Using /usr/local/python27/lib/python2.7/site-packages
ii.删掉上面目录下的相关文件
rm /usr/local/python27/lib/python2.7/site-packages/docker_py-1.10.6.dist-info/ -rf
iii.重新easy_install docker-py 后成功
Adding docker-py 1.4.0 to easy-install.pth file
Using /usr/local/python27/lib/python2.7/site-packages/docker_py-1.4.0-py2.7.egg
[root@weblogic /usr/local/zabbix]# ./scripts/docker_containers.py mytomcat ip
172.17.0.1
查看平均负载 cat /proc/loadavg
在宿主机查看docker使用cpu、内存、网络、io情况
docker stats 容器名 或 docker stats 容器id