起因
我的开发环境需要一个python代码运行环境、reids服务和mysql服务。
由于以前,我的开发环境是mac,而CI和线上运行环境是centos,偶尔会出项本地单元测试跑不过,而CI可以过。这多半都是环境不一致导致的。
所以搭建完全相同的线上环境是很必要的。
这里要准备3个镜像:mysql:5.6、redis和pymicro(python 运行环境)。
1.使用host网络模式启动mysql容器和redis容器
docker run --net=host -p 3306:3306 -d --name mysql_5_6 -e MYSQL_ROOT_PASSWORD=toor333666 --restart=always mysql:5.7
docker run --net=host -p 6379:6379 -d --name redis --restart=always redis
注意:host网络模式,端口映射必须宿主机和容器端口号相同。
2.使用host网络模式启动pymicro容器
docker run --net=host -d --name dev_env_1 -it -v /Users/zioyi/code:/usr/code/ /pymicro /bin/bash
-v参数用于把宿主机文件挂载到容器中,这样才能在容器里跑单元测试。
正题
docker drivers
这样就完成了,是不是很简单,但是为什么容器【dev_env_1】能够访问容器【mysql】和【redis】?host网络模式又是什么?
我们来研究一下docker的网络配置(https://docs.docker.com/network/)
docker的多种网络模式是通过修改宿主机的iptables规则来实现。
docker提供了六种网络驱动来满足不同场景下的网络需求:
bridge:默认的网络驱动。常用于独立的容器群中内部通信,容器和宿主机的网络是隔离的。
host:移除了宿主机和容器群间的网络隔离。
overlay:提供多个docker守护进程管理的容器间的通信能力,包括swarm服务之间、swarm服务和独立容器群之间以及独立容器之间。
macvlan:允许你给容器分配一个MAC地址,让它作为一个物理网路装置。
none:无网络状态。
Network plugins:用户可自己安装第三方的docker网络插件。
总结
使用docker就好比达积木,每个容器都是形状各异的积木块,网络驱动是用来连接积木块的。
docker提供诸多网络驱动,使得其容器间的关联变得更加灵活,我们也要根据它的官方文档,学习不同网路驱动之间的特性以搭建出我们想要的docker城堡。