上篇文章咱们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇咱们就来实战一个真实的项目,看看怎么在产线上来经过容器技术来运行咱们的项目,来达到学会容器间通讯以及docker-compose学习以及docker网络模型学习的目的。html
建立Todo应用,功能很简单,实现建立Task关联Task分类,以及更新Task的完成状态的功能。java
项目运行后的主界面以下:mysql
由于是使用git管理的maven java项目,因此须要首先在服务器上安装java、maven、git 三大件git
传送门:Centos7下Java开发基本环境搭建github
Git入门教程传送门:谈谈分布式版本管理工具Gitspring
接着把github上的项目源码clone到本地sql
git clone https://github.com/hafizzhang/mysql-spring-boot-todo.git
进入到项目根目录docker
cd mysql-spring-boot-todo
使用maven命令进行打包项目而且使用docker命令进行build镜像浏览器
mvn clean package docker:build
用容器启动mysql 5.6版本安全
docker run --name mysql -e MYSQL_ROOT_PASSWORD=password -e MYSQL_DATABASE=tododb -e MYSQL_USER=user -e MYSQL_PASSWORD=pass -d mysql:5.6
查看mysql日志输出,确保mysql服务启动没有问题
docker logs mysql (由于上步中咱们已经指定了运行mysql容器的名称为mysql,因此这里能够直接用容器名查看日志)
用容器启动todo镜像
docker run -p 8080:8080 --name todo -d hafiz/todo-demo:1.0.0
查看todo容器的日志,观察容器是否启动成功
docker logs todo
咱们会发现出现了如下错误:
这就说明了,同一个主机上的各个容器之间是相互隔离的,也就是他们直接不能直接相互访问,那咱们怎么解决这个问题呢?最简单的办法咱们能够直接在启动容器的时候指定--link参数把该容器连接到mysql容器上(虽然说这种方式已经官方已经不推荐,可是对于同一个主机的不一样容器间的通讯倒是最简单的,后面会介绍别的方式实现),这样咱们的目标容器todo就能够跟mysql源容器进行通讯了,来,说干就干
docker rm -f todo 首先删除已经存在的容器todo docker run -p 8080:8080 --name todo --link mysql -d hafiz/todo-demo:1.0.0
再查看todo容器启动的日志,发现能够成功启动了,而后打开浏览器输入主机ip:8080能够看到todo的运行主界面
咱们在todo主界面上添加一条记录,而后经过mysql容器进行查看已经添加的记录,以下:
docker exec -t -i mysql bash 进入到mysql容器 mysql -uuser -ppass 用户名为user,密码为pass select category, IF(complete,'true','false') complete, name from todo_item;
能够看到咱们保存的记录已经进到mysql中了
todo项目和mysql项目的启动后通讯模型以下:
那咱们上面已经经过link方式实现了todo容器能够访问相同主机的mysql容器,那么这种方式如何实现的呢?
咱们查看todo容器的/etc/hosts文件就会明白了,以下:
能够看出link的工做原理是在todo的hosts文件中写入mysql容器的地址信息
使用容器链接的好处
运行在同一主机的独立容器间能够相互通信
容器间创建一个安全通信隧道而不须要暴露容器的任何端口
为何须要使用Docker Compose管理多个容器
答:当多个容器相互之间须要通信时,手动配置容器间链接变得很是复杂,并且官方也已经不推荐使用了。
什么是Docker Compose
Docker Compose是一个定义和管理多个Docker容器的工具
它经过YAML文件定义Docker应用运行时的信息,如:端口、网络等。
使用Docker Compose,一个简单命令能够管理多个容器应用。
Docker Compose使用场景
快速构建开发环境
自动化测试环境
单一主机部署多个容器
安装Docker Compose
如何使用Docker Compose
定义构建各个镜像所需的Dockerfile文件
定义docker-compose.yml文件
在docker-compose.yml和Dockerfile文件所在的目录下,经过docker-compose up [-d]
启动docker-compose.yml 所定义的多个Docker应用
深刻了解Docker Compose
几个重要的Docker Compose命令
docker-compose up
启动YAML中定义的全部容器
docker-compose ps [-a]
查看[全部的]运行的容器
docker-compose logs containerId/containerName
查看运行的容器的日志
docker-compose stop containerId/containerName
中止运行的容器
docker-compose rm containerId/containername
删除已中止的容器
docker-compose build
从新建立全部的镜像
Tips
docker-compose只有在Docker镜像不存在的时候才建立镜像
更新Dockerfile后必定要执行docker-compose build从新建立镜像才能生效
docker daemon启动之后,会默认建立一个名称为docker0的网桥,容器默认状况下是经过这个docker0网桥来和主机进行通讯的。
docker网络模型有如下几种分类:
1. None网络模型
实现了最大限度的网络隔离
容器间不能经过网络通信提供服务或者提供网络服务
尽管None网络模型能够提供很是好的安全隔离,但其适用场景很是有限
2. Bridge网络模型(默认)
Bridge网络模型下默认有两个网络接口:loopback和eth0
同一主机上相同bridge网络的全部容器能够相互间通讯
同一主机上不一样bridge网络上全部容器间不能直接通信
不一样主机间bridge网络的容器不能直接通信
演示:
docker run --rm -d --net bridge --name c1 imageName:imageTag sleep 1000 docker run --rm -d --net bridge --name c2 imageName:imageTag sleep 1000 docker exec -ti c1 ping c2 ip 显示网络访问成功
3. Host网络模型(和主机共享网络)
Host网络安全性相对于其余网络模型如:None、Bridge较低
Host网络跟主机共享网络栈
全部主机可见的网络接口对以Host网络模型运行的容器都可见
容器间网络不具备隔离性
因为使用Host网络容器的请求无需通过docker0和Iptable的处理,它提供很是好的性能
演示:
docker run --rm -d --net host --name c1 imageName:imageTag sleep 1000 docker exec -ti c1 ping 主机ip
4. Overlay网络模型
支持多主机间容器直接通信
Swarm模式下使用overlay网络模型无需外部键值存储系统
非Swarm模式下使用overlay网络模型须要外部键值存储系统,如Consul等
docker network ls
产看当前全部的docker网络
docker network create [-d] network-name
建立指定驱动的网络
-d选项可选,用来指定建立网络使用的驱动类型,但好像只能建立bridge驱动的网络
docker network rm network-name
删除自定义网络
docker network inspect network-name
查看指定docker网络的信息
docker network connect network-name containerId/containerName
把指定的容器连接到指定的网络上
默认执行docker-compose时将建立新网络
新网络名字以docker-compose.yml当前所在目录名字跟默认driver的组合,好比当前目录为test,则docker-compose.yml不指定具体网络的时候,建立的网络名称为:test_default
能够建立自定义的网络,在docker-compose.yml中自定义networks,以下图的标注1
指定service使用特定的网络,以下图的标注2
咱们要想在产线去运行容器集群,那咱们首先须要COE(Container Orchestration Engine)工具。
1. COE的主要功能以下:
主机配置(Provisioning)
容器编排
自我修复
Scale up/down 容器
暴露服务给外界
服务发现
2. COE工具:
Docker Swarm Mode
原生集成Docker Engine的集群管理
去中心化的设计
声明式服务模型
Scale up/down 服务
支持多主机网络
服务发现
负载均衡
安全性高
支持滚动升级
Kubernates
Mesos/Marathon
高可用
支持有状态服务
支持多种容器引擎
服务发现和负载均衡
健康检测
事件订阅
丰富的API支持
容器调度约束
Hashicorp Nomad
简单且轻量级
多云支持
维护简单
支持混合工做负载
高可用
支持多区域多数据中心
3. COE选择的准则
抽象程度(Level of abstraction):支持混合仍是只支持基于容器的工做负载(Hybrid Workloads)
工具链(Tooling):编排工具相关生态圈,工具的集成程度
架构(Architecture): 是否支持高可用、高稳定性以及灾难恢复
4. 如何选择COE工具
是否支持企业DevOps框架和编排
是否提供丰富的API
集群支持主机数量大小
容器运行在什么平台?物理机、私有云仍是公有云?
是否具备自我修复功能
是否提供服务负载均衡
如何Provision容器
运维复杂性高低
是否支持混合工做负载
生态圈发展是否成熟
社区是否活跃
5. 监控及指标
经常使用监控工具
Sensu
Prometheus
Grafana
Influxdb
Telegraf
Zabbix
cAdvisor
Sysdig
6. 日志
EFK(Elasticsearch Fluentd Kibana)
ELK (Elasticsearch Logstash Kibana)
Graylog
经过本文,咱们就知道如何让同一主机上的不一样容器进行通信,如何进行docker 网络的管理,Docker的网络模型都有哪几种?如何在docker-compose.yml文件中自定义docker网络,如何给其中定义的service指定使用自定义的网络?如何在产线运行容器化服务?如何选择COE工具?以及容器化之后咱们要注意的地方。对于不一样主机间的容器通信,本文没有设计,之后有机会,咱们再来慢慢谈起。