上篇文章我们进行了Docker的快速入门,基本命令的讲解,以及简单的实战,那么本篇我们就来实战一个真实的项目,看看怎么在产线上来通过容器技术来运行我们的项目,来达到学会容器间通信以及docker-compose学习以及docker网络模型学习的目的。
git clone https://github.com/hafizzhang/mysql-spring-boot-todo.git
cd mysql-spring-boot-todo
mvn clean package docker:build
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
docker logs mysql (因为上步中我们已经指定了运行mysql容器的名称为mysql,所以这里可以直接用容器名查看日志)
docker run -p 8080:8080 --name todo -d hafiz/todo-demo:1.0.0
这就说明了,同一个主机上的各个容器之间是相互隔离的,也就是他们直接不能直接相互访问,那我们怎么解决这个问题呢?最简单的办法我们可以直接在启动容器的时候指定--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的运行主界面
docker logs todo
docker exec -t -i mysql bash 进入到mysql容器
mysql -uuser -ppass 用户名为user,密码为pass
select category, IF(complete,'true','false') complete, name from todo_item;
todo项目和mysql项目的启动后通信模型如下:
那我们上面已经通过link方式实现了todo容器可以访问相同主机的mysql容器,那么这种方式如何实现的呢?
我们查看todo容器的/etc/hosts文件就会明白了,如下:
可以看出link的工作原理是在todo的hosts文件中写入mysql容器的地址信息
使用容器连接的好处
为什么需要使用Docker Compose管理多个容器
答:当多个容器相互之间需要通讯时,手动配置容器间连接变得非常复杂,而且官方也已经不推荐使用了。
什么是Docker Compose
Docker Compose使用场景
安装Docker Compose
如何使用Docker Compose
docker-compose up [-d]
启动docker-compose.yml 所定义的多个Docker应用
深入了解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
重新创建所有的镜像
docker daemon启动以后,会默认创建一个名称为docker0的网桥,容器默认情况下是通过这个docker0网桥来和主机进行通信的。
docker网络模型有以下几种分类:
1. None网络模型
2. 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网络模型(和主机共享网络)
docker run --rm -d --net host --name c1 imageName:imageTag sleep 1000
docker exec -ti c1 ping 主机ip
4. Overlay网络模型
Docker网络管理命令
docker network ls
产看当前所有的docker网络
docker network create [-d] network-name
创建指定驱动的网络
docker network rm network-name
删除自定义网络
docker network inspect network-name
查看指定docker网络的信息
docker network connect network-name containerId/containerName
把指定的容器链接到指定的网络上
我们要想在产线去运行容器集群,那我们首先需要COE(Container Orchestration Engine)工具。
1. COE的主要功能如下:
2. COE工具:
3. COE选择的准则
4. 如何选择COE工具
5. 监控及指标
常用监控工具
6. 日志
通过本文,我们就知道如何让同一主机上的不同容器进行通讯,如何进行docker 网络的管理,Docker的网络模型都有哪几种?如何在docker-compose.yml文件中自定义docker网络,如何给其中定义的service指定使用自定义的网络?如何在产线运行容器化服务?如何选择COE工具?以及容器化以后我们要注意的地方。对于不同主机间的容器通讯,本文没有设计,以后有机会,我们再来慢慢谈起。