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 或者更高版本。

emotion基本操作

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连接的方式去管理。

 

emotion问题:

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

 

emotiondocker 问题

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

posted @ 2017-10-23 21:34  独家小K  阅读(371)  评论(0编辑  收藏  举报