概念、集群、监控、排错
概述
C/S架构,在Ubuntu上使用go语言开发
核心技术lxc(Linux Container)
namespace (ns)隔离进程
cgroup(control groups)控制资源
资源利用率高,普通机器可以运行几百容器
存储:AUFS
网络模式:
一个容器一个服务,docker进程就是宿主机进程
退出容器如何服务不停止
如何运行多个服务
docker集群
1.弹性伸缩
2.跨可用区灾备
3.快速迭代部署回滚
daemon 英[ˈdi:mən] 守护进程
实现的效果
快速持续部署,秒级切换,快速恢复(零停机),自动化,
虚拟化kvm docker openstack
不停机发布更新回滚
1、标准统一的打包部署运行方案
2、历史版本控制
3、Image的重用
4、Image共享发布
5、集群
实现的效果一
1、在Windows下编辑源代码,在Docker容器中运行代码,在Windows的浏览器中看到运行结果,方便后续debug。
2、将开发完成的程序和运行环境一起打包制作成Docker的image,移交image给小伙伴运行或者直接发布到服务器上。
延伸思考:git分支
个人体会较深的两处优点:
1、 快速部署
传统的部署模式是:安装(包管理工具或者源码包编译)->配置->运行;
2、Docker的部署模式是:复制->运行。
可以保证线上与测试环境一致,计划以后上线就直接复制测试使用的docker容器)
docker三要素
仓库 - Docker registeries
镜像 - Docker images ,镜像采用了分层技术,构建的镜像大小,只有自身的大小,不包含父镜像的大小
容器 - Docker containers ,镜像通过 docker run命令运行成为容器
Docker三剑客
swarm [swɔ:m] 蜂群,一大群;
compose [kəmˈpəʊz] 编排
machine [məˈʃi:n] 机器
#machine
#创建虚拟机
docker-machine create --driver=virtualbox lixinjian
#查看Docker虚拟机在运行中。
docker-machine ls
docker-machine start default
docker-machine env
docker-machine env | Invoke-Expression
docker images
dockerfile
swarm
compose
pip install docker-compose
docker-compose.yml
docker-compose up -d name .
k8s
在一个文件compose.yml中定义一个多容器应用,然后使用一条命令docker-compose up -d来启动你的应用,完成一切准备工作。
- Docker 消灭不掉虚拟机
Docker并不是虚拟机的对等替代物,因为它要求你所有的容器共享相同的底层操作系统。这意味着,例如你不能在同一台服务器上同时运行 Windows 和 Linux 应用。
而且,随着 Docker 容器脱颖而出,它的安全隔离要弱于虚拟机,这也使得它成为某种多租户的不恰当的选择。
在 Docker 的核心是 Linux cgroups(控制组),提供计算和限制容器使用 CPU、内存、网络、磁盘资源数量的方法。这提供了一些虚拟化的好处,例如能
下面是docker容器技术和传统虚拟机技术的特性比较:
容器:启动速度秒级,硬盘使用一般为MB,单机支持上千个容器
虚拟机:启动速度分钟级,硬盘使用一般为GB,一般几十个
测试
docker run zookeeper echo "hello world
配置文件
/lib/systemd/system/docker.service
存放镜像和容器的目录
/var/lib/docker/overlay2
看底层driver
看配置文件
du -h --max-depth=1
5、容器间的通信
使用--link参数连接
假设机器上已经通过docker pull下载了mysql镜像和php-nginx镜像。
1、启动mysql容器,并命名为myDB
docker run --name myDB -e MYSQL_ROOT_PASSWORD=111111 -d mysql
2、启动php-nginx容器
docker run --name php-nginx --link myDB:mysql -p 8002:80 -d webdevops/php-nginx
--link myDB:mysql 就是告诉要创建的容器,要使用myDB这个容器,并且起了一个别名叫mysql。这样在新创建的容器里就可以使用“mysql”来连接myDb这个容器。
但这种通信方式有一个局限性,就是只有运行在同一台服务器上的容器间可以通信,想要跨服务器通信,就看下面的另一种连接方式。
通过宿主机端口连接
这种方式更简单更容易理解。在创建mysql容器的时候与宿主机建立端口映射:docker run --name myDB -p 3306:3306 -e MYSQL_ROOT_PASSWORD=111111 -d mysql.
这样,假如你的宿主机IP是127.0.0.1.那么你就可以在任何地方用127.0.0.1:3306来连接mysql容器。推荐使用这种方式,因为方便我们使用Navicat等数据库图形工具来连接。容器互通
跨主机互通:
cp 数据卷
进入容器:
创建镜像:
yum list docker
rpm -qa |grep docker
docker --version
#监控
systemctl status docker.service
docker ps
docker ps a
docker info
6、监控:如何获取容器运行时资源使用情况?
如何监控容器内应用?
docker info
docker status redis 状态监控
find / -name nginx
docker run -it --rm -p 8888:8888 -v /c/Users/tingting/dropbox/code:/root/opt/workspace -v /c/Users/tingting/dropbox/data:/root/data tingtinglu/caffe_mxnet
参数说明:
容器的使用有个单一职责的原则需要遵循:
运行多个容器,各个容器只完成一个单一的工作。进一步说,将服务容器化的过程就是基础构架SOA化的过程;这个过程一样面临很多问题与困难:
容器与容器之间如何发现与通信?如何只将特定的一部分容器暴露在公网或者内网环境下?
如何决定在哪运行以及运行多少个容器?
如何获取容器运行的日志与运行状态信息?
如何部署新的镜像?
容器崩溃时都发生了什么?
使用Kubernetes可以:
自动化容器的部署和复制
随时扩展或收缩容器规模
将容器组织成组,并且提供容器间的负载均衡
很容易地升级应用程序容器的新版本
提供容器弹性,如果容器失效就替换它,等等...
如何进入容器和网络的netns命名空间
利用ELK搭建Docker容器化应用日志中心
http://dockone.io/article/4817
docker 扩容
https://blog.csdn.net/lyj1101066558/article/details/50916904
看了近期开放的Docker镜像构建机制,实际存放images和container的地方就是/var/lib/docker/devicemapper/devicemapper目录下的metadata和data两个文件。
默认情况下Docker的存放位置为:
docker info | grep "Docker Root Dir"
阿里云docker方案
当用户的集群个数(所有地域累加)≤5 且每个集群的云服务器节点个数 ≤20,免收集群管理费用。
#创建虚拟机
docker run -it -h redis240 --name redis centos /bin/bash /usr/sbin/sshd –D
docker run -it --ipc=host -h=redis --name redis01 --net=none entel_base_image:withtt_oracle /usr/sbin/sshd –D
docker run -d --name redis205 -h redis205 --net tty --ip 172.16.2.205 -v /docker/data/redis/redis205:/data 172.16.3.200:5000/tty/redis:3.0.
排错
安装Nginx,port是这种状态是访问不了,下面的就可以,做端口映射
systemctl status docker
docker run hello-world
docker inspect [ɪnˈspekt]
#管理磁盘空间
docker system df
docker ps -h
#镜像大小
docker ps -s
安全
docker用户
Docker部署时如何添加生产环境中的配置文件
secret 英[ˈsi:krət]秘密
1)公共的配置服务(Zookeeper集群,Etcd集群也可以)然后在appsettings中,只需要配置集群地址就可以了。在程序启动的时候,会先把全局配置从配置服务中取出来,存储为静态对象。这样解决了,多镜像部署时,配置不同的问题,也避免了拷贝配置文件问题。
2)在Docker 1.13及更高版本中,Docker推出了Secrets管理,可以在Swarm mode集群中安全地管理密码、密钥证书等敏感信息,并允许在多个Docker容器实例之间共享访问指定的秘密信息。后来在实际时使用发现,当容器运行时,无法通过 docker secret rm 命令删除 secret :docker secrets 无法直接更新,只能删除后添加,但删除需要停止容器,这对于生产环境是不能接受的。如果不采用先删除后添加的方式,那只能每次更新时换一个secret名称,但这样编排文件也要跟着进行修改,很麻烦。
后来改用阿里云容器服务的NAS数据卷解决了这个问题,参考阿里云帮助文档:
2.如何在生产环境中进行docker的部署?部署前相比于传统的部署方式有哪些优缺点?
- 显示官方
docker search [包名] --filter "is-official=true" - 过滤热度
docker search [包名] --stars=3
-参考1,干货----
资源编排-方案决策
https://blog.51cto.com/breaklinux/2158942
-参考2----
docker容器故障致无法启动解决实例
https://blog.51cto.com/yangrong/1596212
https://segmentfault.com/a/1190000007955073 Windows下运用Docker部署Node.js开发环境
jenkins+docker+docker-compose完整发版流程
https://www.cnblogs.com/hh2737/p/7504277.html
Docker官方文档(docker-ce)
https://docs.docker.com/engine/installation/linux/docker-ce/centos/#install-using-the-repository
阿里云Docker CE 镜像源站
https://yq.aliyun.com/articles/110806?commentId=11066
清华开源镜像站点docker-ce安装帮助
https://mirrors.tuna.tsinghua.edu.cn/help/docker-ce/
Docker官方文档(v1.12)
https://docs.docker.com/v1.12/engine/installation/linux/centos/
docker无法正常启动http://blog.csdn.net/qq_35904833/article/details/74189383
“深入浅出”来解读Docker网络核心原理 https://blog.51cto.com/ganbing/2087598