一,背景
上篇文章我们进行了 Docker 的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项目,来达到学会容器间通信以及 docker-compose 学习以及 docker 网络模型学习的目的.
二,项目描述
创建 Todo 应用,功能很简单,实现创建 Task 关联 Task 分类,以及更新 Task 的完成状态的功能.
项目运行后的主界面如下:
三,启动项目
因为是使用 git 管理的 maven java 项目,所以需要首先在服务器上安装 java,maven,git 三大件
JDK1.8 的安装教程传送门:
Maven 的安装教程传送门:
Git 安装直接使用以下命令:
yum -y install git
Git 入门教程传送门: http://www.cnblogs.com/hafiz/p/7472318.html
接着把 github 上的项目源码 clone 到本地
git clone https://github.com/hafizzhang/mysql-spring-boot-todo.git
进入到项目根目录
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 中了
四,使用 link 实现 Docker 容器间的通信的原理
todo 项目和 mysql 项目的启动后通信模型如下:那我们上面已经通过 link 方式实现了 todo 容器可以访问相同主机的 mysql 容器,那么这种方式如何实现的呢?我们查看 todo 容器的 / etc/hosts 文件就会明白了,如下:可以看出 link 的工作原理是在 todo 的 hosts 文件中写入 mysql 容器的地址信息
使用容器连接的好处
运行在同一主机的独立容器间可以相互通讯
容器间建立一个安全通讯隧道而不需要暴露容器的任何端口
五,使用 Docker Compose 管理多个容器
为什么需要使用 Docker Compose 管理多个容器答:当多个容器相互之间需要通讯时,手动配置容器间连接变得非常复杂,而且官方也已经不推荐使用了.什么是 Docker Compose
Docker Compose 是一个定义和管理多个 Docker 容器的工具
它通过 YAML 文件定义 Docker 应用运行时的信息,如:端口,网络等.
使用 Docker Compose,一个简单命令可以管理多个容器应用.
Docker Compose 使用场景
快速构建开发环境
自动化测试环境
单一主机部署多个容器
安装 Docker Compose
官方的安装方式
sudo curl -L https://github.com/docker/compose/releases/download/1.18.0/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose 给docker-compose执行权限
docker-compose --version 测试安装是否成功,成功的话打印出docker-compose的版本信息
这种方式貌似需要 FQ 能连接到外网
使用 python-pip 进行安装 传送门: https://www.cnblogs.com/YatHo/p/7815400.html 如果在文中的第 4 步
pip install - upgrade pip
和安装 docker-compose 出现
There was a problem confirming the ssl certificate: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed(_ssl.c: 590)
错误,解决办法如下:
安装完成以后可以使用
pip install -upgrade pip --trusted-host pypi.python.org
pip install -U docker-compose --trusted-host pypi.python.org
docker - compose--version
来测试安装是否成功
如何使用 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 网络模型
docker daemon 启动以后,会默认创建一个名称为 docker0 的网桥,容器默认情况下是通过这个 docker0 网桥来和主机进行通信的.docker 网络模型有以下几种分类:1. None 网络模型
实现了最大限度的网络隔离
容器间不能通过网络通讯提供服务或者提供网络服务
尽管 None 网络模型可以提供非常好的安全隔离,但其适用场景非常有限
2. Bridge 网络模型 (默认)
Bridge 网络模型下默认有两个网络接口:loopback 和 eth0
同一主机上相同 bridge 网络的所有容器可以相互间通信
同一主机上不同 bridge 网络上所有容器间不能直接通讯
不同主机间 bridge 网络的容器不能直接通讯
演示:
docker exec -ti c1 ping c2 ip 显示网络访问成功
docker run --rm -d --net bridge --name c1 imageName:imageTag sleep 1000
docker run --rm -d --net bridge --name c2 imageName:imageTag sleep 1000
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 网络管理命令
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 时将创建新网络
新网络名字以 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. 监控及指标常用监控工具
6. 日志
Sensu
Prometheus
Grafana
Influxdb
Telegraf
Zabbix
cAdvisor
Sysdig
九,总结
EFK(Elasticsearch Fluentd Kibana)
ELK (Elasticsearch Logstash Kibana)
Graylog
通过本文,我们就知道如何让同一主机上的不同容器进行通讯,如何进行 docker 网络的管理,Docker 的网络模型都有哪几种?如何在 docker-compose.yml 文件中自定义 docker 网络,如何给其中定义的 service 指定使用自定义的网络?如何在产线运行容器化服务?如何选择 COE 工具?以及容器化以后我们要注意的地方.对于不同主机间的容器通讯,本文没有设计,以后有机会,我们再来慢慢谈起.
来源: http://www.bubuko.com/infodetail-2458187.html